From 8feadb21448a3032e7a188ba22bd3ad08eb80953 Mon Sep 17 00:00:00 2001 From: tianlongdevcode Date: Thu, 30 Oct 2025 20:14:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Fixed=20synchronize=20openharmony=20sample?= =?UTF-8?q?=20include=20UIExtensionAndAccessibility=E3=80=81Watch=E3=80=81?= =?UTF-8?q?GestureConflict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: https://gitee.com/harmonyos_samples/guide-snippets/issues/ID4AG2 Description: isues ID4AG2 is synchronize openharmony sample Signed-off-by: chenbosongcode --- ArkUIKit/wrapbuilder/AppScope/app.json5 | 24 +++ .../resources/base/element/string.json | 8 + .../resources/base/media/background.png | Bin 0 -> 91942 bytes .../resources/base/media/foreground.png | Bin 0 -> 15325 bytes .../resources/base/media/layered_image.json | 7 + ArkUIKit/wrapbuilder/README.md | 126 +++++++++++++ ArkUIKit/wrapbuilder/build-profile.json5 | 57 ++++++ ArkUIKit/wrapbuilder/code-linter.json5 | 46 +++++ .../wrapbuilder/entry/build-profile.json5 | 47 +++++ ArkUIKit/wrapbuilder/entry/hvigorfile.ts | 20 +++ .../wrapbuilder/entry/obfuscation-rules.txt | 23 +++ ArkUIKit/wrapbuilder/entry/oh-package.json5 | 24 +++ .../main/ets/entryability/EntryAbility.ets | 62 +++++++ .../entrybackupability/EntryBackupAbility.ets | 30 ++++ .../entry/src/main/ets/pages/Index.ets | 61 +++++++ .../src/main/ets/pages/PageComponentV2.ets | 43 +++++ .../entry/src/main/ets/pages/PageFive.ets | 55 ++++++ .../entry/src/main/ets/pages/PageFour.ets | 43 +++++ .../entry/src/main/ets/pages/PageOne.ets | 104 +++++++++++ .../entry/src/main/ets/pages/PageThree.ets | 55 ++++++ .../entry/src/main/ets/pages/PageTwo.ets | 39 ++++ .../wrapbuilder/entry/src/main/module.json5 | 64 +++++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 16 ++ .../main/resources/base/media/background.png | Bin 0 -> 91942 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 8805 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 11 ++ .../main/resources/dark/element/color.json | 8 + .../entry/src/mock/mock-config.json5 | 16 ++ .../src/ohosTest/ets/test/Ability.test.ets | 49 ++++++ .../src/ohosTest/ets/test/Index.test.ets | 166 ++++++++++++++++++ .../entry/src/ohosTest/ets/test/List.test.ets | 21 +++ .../entry/src/ohosTest/module.json5 | 25 +++ .../entry/src/ohosTest/ohosTest.md | 7 + .../wrapbuilder/entry/src/test/List.test.ets | 19 ++ .../entry/src/test/LocalUnit.test.ets | 47 +++++ .../wrapbuilder/hvigor/hvigor-config.json5 | 37 ++++ ArkUIKit/wrapbuilder/hvigorfile.ts | 20 +++ ArkUIKit/wrapbuilder/oh-package.json5 | 24 +++ .../wrapbuilder/screenshots/PageIndex.png | Bin 0 -> 39022 bytes ArkUIKit/wrapbuilder/screenshots/PageOne.png | Bin 0 -> 40088 bytes .../wrapbuilder/screenshots/PageThree.png | Bin 0 -> 31948 bytes 46 files changed, 1430 insertions(+) create mode 100644 ArkUIKit/wrapbuilder/AppScope/app.json5 create mode 100644 ArkUIKit/wrapbuilder/AppScope/resources/base/element/string.json create mode 100644 ArkUIKit/wrapbuilder/AppScope/resources/base/media/background.png create mode 100644 ArkUIKit/wrapbuilder/AppScope/resources/base/media/foreground.png create mode 100644 ArkUIKit/wrapbuilder/AppScope/resources/base/media/layered_image.json create mode 100644 ArkUIKit/wrapbuilder/README.md create mode 100644 ArkUIKit/wrapbuilder/build-profile.json5 create mode 100644 ArkUIKit/wrapbuilder/code-linter.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/build-profile.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/hvigorfile.ts create mode 100644 ArkUIKit/wrapbuilder/entry/obfuscation-rules.txt create mode 100644 ArkUIKit/wrapbuilder/entry/oh-package.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/Index.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageComponentV2.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFive.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFour.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageOne.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageThree.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageTwo.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/module.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/color.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/float.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/string.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/background.png create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/foreground.png create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/layered_image.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/startIcon.png create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/backup_config.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/main/resources/dark/element/color.json create mode 100644 ArkUIKit/wrapbuilder/entry/src/mock/mock-config.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Index.test.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/ohosTest/module.json5 create mode 100644 ArkUIKit/wrapbuilder/entry/src/ohosTest/ohosTest.md create mode 100644 ArkUIKit/wrapbuilder/entry/src/test/List.test.ets create mode 100644 ArkUIKit/wrapbuilder/entry/src/test/LocalUnit.test.ets create mode 100644 ArkUIKit/wrapbuilder/hvigor/hvigor-config.json5 create mode 100644 ArkUIKit/wrapbuilder/hvigorfile.ts create mode 100644 ArkUIKit/wrapbuilder/oh-package.json5 create mode 100644 ArkUIKit/wrapbuilder/screenshots/PageIndex.png create mode 100644 ArkUIKit/wrapbuilder/screenshots/PageOne.png create mode 100644 ArkUIKit/wrapbuilder/screenshots/PageThree.png diff --git a/ArkUIKit/wrapbuilder/AppScope/app.json5 b/ArkUIKit/wrapbuilder/AppScope/app.json5 new file mode 100644 index 000000000..297fa8372 --- /dev/null +++ b/ArkUIKit/wrapbuilder/AppScope/app.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 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.samples.wrapbuilder", + "vendor": "samples", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:layered_image", + "label": "$string:app_name" + } +} diff --git a/ArkUIKit/wrapbuilder/AppScope/resources/base/element/string.json b/ArkUIKit/wrapbuilder/AppScope/resources/base/element/string.json new file mode 100644 index 000000000..37dd2449e --- /dev/null +++ b/ArkUIKit/wrapbuilder/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "wrapbuilder" + } + ] +} diff --git a/ArkUIKit/wrapbuilder/AppScope/resources/base/media/background.png b/ArkUIKit/wrapbuilder/AppScope/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f GIT binary patch literal 91942 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 M;JyCV_snDe2la%mzyJUM literal 0 HcmV?d00001 diff --git a/ArkUIKit/wrapbuilder/AppScope/resources/base/media/layered_image.json b/ArkUIKit/wrapbuilder/AppScope/resources/base/media/layered_image.json new file mode 100644 index 000000000..fb4992044 --- /dev/null +++ b/ArkUIKit/wrapbuilder/AppScope/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/README.md b/ArkUIKit/wrapbuilder/README.md new file mode 100644 index 000000000..542772546 --- /dev/null +++ b/ArkUIKit/wrapbuilder/README.md @@ -0,0 +1,126 @@ +# com.samples.wrapbuilder + +## 介绍 + +当在一个struct内使用多个全局@Builder函数实现UI的不同效果时,代码维护将变得非常困难,且页面不够整洁。此时,可以使用wrapBuilder封装全局@Builder。 + +在阅读本文档前,建议阅读:@Builder。 + +在@ComponentV2装饰的自定义组件中,开发者仅可以使用状态变量装饰器,包括@Local、@Param、@Once@Event、@Provider、@Consumer等。 + +@ComponentV2装饰的自定义组件暂不支持LocalStorage等现有自定义组件的能力。 + +无法同时使用@ComponentV2与@Component装饰同一个struct结构。 + +@ComponentV2支持一个可选的boolean类型参数freezeWhenInactive,来实现组件冻结功能。 + +说明 +从API version 11开始使用。 + +从API version 12开始,wrapBuilder支持在元服务中使用。 + +[@ComponentV2装饰器](https://gitcode.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/state-management/arkts-new-componentV2.md)。 + +[wrapBuilder:封装全局@Builder](https://gitcode.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/state-management/arkts-wrapBuilder.md)。 + +## 效果预览 +| 首页 | CustomDialogController_CAPI页面 |OpenCustomDialog_CAPI页面 | +| ---------------------------------------------------- |---------------------------------------------------------| ------------------------------------------------------- | +| | | | + + +## 使用说明 + +1. 安装编译生成的hap包,并打开应用; +2. 首页面会出现示例界面; + +## 工程目录 + +``` +wrapbuilder +│ + src + ├── main + │   ├── ets + │   │   ├── entryability + │   │   │   └── EntryAbility.ets + │   │   ├── entrybackupability + │   │   │   └── EntryBackupAbility.ets + │   │   └── pages + │   │   ├── Index.ets + │   │   └── PageComponentV2.ets //示例:@ComponentV2装饰器:自定义组件 + │   │   ├── PageFive.ets //示例5:重复定义wrapBuilder失效 + │   │   ├── PageFour.ets //示例4:引用传递 + │   │   ├── PageOne.ets //示例1:wrapBuilder是一个模板函数,返回一个WrappedBuilder对象 + │   │   ├── PageThree.ets //示例3:@Builder方法赋值给变量在UI语法中使用 + │   │   └── PageTwo.ets //示例2:@Builder方法赋值给变量 + │   ├── module.json5 + │   └── resources + │   ├── base + │   │   ├── element + │   │   │   ├── color.json + │   │   │   ├── float.json + │   │   │   └── string.json + │   │   ├── media + │   │   │   ├── background.png + │   │   │   ├── foreground.png + │   │   │   ├── layered_image.json + │   │   │   └── startIcon.png + │   │   └── profile + │   │   ├── backup_config.json + │   │   └── main_pages.json + │   ├── dark + │   │   └── element + │   │   └── color.json + │   └── rawfile + ├── mock + │   └── mock-config.json5 + ├── ohosTest + │   ├── ets + │   │   └── test + │   │   ├── Ability.test.ets + │   │   └── List.test.ets + │   └── module.json5 + └── test + ├── List.test.ets + └── LocalUnit.test.ets + + +``` + +## 具体实现 + +1. 基础封装:用wrapBuilder包装包装全局 +包装全局@Builder函数,返回WrappedBuilder对象赋值给变量,通过对象的builder属性在组件中调用,解决全局@Builder直接赋值后无法使用的问题。 +2. 数组管理:将多个同参数类型的WrappedBuilder对象存入数组,在组件中通过ForEach遍历调用,实现多@Builder批量渲染,保持代码整洁。 +3. 状态联动:向WrappedBuilder包装的@Builder传递引用类型参数(如类实例),修改状态变量关联的实例属性时,可触发@Builder内 UI 自动刷新。 +4. 避坑要点:同一WrappedBuilder变量重复赋值新的wrapBuilder实例无效,需通过状态变量控制不同WrappedBuilder的显示逻辑实现动态切换。 +5. 用@ComponentV2(API 12+)装饰自定义组件,仅可使用@Local/@Param/@Once/@Event/@Provider/@Consumer等 V2 版状态装饰器,无法使用旧版装饰器及LocalStorage等能力,且不可与@Component同装饰一个 struct。 +6. 可给@ComponentV2传可选 boolean 参数freezeWhenInactive实现组件冻结,组件基础结构含struct声明与build方法,除特殊限制外,行为与@Component装饰的组件基本一致,混合使用需参考专用混用文档。 +## 相关权限 + +不涉及 + +## 依赖 + +不涉及 + +## 约束和限制 + +1. 本示例支持标准系统上运行,支持设备:RK3568等; + +2. 本示例支持API20版本SDK,版本号:6.0.0.36; + +3. 本示例已支持使DevEco Studio 6.0.0.848 (构建版本:6.0.0.848,构建 2025年10月17日)编译运行 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/DocsSample/ArkUISample/wrapbuilder > .git/info/sparse-checkout +git remote add origin https://gitcode.com/openharmony/applications_app_samples.git +git pull origin master +``` diff --git a/ArkUIKit/wrapbuilder/build-profile.json5 b/ArkUIKit/wrapbuilder/build-profile.json5 new file mode 100644 index 000000000..3ca5a93fb --- /dev/null +++ b/ArkUIKit/wrapbuilder/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 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": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": "6.0.0(20)", + "compatibleSdkVersion": "6.0.0(20)", + "targetSdkVersion": "6.0.0(20)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/code-linter.json5 b/ArkUIKit/wrapbuilder/code-linter.json5 new file mode 100644 index 000000000..5c4682f81 --- /dev/null +++ b/ArkUIKit/wrapbuilder/code-linter.json5 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2025 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. + */ +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@security/no-unsafe-aes": "error", + "@security/no-unsafe-hash": "error", + "@security/no-unsafe-mac": "warn", + "@security/no-unsafe-dh": "error", + "@security/no-unsafe-dsa": "error", + "@security/no-unsafe-ecdsa": "error", + "@security/no-unsafe-rsa-encrypt": "error", + "@security/no-unsafe-rsa-sign": "error", + "@security/no-unsafe-rsa-key": "error", + "@security/no-unsafe-dsa-key": "error", + "@security/no-unsafe-dh-key": "error", + "@security/no-unsafe-3des": "error" + } +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/build-profile.json5 b/ArkUIKit/wrapbuilder/entry/build-profile.json5 new file mode 100644 index 000000000..9016faf39 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/build-profile.json5 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 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", + "buildOption": { + "resOptions": { + "copyCodeResource": { + "enable": false + } + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/hvigorfile.ts b/ArkUIKit/wrapbuilder/entry/hvigorfile.ts new file mode 100644 index 000000000..f8b117a17 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 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 { 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. */ +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/obfuscation-rules.txt b/ArkUIKit/wrapbuilder/entry/obfuscation-rules.txt new file mode 100644 index 000000000..272efb6ca --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/oh-package.json5 b/ArkUIKit/wrapbuilder/entry/oh-package.json5 new file mode 100644 index 000000000..10cda399b --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/oh-package.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 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. + */ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/entryability/EntryAbility.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 000000000..98182799d --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 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, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + try { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + } catch (err) { + hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err)); + } + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 000000000..4ce6449f0 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 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 { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +const DOMAIN = 0x0000; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(DOMAIN, 'testTag', 'onBackup ok'); + await Promise.resolve(); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(DOMAIN, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + await Promise.resolve(); + } +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/Index.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/Index.ets new file mode 100644 index 000000000..a0081a4cf --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 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 Ary { + path:string, + name:string +} +@Entry +@Component +struct Index { + ary:Ary[]=[ + { + name:'PageOne', + path:'pages/PageOne' + }, + { + name:'PageTwo', + path:'pages/PageTwo' + }, + { + name:'PageThree', + path:'pages/PageThree' + }, + { + name:'PageFour', + path:'pages/PageFour' + }, + { + name:'PageFive', + path:'pages/PageFive' + }, + { + name:'PageComponentV2', + path:'pages/PageComponentV2' + }, + ] + build() { + Scroll() { + Column({ space: 10 }) { + ForEach(this.ary,(item:Ary)=>{ + Button(item.name) + .onClick(() => this.getUIContext().getRouter().pushUrl({ url: item.path })) + },(item:Ary)=>item.name) + } + .width('100%') + } + } +} diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageComponentV2.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageComponentV2.ets new file mode 100644 index 000000000..c84a877fd --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageComponentV2.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 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, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +// [Start ComponentV2_page_componentV2] +@Entry +@ComponentV2 +struct ComponentV2Test { + @Local message: string = 'Hello World'; + build() { + RelativeContainer() { + Text(this.message) + .id('HelloWorld') + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .alignRules({ + center: { anchor: '__container__', align: VerticalAlign.Center }, + middle: { anchor: '__container__', align: HorizontalAlign.Center } + }) + .onClick(() => { + this.message = 'Welcome'; + }) + } + .height('100%') + .width('100%') + } +} +// [End ComponentV2_page_componentV2] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFive.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFive.ets new file mode 100644 index 000000000..16e5726f1 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFive.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start wrapbuilder_page_five] +@Builder +function myBuilderFirst(value: string, size: number) { + Text('MyBuilderFirst:' + value) + .fontSize(size) +} + +@Builder +function myBuilderSecond(value: string, size: number) { + Text('MyBuilderSecond:' + value) + .fontSize(size) +} + +interface BuilderModel { + globalBuilder: WrappedBuilder<[string, number]>; +} + +@Entry +@Component +struct testBuilderIndex { + @State message: string = 'Hello World'; + @State builderObj: BuilderModel = { globalBuilder: wrapBuilder(myBuilderFirst) }; + + aboutToAppear(): void { + setTimeout(() => { + // wrapBuilder(myBuilderSecond) 不会生效 + this.builderObj.globalBuilder = wrapBuilder(myBuilderSecond); + }, 1000); + } + + build() { + Row() { + Column() { + this.builderObj.globalBuilder.builder(this.message, 20) + } + .width('100%') + } + .height('100%') + } +} +// [End wrapbuilder_page_five] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFour.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFour.ets new file mode 100644 index 000000000..fbbbae6b0 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageFour.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start wrapbuilder_page_four] +class Tmp { + public paramA2: string = 'hello'; +} + +@Builder +function overBuilder(param: Tmp) { + Column() { + Text(`wrapBuildervalue:${param.paramA2}`) + } +} + +const wBuilder: WrappedBuilder<[Tmp]> = wrapBuilder(overBuilder); + +@Entry +@Component +struct Parent { + @State label: Tmp = new Tmp(); + + build() { + Column() { + wBuilder.builder({ paramA2: this.label.paramA2 }) + Button('Click me').onClick(() => { + this.label.paramA2 = 'ArkUI'; + }) + } + } +} +// [End wrapbuilder_page_four] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageOne.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageOne.ets new file mode 100644 index 000000000..2de2b6b23 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageOne.ets @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2025 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. + */ + +/* + * 基于 wrapBuilder 和 WrappedBuilder 的简单页面示例 + * 功能:展示包装后的 @Builder 方法调用及动态更新 + */ +// [Start wrapbuilder_page_one] +declare function wrapBuilder(builder: (...args: Args) => void): WrappedBuilder; + +// 1. 全局 @Builder 方法(符合 wrapBuilder 全局限制) +@Builder +function simpleTextBuilder(content: string, size: number) { + Text(content) + .fontSize(size) + .fontColor('#333') + .padding(5); +} + +@Builder +function simpleButtonBuilder(text: string, bgColor: string) { + Button(text) + .fontSize(14) + .backgroundColor(bgColor) + .padding({ left: 15, right: 15, top: 6, bottom: 6 }) + .borderRadius(4); +} + +// 2. 用 wrapBuilder 包装全局 @Builder,定义数组 +let wrappedText: WrappedBuilder<[string, number]> = wrapBuilder(simpleTextBuilder); +let wrappedBtn1: WrappedBuilder<[string, string]> = wrapBuilder(simpleButtonBuilder); +let wrappedBtn2: WrappedBuilder<[string, string]> = wrapBuilder(simpleButtonBuilder); +const buttonBuilders: WrappedBuilder<[string, string]>[] = [wrappedBtn1, wrappedBtn2]; + +// 3. 主页面组件(@Entry 必须有单一根容器) +@Entry +@Component +struct WrapBuilderSimplePage { + // 动态数据(用 @State 管理状态更新) + @State info: string = 'initial information'; + @State textSize: number = 16; + + build() { + // 唯一根容器:所有子组件必须嵌套在这个 Column 内部 + Column({ space: 20 }) { + // 1. 标题(子组件,正确嵌套在根 Column 内) + Text('wrapBuilder simple example') + .fontSize(20) + .fontWeight('bold') // 用字符串避免枚举问题 + .margin({ bottom: 10 }); + + // 2. 包装后的文本展示(子组件,嵌套在根 Column 内) + Column() { + Text('Display of wrapped text:') + .fontSize(14) + .fontColor('#666') + .margin({ bottom: 8 }); + + wrappedText.builder(this.info, this.textSize); + } + .padding(10) + .backgroundColor('#f0f0f0') + .borderRadius(6); + + // 3. 交互按钮(子组件,嵌套在根 Column 内) + Row({ space: 15 }) { + // 按钮1:修改内容 + Column() { + buttonBuilders[0].builder('modify the content', '#4e5969'); + } + .onClick(() => { + this.info = 'the updated content'; + this.textSize = 18; + }); + + // 按钮2:重置 + Column() { + buttonBuilders[1].builder('reset', '#f56c6c'); + } + .onClick(() => { + this.info = 'initial information'; + this.textSize = 16; + }); + } + } + // 根 Column 的属性(紧跟在根容器代码块之后) + .width('100%') + .height('100%') + .padding(20) + } // 闭合 build() 方法 +} // 闭合 struct 组件 +// [End wrapbuilder_page_one] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageThree.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageThree.ets new file mode 100644 index 000000000..cddd1a2bb --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageThree.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start wrapbuilder_page_three] +@Builder +function myBuilder0(value: string, size: number) { + Text(value) + .fontSize(size) + .fontColor(Color.Blue) +} + +@Builder +function yourBuilder(value: string, size: number) { + Text(value) + .fontSize(size) + .fontColor(Color.Pink) +} + +const builderArr: WrappedBuilder<[string, number]>[] = [wrapBuilder(myBuilder0), wrapBuilder(yourBuilder)]; + + +@Entry +@Component +struct TestBuilderItem { + @Builder + testBuilder() { + ForEach(builderArr, (item: WrappedBuilder<[string, number]>) => { + item.builder('Hello World', 30) + } + + ) + } + + build() { + Row() { + Column() { + this.testBuilder() + } + .width('100%') + } + .height('100%') + } +} +// [End wrapbuilder_page_three] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageTwo.ets b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageTwo.ets new file mode 100644 index 000000000..f1acede92 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/ets/pages/PageTwo.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start wrapbuilder_page_two] +@Builder +function myBuilder(value: string, size: number) { + Text(value) + .fontSize(size) +} + +let globalBuilder: WrappedBuilder<[string, number]> = wrapBuilder(myBuilder); + +@Entry +@Component +struct TestIndex { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + globalBuilder.builder(this.message, 50) + } + .width('100%') + } + .height('100%') + } +} +// [End wrapbuilder_page_two] \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/module.json5 b/ArkUIKit/wrapbuilder/entry/src/main/module.json5 new file mode 100644 index 000000000..476f4f508 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/module.json5 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2025 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" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "ohos.want.action.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ], + } + ] + } +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/color.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/color.json new file mode 100644 index 000000000..3c712962d --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/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/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/float.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/float.json new file mode 100644 index 000000000..a0a93dd91 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/string.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..f94595515 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/background.png b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f GIT binary patch literal 91942 zcma%jXIK;3mNp0q9;J9tQ6L}(1shFzC_yJ4lDn zMF~o;fk0?MN&s@*G$N*V-pj#% zc8%$pJKu3H6B9PCPuxW2f19*Z$HpUUF(3}g7#RA-OX&8^G6)=p#i`)Dwb3Nq8~qFn z<^fU=`t_De-dZt2UTFpm04@e4TEsxg1E>YY7Az(HB;|?ti3gVq33;UuoLwdZwaGAv z)BE$Ei{3EL!}7;J7f*)>%m4pcxFd_P_m2-Ym9Z%ej=O?&A8%5Q1~0Zm`)oxAEhEn* zq2oE4oF)6o2I|Fpq^)*F&F&`ru81qZLuc*j^>C5>P>|jIS|}3X4#)eG^57s9%6*|3|F;x+jqe=h|lyO425fl z6@cI6z>Hyv5uXtYX#y5k0aI_<_dNiVmwZCL?}ObbXPW8*%1=@B)oy#Y%c~4;8%x`a z%D9RB*Iq(EEN}n0)L0~$o82*;j0iF5PRBnE(CyzU=FS%kpKs`5BPyC~KTl;`htI!t zg56!(Boib)BOTAg0FZU*rL05 zkM$puN+9YiW1b0?zq55yMGvG?k+9e^uNu~T%kN{~pwPex$^-7uU|Z?^6m0nUP~^cL z%T(GXMmC)6oU}w0XN34`VHWH#pzq#0-s~`${^BQ zGsp)>*KTj;c9}KpOro`uZYH__;b_ah6KQy43luufrM8tsB=2Fb6I(~)N47qQoe5AH zN_#q|RJ@sun6ZN!7{dB=f0HyYic^KI7cK~{HM)rNVY8{r#uumMPyA{ZLnoNqe5X^Q z9<_t4n>rJ!2Zm{Zm7rROaRCQUoEqGGU*Nt;_0LKIjaL^VAOL>XBhmT9DoG(?;~8Ax zV-w6KHM^z;H6BT~^5oo+VsD-jS@TU9~{}5`3m{qUsnvy!h7yNmLCh9<-ZPVhE4O&CHSSRtrbIp!3fxTddggiU;0|Q zSRv=4Mu{Q?)=Y=)peNckC&Bw6i5&6R+Z;z{0N4~ImXWTmk ziTDk*hHBCW&#>pH4RA7V)<0G}$KR5M=9!SUJq(%a2~v@VnGMq$5Pgv+A`Qg2I}sUn zl&;Sxou_%;KZA1*k8fBBTB44p8nn`hW|4))1%(?z#;LdRItfmRMDm8ft5#DXZ|nMZ zEJ0NW`+XMf(n$HoyvzPh8QR5l4}c?n9pQ2#Rc+mEQT|PCEuO^BM{%ofCqj|8WxjqD zhLu5r<`NXQi*V%0lU*&9H2vF;3V{aqDDNJB5FV&R#T;Ko11nzD(hV97(fO~fNtMJ# zVSD!fdNW%bzuH-cIx~g1E%`W3`okpJf`Jvt{mm?FIo=IlpkZLLzcI7uERy1%xA3W7 zN5oayee1(qp_re~+GqO7DGji8R?Ou+B8xatq_TYlmV)nSHeB=KD?H+N{aVsk{smEh*qZeJ z))M#Y+iCG1+v9Vjh;NK|)^I-h&1<8ss#LY=%HHUfe$n)L1gzbr5@RYy77qV_-p*sO z(vx79H1@rk7pm)+s==EHddT)b(|76W)l^u^fLJY`7N-3f9h41;xg+w1JeMO@z^WHJ zu^~jzE|&DU7y|(`@A8PQG-c>q_Y6WHqf6+4C1QJ73VDy6w?TOj(%mDP!bgVkNG8Hh zzcmwnNnka8bZQ(Z<=i!Y@=C?_6J*tLe|0r>2Gdp!#iqDIUw^UmKuqLG97QbF&7q8+Bwr%v!=i@ly^ZOX}PD;Vr^ zTyljDx$VWI>o$@??c(-fVG-EobYv05?LZZ{-_o1Q`sWomwcFgB=hYZ@I^Oi~c`gLU zO&Z+3oaJeW9*)&5*z%`KU;|G^-t;OGn}wL#dOGZ|0TC@n@K<5U{`5iE)n~KDe0h*| zK#S6KaG+2>7}_$C`$b>X6+jx2*>4y$U^6BNmBT~V|8L}t1_V{Yu?Ck)-JZ+#FLk}R_D9mrH3mc7e zJt9SLjH+y|)bjsO8Qso&6#Vd9oiNO;$*cmdCvhQ~aJWKTeuUPt)LPO2d`B5Y&c6mW z)YQF5&Z(?mqJKE|%9uCY9PQdVM@$_oZgY3^RY^h>id7ajQyIa4sZ52c5F;%d|LN3G zj5=`HF-(yIR#Uf$wa1`3rCD6r*r(XAicvER!fw=i5Fy_DCahzZ6xa(D8RfC zL_q7dL745qWAMP2WJOVjIu)#1!~+&up&b&qT%G9?fRUk&1_&;#Z_?WkNG8P)FSsVO zX2vfG=~PfqoPvKh$GSQl__x~3tsOSY3-CxqCwHYW6BtMty;xMBg>qTY((4 zF=`QHuipO^T8;&N>=}6z#kQ+r_$N#M&r0aJfXQPOA73%&9|rL zVt)$!hzNR*fUVEE&7gr&LFp0cXhmnhjU;)VSeFYkuUyvV(8Fp*Q8}potdcr<8N|m0 z8IU_QP=)xubFRdu_xdZ5+Qd=VxQ{}?Nj88NySLo<^s9@@&q^5S17=l?++g8RSr8qPeEo30h18NnD!tjDU3 z6z%#I4VVmFQ5!l&N(9i#_nK)4K=$SL7g|j1lK;iEjKrMPwO%T*QL% z-j!aTy~MG>A0Aqn|7@{@*S zDMoRwd1C4>d!H_%>9`Qfk0FS$E~#rGg{T&9TVkroUTgXOzDN*&X!jzj4|asP^S?57 zo)-!G(FB7ZMeU>B24bHjF7JpxU+%GfzWnGf*6+OIewh)aZjmd#iKj|8JvZo&&_+(V zGmmN(r7(kaZ|>c>aov$yYB$2!j%Am`^?j^sco5`v*mG(=o%bvdyeUbC?lb5&d z%UKCu41wwotE+1(=s+>CI*gvHYC}kb2I3r2&k}3+*;M$!3Xn? z(Vb~d{}=K>j|{o&pEmQMf@gH)xk%?vA!FR!j|0m>KAckaYc*SdODE;HEmG5%~q#J_}ITGT`BJ`miBS>ui?SUI8Y6P*Q>$otnZf z2lCtF)rcg6=$K`D3>!h&tmk_cQ1|jFpf^X&w&q+m#Kzb$GU6RVJz?+?6B5y(9KM$Y zYn$>1?CaH(MxNIWKRPy}*4fTI+7C`5sorgyJtkLf5>+;TG)}YONvo5@tdS6LsisW_ z(wl=vAJ=?ORTlFB0yeH*djK?Mu&Bcq+7y0?)=c)l19}sjYTh1eIQCPfpyu{*64@KqB0mlsKZ#}K@7KT>d|xcDCirH zh4i+!#*!Bxexqo(J3zFrv4|g34GXi}Bxp~(d+B@^(0M}cA84 z^Tg;xRq+Bc!VEmLd~!wmVyaq5bw<9$!7)yM&NR72C7C}#MtH}5ELy(!j*SVu+nPa$o^~PShiG7YXY#RjJa5UuXCTe~?}v3y zYmj0&lH7JIjrCuJy*%(O!PiZ6m;y((bKo;A+eU>uh9;99%nSbF(qg!c`!S z7k}q?l)Qio5r$sksn|x^6S#moHlo?hu@dbixHKJ3cdG^VL*sG`IAQnPaK7Ff@<9X}CZa_9S>A zN`y+8yps+AIKO73R6~!*0bi9iLs_VhJl0NF7_d8HUKyLo3M;F-2N;FqYM`CXT}FQy z9cEc}Tp9UC` zpOjW2>)Zen$89)goE_)V6?VS@h>5m<<-zf3KurXOw-LCcv9B^(rG!5J`s0H;!&R40 zw6roRCGUy2)@Y+E98jx@Vw`6?M%J;WTfxiv;49Gh7L7yG7Omx) z0CUU1|7jKBDzU`&ySgh4FAfHw6 zu*I=#3|)-i>#`UW(a>Rw@Jei{l~=+!;|qU2WxPLimNeZ@gI7T25(T)=D(IlGY&sOl z3P&*j(a9X`jBDdyTm;D8AGcfh^YZsA(}F&Gp71}>oi(z4AKiy!ox&(%RR~Sft_D~$ zFv4!Fjn-5b`WAq$uX9L#T4J(HcGtjM$c+)7M5?sSR%vU0cm4XGZAXymv;1rtL#VQXc#|O0_IKjNfF~ z>BOK`M^)P)163{TvWPQ7HmPuvBo91LyKf6p6Z&Il#Pj@#;Qp{N{pN#FgCORiFD&rd zDXoEsoV#y@w>=?_|2*c1RwEi_S;BVHyH}8c4_sJkk706wCIxCgiifVQI zj_m7z$W@$TJHAP*W~wo*%z~W4pRr2=E-QREYIio;$Pn{yvt@n>$9)njFP>g;w{9pE zJN)58;c^Y#G8GQ#*N_R~w<$bsq6visNxj8QN$$dnAoZ}Ua=26)X-R2jDNx^aKg2BJcY^TIx~VDEpsO^cjbYqg(4z)IUmIU6Mugp0STm!@44vB# z;Y45lr5@?P`d(~5`^qnda=Xv{#ZEW`2Cr}xth8Oa|EyF^vg2;2ab`{!fr zXoIGlD%Qx2$O;o*x}v1<@a=FgLQ45JIm71#-5B(|Jclm%MmM+J--8({tgQO4phX-F?s)v0u(sWY5`vKT=23) z(_6yB#kebuQvniNLXnqzUq6{|-4O&JUnNy@naFoLiDlZK_MH_s7TT*debiS4 zZ^_oGY)Ke13NIdy4N2Uj1bv&F&PLRX8Pg1?K!X9#D=beo+)oT|B8%8P<9@ff;d%jG^C;*bv?_2 zCcE~Q?vWE*5PT0UKc}3}Nm=7olHga@7GX=jS<@4b%tOjL@7X6 zBg~9ESb(TefW3-+Ti{LLUD}9->#&{*KHUNc9=`f@w+4xiy28zoFtdF-#nkpI>N z2x-?;y^sAQ^+CU^My%Oox6!%;uqc0K?CK~6D|&(ZxD#_;QW+gYQrzJ22&4=0%`WZ& z$Kpo^JgxP@!ZYqoeKn18d`sY7s~5Lj`xBpUI21pfJ`)`Tm+|KZ0~IT)l!YAFW~z#> z?L_;)md2vm&CW~hp=tF%RU1_VMf5ZeygZ=SO>RAS`zDj-QT(^|_&^CVnZ#hJDRCcc6zM%BK z5_ss}nn3?8fp77r{NU*5uoamhQclBQsueYgH7%%J;?)&cRhQ0FX7TyIO zAqV*0i&U_ZtEzC_U&-C*4D*^HWA-!f;pe%Gmv{^^tmuCcB>^XC(psXV7pn|KK&2~p zw^s??(QO;YlBPkjGM-ajKP^G?0op_jWnnR%mjwx&&OhvUq8^#0oO@67&6>{e87(4Y zEW5WGqIHpBGn;|x35X}(r&*00)rD7IRzjYj%o)?J-S~^Sx6X!pA9A`16MEY0+*X7E z?Swc-omN{k?v`*BVY2PA=Sz{{_XdIQdam=tmR~iX)zeAAy-YYuXqP{_R#E}%%TUp*C zR37u6*8~)Q2p*CIMDBt{wy_VCW6Hu_eUI+y8x6IWW+@UgbDT|Ins%zhl!(odvT^dX z6nlKfU!&G0kZo;Z?r$S2ul4=Ou&JKjEDfd!chE({i2+!>&Pzy^|yMY15aU@^!q}(E@mrxXO+Y^ zl|CeVk@kFJ??PB8&$BE?94#-94F1N}%QK~SnpQq)#9wd`If2VqIlc%m95rZF^s*AZ z@Z(C|i+!+BR~`gspb@ZRfIi77;6zZ~Ii4%P|NK08QrY!8UuLg1nz%Id^;>lpnd7+1 zrE_-ur6zD+>1}6~F#~!j-(=|y0g?l$89rSEnPZEwhAO@FYdxSx+IR6=!F4Iq84AIb zVx+q=&xg1*1W8S1W@tCDZ4r6K_E4{omTKW(Kjv0TDZ;JVtrGbTrG;K@KA2YYGvO@q z$zWtgRAStrWxC%*+S*UJHJUD}4!{uZKi&^a#1DpC4Jt631Z!Y0N2mvYBe z`^bqc-+GWIZ()gY#3ei%%Dox=f!x0?~DT1sqS$hqPC-^fyvcHGZUkX zQ*TB(UZyShhegM1T;_cUFA*zv`tr7JP^V`^tF`d-9~$Q|r=r#M+)T zgqfkgx?NW)>?~Q4_bd}Le|C?*DO=ZkE;G#jq*fPkK?<;tX$R0UGIBqYFC7CzVlELJ z&js}Trx!r^;kgT_5JPK#Bcj1knKX26`M~ssqY+vzz+fVNAh!@tzijIji6~oeqZOu< znO4S3?!hAwH_E8ZQpmN*042Nv%!|(K{=TY_R_Lb~D#xiY#^A@=8!bPoy#@L<_z~C> ze*s@Gbj5T({u=fEmAgV1RRJvT)$J1;7c1mLUIM<*v*SWf+F#b(*_?TmPvCaz&;xHt z`zr|w>pkQ*qdzbi4C7-na4DyYGg4=k3yt~iwkd|sIiD3p1mGBoW{>K(8nigyO-lC zV!iui?#zVc7cLOV7A9Y5@{b$BG`t9T2LZj-K%3?jDi`JVPgM$3!}6H|{D}7Yl5z4W zUIC}%3=Kiq`!5d8V$Q9-rTTYFE>_9uBL~Z63V*Gj!f_{LPB#@o)*9#jeCFNNC!tsU z4BFfSX}ZPUg1IpW0jSCigCa-L$%g1_ZG_)S5wO*$=3Wh(>e=p^LR%sR z!mHyE7<`Y2$=qX=6S2%}6=QOg%2cf})ibASbwm$g)+6x~V}Ucp2y!C?sf+7B@w`K0jS&Gg-%%6j;2ufl$N8rdw~qDD%IMxSfg|La?+pPnkBNP}=QjS8upul@ zkz?YtFU@zml@qOhJA@4&QOsR=>6bkIZ;V2DmTi8lx4njiOktl))rr#BPp&~_Oxc_u z5eIHxVT0SG#B-><-VO;K-}qXc^KMb3?qjw4E23j+T(qMm!K?2^^_B4+uHut?Y&^aj zd2oAv)KPwqy~@^90_bApwj3Z49tefzo`UI1)v73oL?-9f}>NjDB zmTn!i1!D;##^c}>Z)gv~^5rx8tszqw20t{9cFrcO^}I2EKlM~=ZV*6%Chb*&d$U3T z+PxwW-E;7F;y!WZA5D`&wV2r36PC^_q5E|hu7I^xR?L{p`K{MAh%iNF?{Z-7$UCVL z^8mbhB3svg>qOslREMR$S`Zc^DygmRaJh@wImcLy-YYDEv=pEYdwuRFecpwtx z16Pn?;vauAp@cxrbQF$kk#mnR(1e*DbH0p6{z>7-;P^4K_3H+}Rt-4qTySu3VKE12n0D988#amAK_mHr>)4 ztT5NGs=d-fGvPe2sGNwu2R1R2#>M49*0b)JX6v`OkAP639WdYheY#uZEe!CrK#~5f zIhnX32&t`8(RShCeE^kbAphmg3C$Z{id=Yw>8An1Cmw9CRY~<-h=?q#vX;Cg;||Jb zyNLygTYk%HZ-xfiRvUJiVm1n}_<-AQSWHS<#Fki=7!|@T5}+>tN7f({q-kz}UaM_^7|+{+8n7O~Kl;7{a~P8mkN&2_;wUv(*Z zZlPF#dpF6}`QO_rMub^j-Yp`0Lk-)@Y!_w~=nx4jL+I#XJSgbSIs_mwdt*lRc@Ct~Z9sUmrHGA>M<@f|gb0E=!Ep!S9NagI+)siMTFf8M!)(MZ9y#N>RK$Y`;U=xSQgTi zeE%Pc#95)ZiN{+kgU}X#@aWsw2}|ACv6Ip_$aCXcWUOzK`^a*038i4OZqz8E@6{AL z&uhiOh!UUGNeVak$la5TDLY0DuBO_seCq1p0xq9-9e*}EzJY_}K{W1TMHa;YNa?A$ zJbf3XIvox7>y~>fL=jR|fnrtMW}840T)^^4_3$4%rvYHwjz!Sc!Zr!Sv33iiF#Zoa z!+$K{$bSI}%iqW_T>R;e@s;-E_(52*#wE4XS2}aRMzTZ>2Z7+VN#(;V`v`w+z_kJf zu$y%@bEbVT9dH_W$OB@%wyf7p=V%)#!aI41WvQ-ly1MP78@0eYS5}+}kC|{t^;-z>F>XKk(wBbaubnJy46(5*duwsOF z&LHd~I8Z4ntQpFY$-oeW0X3z*pDWq=AtvA-!w6?W#pZ%4_Yvv_MtNgbwrAL8Jis&s zdziD!0;j*ESwxu&fc7Zg?Nc3q`5QOba`^j5&!>RVdZiO*+3uQEFy z?MT9%xduJ}@lN%?BQp^3QkPbAXm^gxMBU9u&5HP>Jjg10r7UOX>{Sod=f6KSz?dNh z!evY?ko=^VLhG7fWw#B+ljQs_Jgcds)%H>`jZtsW1Etl}K{)SU!O;kq8OVlIS%hD5 zTMws^Mr6FTzI*0hDlaBmwF+A6V1#9~yZlPTEG4{;ZNS0kLBq|u&AQb`XcI0tu$UTB z^*rk(5v7a%*=ZCf`R~0sSMphp+1YO0n0Pg(a+phnN?u_H)c4*SR!8&atx^GXXX49o zt%q}tUKRN9FdOcTZxt(m`A`>99B->`qB<`MQakd8&< zlbH*sVBvj{6SZl@lpQtlmo6`XG?d#Wqq(f1VDPP2a|Gh9)k^frxvt%2#|}l0>$=ic zQx#_VDZlrML{%_tJU#kcJ{#!-<*F+)g<^ez->zt>`U!}#w*pkr&#lYEaQILCra=a> zklx?zvb?&j=OE&|VwwECnA%gHk`q7 z#2;U78GYBqb(b)RU1jQ(VPghG{o3eEkT+C12Qi;fDBiUasLp&a6Q3*l^}x@z$?i*rg9?F;Yr+QA*&RqysvmG#5DJeNSxXn+TP2!8B2PE4vgAbG(dhdIu{t< zLoMl~)I$JTj6ALZeXd~BoFK(#I??xkP1D^+SoXV~RHPR!lx8O>sIU|WE??GqBwD5v zZalV7TsSrA?Z{e+YX7aqQuPhphn1?{cJJAgMY1zvE{zX>IhH)*Y-Zw+@TKL{LT9Q* z+0>jn;kED1SG7?te)Y38hJW!u)moHLSUm!w_G8`x)5{UuBkffnmY+=RKNfM;qGedz zlNsRt(gJpz-^6&@ht5Au+cnHC<#T-iv?0XK-skQ*HbT?$3TjjOvq_t|L%qoM67Mw8 zo=D*41DYRzL$s$5$Q_}-%V74VFSa%q2`EpZbRyM%hRP*IMl(&wAd|;St z*r2Qv-*mRvUGR0w3gpIXFJF;!iDx*L+XLdZ(*#J2M`S3V@Guf1p2ld-jCKB2SMYDk zK_y3)PCob{vgPc0`m@2GPOh9b4|k@d>9r`I%}UbGIc0N5<;FHI4%H-l;DoQzo%%Sa zI>`8jNe@)760aNG^9$>)VvIta;=No68cdfiSihpG*E14mN7@Ib)wRDvz|5!lnyaj4 zbMViMvTNnd@tczl%H%WwVkV)7>a=y(V3KSn=R75Tmttlk6adWe@t3ccxg%3lp+yX6 z@XBh(cqVu!kLqNo!-rN>w6(f{UxrSkw%xK}SOdPt1vVCR@3@4z9fg@7dkZJ8|0A>3 z79j+ckQY9^QV~G! zuKP-&@1Y1{C~WF#9fkv%C+~6tsvKK*%uBc{a>=gusDYGm9$*m(*1z{owy(BS?BOLX z3|6cQ8;y9D@m)WYpdG0{(SES~80{>Cp*DPrQmPh9zITa9;G2eT3=xhuKfY%RIS%h7?BJZ zT_bnUJsoDR0;ms6QSKK34HVTiGZ7yk!^|fKg7FDJtvpx_8}WPP^K6biAP$kJNNS2p z_I_p?ilgmc1`wT(tk7vtM4}|;v+YfSvd+0=GiX^UZ1iON8VjhR(9HS%jV~i<7UR<% zC1TF0KywgNw^(PEZk-R#Ea3oocd38b-zIW;X-u)5nrL^rz1=vR26TwDSw8~0DL!w! zi-cDl*H+ggp_(o>cGt4;)jt5Ps21$?J~umMz4FBTU*_3Ys!@X**v44Efz z_--rQCvn&D^**D2Ux@?!35YxCtD3C76e3BfDp z834Tl@Mv#p#6FEqqI~GBuC%P^pHx3c&vscPTDNqCHOpp5n)9a6N8hHYN4yrA`6}Xf z=yglf8iLu(j%%db0Kc`Mks8cdgs}nL{_nG=`La}Wthkr0Mdq(rL%(v27mPaVSSK@; z4NbszRsA@TokBWub|pp5S8)XO0cvG<$NP5<=#90tMoSuh`xeq>w(iis+#=ryf@E8z zh1sO9{d~3;H8r-)FQG%a#I%P|?b?r-heNrxsc&u3BLTelWR&Lp4~leXbCslV!>0&u ziul@YTcWs{rc%E=N(^HH{ZM(TL zvDTpF6|)PH>6!V2{}XA|AZVXyfvPnZN$&b_CF$r9*v3Q&qnZxE2=5~0Qz@&Q#AR7~ec%T+tO@JV!v^3fZPns~ zbCPYJ#)v4uhBkL6Tk0v;7?t#Y$JLjU@sw#g8P0L;mOG#7bavc zlA&twBXooTY@L+xo`Yfz@EH_&*!5tZe(65d9nB#yx9yUi#~Ql_yUL|>v^d(I#Tp>td{g%GRJ)?|62lEbIR?3M z>~DU8$-&@Zh`r-D$zO|Y$5Z*&nycTaoV^E@RTF}&ol@Z|`Xh6c4k8KsFp^RyvWMHF z!&EZZ-u&*P5QA=Y8;L)qp);pcWXVB`5Ld!HutdMSSUec-av@jk_7EH+TvO)+-F+7` z!b>{|NXh-H{CSh23Onf{z;QOgr4V=`QU38Iy9dC8lVOu(aNYh(cK(uOu%+{{&14Gp z`kJ;WLA=jz4dHTu4Uo;4A9TQcv;Rh6I#DhR(cW9QVAFTBpUpl(PpYp@a^vQ{)iEph zvjyvHlFH{_A1zPj1ID%m>>g%M3;osnpyP|0umy*Au|8?|+<+(VYj_F7ZRhoz3u$_e zsI2_$?5cKUdvCMKinKI!8uq#ZUq@*>dDXVW8bDNVEj(G??h1IW|Lv#LF{D7O&JTd? zF@5xumVrp=@}Q}Y#&1shrvF=(1WHQ2GId{qzTuV|@BO15<+2#3Js^H*E-ga3;ke$$ zh3RcW2=nf6Bo30(EC`Rggf2i!4?P^t?($ z=}mRUyvpk`2r7RyP1uU@O#CX3#}g76yLNE1*SNXz2+Mf}d>uGmWiGvc&Tw)4LS)eF z5^h$F;mH%>tj;X;T1t^CgIEVzTo)z6$gRo*uy&8DZ=&GE?P)w=d+5j~3t{iy2hIET zd>%(4Xp;_#Z_b!3?SjVQ4dUBrF01}qYo9l$3@)I7!RuY%WA8Z3Idzkdal}hEe+^2< z?-*veYNxi(eO>TW;d)pZ({+4fd8Ljy0fO&*lt8K$R=q-a|EONvv5iJlSX+K>Ve>rQXT!tbM%@i%qpo6#Pt|D1@WRl8fKVVHWY3CAA7?6@pz4KJvy9|yBN2oylE*perBVT5k zEoT#7YV93|DAKR~;Hvih{$-}mjc(5D;dC`7nh>gM_sIP z?FP+Efn9^4kCXXph}*a0dBRi%*!d>RGf{CKFd%%ai;M&!q&&wwKhr}&H0O-QAv=eH z&F5rr?%*CjagKRKGU-KPLSXC?J`MZE&JecFH1u=9zW(_L6UF9=fHBKQ#~C$IPt6p? zfK2L`y;H)(7&bA6di$&0{8g1Y7lzO@u-kdvLYfN!Jsb3%qlK~9QtyXEV4|v4OK&4r z8)HuHBj! zS*Y_YH+AOgHM#hy0^xy3&5`E1_~Q{8s1ZA2Lw_8O(v2$d5Yl65GGR{AZKoZXEEr#k z=7ueO^QQ%tK)i5oMGKOg&YE03B@-mHc8S`47k%C?il`VTan`NaJmqBCU@XRYeC07% zkF9RIa2{x|u&5tkF}C~|jB-B`h+vybZYRNW^nLVcm-~wmyqSje6^|(+i`j_7ws1;! zJYs`C#Ps_zEw>Wlz|kGM|2Y&blfuZzsO-#hSal7Vu=O1lf-XWIcf^4NJmruso%zo>8LIG`8Ccw8*eEVzaxTueVSXtoi=k%9lpF49}l=@OW!n}}2iN9DF+M_lVz8k~ktPRCU41ghTq7tF&LazTGFW4W7RO>;qfNDQ*r~%#rCa zjB^ge!LHnlf06#E>i7}((sb|{&KE;5`kMd zmZ=8RUzu(R-VSDUR{g}~VTmK6J}iqM1lJ}3div>Fzm(?wn+UIrQTnL)!bBbJ8_`l$ zSsgQdT0=?Mjrh)Wf0)wb33slb1gp+HgIYjm%w(AMh2tzzT!#jO3S}R17@M(Y^=hp- z9Www?Nhk{#(n1w-9QjbdS1d;j7?zJ;)=U<-nV@~+LVZ4+Tze`7U(pio>O1Y;o>J!_q4Z`pVpg`9PKYAunj>~4~=t05P z%`2ORuo>UA(p*KqEXSb!Nl+O;Hv$^mH?62sy&th&XtAu&jY2CK@5z!l(U7Lx-Wy)mloNFvU7o)H-I5F;7 zefNZn|FMbc*34J$Q*5i7xEcoiWTZF6JVfe+&%e^`e+#4d!XbutOX#Ojqah8Y#8*%D^tc1Gs+A3Z-dXOSMVvi5eB<3(|nk7O>~cz;0BlM?b03f{~7`g(HfdsIn_m2xea%+ctiaT}C^ci@563>ww_c z4|xJ6h;gxC-zdO_xWoM_77l9*B66Ur6G2c|ADJ+O;~bDx!$&!RvMN*d#JLDf2y&3g zM1WjK8)AE^G5zHfS}KOh4Uiq5v(wL&p*S~c?8`PP4kf;kFdy8O8YeTm$Y4FPw*z3_ zaJx|saHCJ%LTbyE`3ilNVk4Qr>5yU0Em&S$9d7mz8%s2jK>wk#iSjz2!lEL;b_oa2O0bEAn-=rs}n6VP=sz4 z6fw;z54#$+&yKAOJ^C{XK8il}&xM%FZFaJTaQG@2QdZ4u;mDGf!BgAT!5!Q;#%~cX zHIvq~*P3VLQNhPKUv#5$6<{6+rM&AnALC$7o9sf!gL>?D2e}tiRVt2AY z8dabtusS(zhYZgx74u!OTQL+qe(i9GWq}_p;`;nVdNtyh^Y%uEa&1Jjc`PS79+ax) zStK@7suJ|r5Uu9QG=su-3cWE&Lj#UZ_pR{H^l{@G1nnC+`;HwG!lj13?q^@`<;{|Y zJZnLx`)&}-F#QzQ;qGP)#$SjhaL|)VV8IV}Vm>O;+39AxE_jCnu8AI1P)MOzf0lQj zbN)u|2t~YtS8Y1ztE-}GR|a<`SLYgZ(65SUD-6%5z77CzBrS~^4GRd0fw~N=8HN+H zB7tA3?>f3eRQ+htjO)tQCO)v|QL>}28eGOiRwo$`$q&$|*OcLqLf=7CeBj|I<$(kG z*GdXc_-3qeQfu1wx#`anz)k#_MIjle+l}aJvPtX@9&C%Ic#GdS@>PQh(|GkJst60@ zfl3e8^Vl_~RHmIB#=`_3uDLp>qZjXAIPOl}Y~5_bRc4g)>wm=WGHq{X)>5@rfRb&X zdW}t)GS49?M0gILyMS(5Mgc-uPF78zn~j@O?Yj;qK>{iiUYPsgN`qBgzTXGZy(3nn5 zvG@VF`g&k%XOsEFgAorop^>Tp#72WGHwHA}x#RNHW4jsJ;@!~9TFD_yn1s)?jIe7m zCzzFrFQ(v`v~M8+l^aCkxy`w%EwDC8g!`Z(5pTVhe>N8Uy1M$CyXL^lX}RNkP~u+D zQa(D~=qLur^XH!Cr!B@RFc3j&qO3OV`q`9DFy}80 zq7U11Gobfv8|L4>TD_|}%A9>j+3To`@OpA~uQ0Kirt_nb=}3r((z0V+j$TC@w8T7M*^Uuj0LG87R8OX$}RtjZHD#B17MOrM8VJu@QL$*R$vNj>hkY((c@WUSe;@9S6-L$WVp9~tWm z#y%Kke(%qH&i6ju=k9wxzrQ<9=e*Cnw(EIaj|)il11r?+Sq`LV)w5wM)r{T;QP3)6 zfmBgcx-5Hx%;ALdzbys90yF)sU;EO?rdjX4R}1` zeAxryI5da7-5N`R-Ze!c1zuUR_mt%ekC}Oej^pvEeOyHjOHl9-tMuZ^XEbj~EAmoHS7DodYzZ$*8 zRIWpdgop2eigg9z8iF!}U$8s12iRgLF~$~5>4VyHGD?Z=qP7Zb4!p{O)2`v-b}|xh z9b<^^A!h+w^%BeP{ib7Rd2_yXi!W=se%Z|bsn^XZF*Ju`#>0u{PWFfEH2!n{&S%63 zuI!-Z2hWhYg!dG-r^|e|REu$R=Sv3Cy`-37Ea@Z4w}wmwYz2ovaLJQq+kbjclr`jU&vCB8|(4%D0F>{VN2g)hV~#$IP2Pktxcmk4AORZ;Fc$RE}H29 zaD$anl5NJtKq78KunQTttz5Pbi(}ewnvk~c&3^~4wjSB=v9<%}Od5D9m1N>E3AM_z z{XO@=D;3oc8#VR!n9H9FSp5x4XBTMdgq5|R=@vukzL}wdbze(B>0GkrJ;rd3&(V4p z>$kh`?^SNAP_LJuhC8w$G-^j7^BxDN6Q|kPrcRdz`BNSi+!-ic-dc6!jhPr6k~%j4 zV4+}+TkDolM_75|HBTeldK`^HK8NFR@!26h}e!*m#JiJCh>V4q{0! znCR5zOBUX%XI`HM?F8~WP=CQ7VctG!hA@HCd$DkZ90-kgZUXXsOXMhgWJoRqPkJ3c zy0G6we9fx2$I`1&f*oKm#kNRazzqRrGidKLJrr7n~%;4Yq*yC2`h|?TDSJzj~ zS`ay$&Ye_t(ml|cFAeR?RQkS$Yw*m@mdXp37lEiGCi_Ay&sK9uPp41guE6v>d3M9i z=U|E?A!w{WsfqO_AOs@8$by5D5X)ldX;79?WVlSg8yCJtvfP>z>4okqFTj&QKPsVl zfFua0{x>DrrQKp)cnr-H5c~SDmDhj4l{+cX^>T`L)B-1;mXEzMmw=3@q|iaA@57+?FbVNe-Iv;%osUWwCs+1!)#cbrx37KILZ#>$gO(2_OkP|w=hH9E zg$ErN-jrB2slHwMXfhjqCt;lnmu(DeeDUOsgPOo*k11$CwDoh{R~u0)Qn=EG8BOcr zo=x`x+NezU33ZEWXdpM+FDI+W(MZd}GJ(A0=!dlPP81P&D+8P8Pv#tj@WPygOHZUvTaNIzsW15_z|W zv1w@!nN4_R75M?R6-Ll@iYN+b=*az7H__gcp zn_IQA`hgGm8abCVDeMP7pK@wp%P6*jgNcy!hC)b$+HFnQ!L+q{jMaQ(GK$;7mUCBS zas1Kmy6lLuQ8uFHA`5BcA7al5Gyipra&Q@Jpz$>MCn;if^d~1e@ajL$M+4~I0vtuT z7*fTe^kQ4-?hI_nG?`*wL%Z0!VK8#%L=&|}Cs>iNHu*!%$2DX}6pAgf9kQ8Xv~(@~ z-J&(%--`2Nd|Arwxza%U+Uvi$i>_u62Bqtc8_&st(n|s_;oA!cS-6) zCHZ@sX)#q_LhFvM+DjjsGH&$bZHTd=O)tfK0oWcPSuRH|0vPaLL)&|?>XJpjzay`? zK~AfElse(|si&ADW~J(j@ExMbX}wnC>f2hW+>4B@^G(w@{|T32XghK$Q}|^inVR2v z^C4`h3Eg-L<&sT6UaOQ9o7-oERNXnu6-c}cdgqth%bPmF%Grxl=Mt#d=J;*;$xK|< zGfx=yVc6z~YlLep8j;sV3eiJGG3HI2@YZmAK3oc=uTt%}!!>Pa0$Qe#YcvGN-pNs* zkJ=ja^U|+ihkpvt&!(Q^hgJFIV2&O_VQiO2clrPevab3&R39L2zV6LBvpzJxxtC=R zKe6_N2-rOi-{N9GwCsqI*n`G4nP-d`4P$^|L#}g5eR@+3;3PoP3D?-Iyc?|)K)vIc z-bsd_Qr3W+S^G!ESXEC*nD%@w>XWeSFrsSzDY^|m^5Ks8lfRZ70HB6g8za>R~JIVD0JG0xX$i9YqkyucotOw^p(%D16U zN$L)#(*PsB+uvW~!S0`+FE5%a8~Vt>L|xP*ivv}p;U8E7`nkF~t6&U-sV;Xnt$S$g zF7^)0NxsTQH&6|0ioW5!l%Upwq3C`?f4`dV=Qf$!P1y-btkr_a!GP-|o8%Az*cB3P zfp-K%jVFE|Q1~XR7a^AXr?CC?SKqh}Y#iB)E)jiQX8WaFh-_ zAM>^C@c>$&|LSV(8KNL*Z>MOa>3R-*2w4o<3G|vvPM5WV1T|2lhp(asM=&~q9bU>j z>oWs8f;wiiDS-C$P-3J_bh16X z2Qq?f$&jC{MDG*}u<^9Og*ie1B^x%GdP7#)SAgfJEyiIyalD=m%YW`~WjvWhSh?cB z5dT#jBws0x4+(hN;2kg-^X=xo@&1>OhtuXzxxZgfY1Y5A*?5``yF=@9FJH@VWs_Hg zR=KlVplsHr_6m+kd7gNhCRTagOwvHXmLh-|Vh7c~(Q+&+6O*uisw#l}NY7c8*`7dGTw zQo2`RJL#wl<70Bs^yBERxqdmb8yFIKrnDPkpnz2O?%vQXcB^q|buw3m-S77vQNk$= zxlvKo6ey{%|MG=+lgGP<{&Y^MmrQ-q*6n8Jm6( z5e%t9KE_^xDx3MY2yd2u>rgo<3 zWzU0eaHXojeY~Fw+R|V^idxQO=_uzSuinQ+;kXoRuy(IAH**Jrth;qcTa(A3|!H4)dQE6m~6mhWx@$0U`U-$L4=*)^J!Bj8{q^v z`X>GNRxN5n-VC?U&^6(ML%c|u2OTAH@i>JZ?Qx4|%=Kf-OsJH7^ zVczJDh1b*loJ(>W4DcR10fEWt(tMV!`~h_8cY9~v-sJ=S2{CAW7%H5{dps>fd_+bL*pS6XG~)FCw*xEzd*?(YDl|=! zuEi(E!IM7oO0KMYT}Maz?(c&PxqO;@qvQ$Z?<=8@_XugaFesn%a>1GQi_~Wz@mwoF z!zl-lk<|qot3vM5CO#nDC)~FG8I(=KILvH@y5`T@M|Kq>J(6)TBrwTBl4 zRb(l&?X!MStMt$M@fQQ>@}|oDAD1 zN5-Se!rY$UCbmLy>=LJS?|(Sg)z1jMIC1-&tftMBu~Jp#M(O((C1+IDKR=W}m(` z+@1T_FVJ8djRU;i(9cY$f!aId;2@Wh>L7WPr%t0?BE3?asM#B_Am3v!3nFS#R*UHT zp8t-V12teHFOHHL>R+JZY4WQQo^=x*SxrKa@c<~`%pKzX8d3Xl;u_5xiCHAMyOr*RNH4|jP0heEJD63tPKeD zo*T9WHFf#L`WGlc5|SRiZR8BV?py3?90+bTHr2fX!&zQj>*^@%f$+jNVgdIPldU?{CJ;dwFHPgt&BbevSC(%jCa7#n_AY?ii zwSRjJaL}z%0V+YMtq5X-;`jt6*ZJ@O!Z)EC@32B^Ut-9JSrecEZlvNbXQne*M(dvB&EehUb1gD^LqE#d!jpA^zj-#H)1VZo`1 zH!0I*J@06Bqdnqh*)YUAhB+xoAa=-Q>@1tZr8t=fNCgMIen!uQc`aq0?Z~NE=J}?0 zRBmjr5Lhd9$Jq0P)!>z6BV*WTs<1-iQ@Z40Cc!(<^$-NYS96itw{3#0V9KbT($pT3 zPHXDvxvdod#C zUE5A)!tZ~m+g9b9-kGYQH$*p9^Zzx4IVTfhe9e4a=7f0F8;8)R^%@oxL2EgomoRD^ z@`a4gt{t~K)%)&pj#yl#iwu*J!LpfAWaTqZI_pvq5ZYr$>unlBMv_RH(P}<`P@eQs z?;*?cI@ykJh9eJa`=uiaMDM1YDXh**3oFt&a#q~|V1@7(#!O_km@mNHKk^=@Aop3- z)~q%P4o0GPPPd}DCN9S*FV%h~I8G2u<%Xmz=sq8h{O8B*Eh~w)t6mP>ArF37*b@O^ z$ckd_DV{IAb}R8hOj}2WhyEaD{fbGBIF7Z?na7ysk`^OgQ#{NOn3i&rJZBGeSTtiYzPPPQdOWhe z!p=~L=~GXsg8T}8I(5lkpuzC(AMy{qPSc+uzcQcgPVMBBn`;hYqr)0v| zV>DGHxvlbg*5fakd`{V#Ka{J+Rrol<1|GDG+CfH?d9IVH==!hf=-H^GaR+cN5Zr5$ z^`JyTWP9Dn$DqTdi>j^Eqn$b!))PMh$ni{^UX8TeU=uL2Lx-h=c7R}(UE)?u{OH;~vu&|ptz{rh8r1cVB5c|iUSf6pQ)%y(fh*-u zA>hdDadc>Lf?VLcjH`%6r!~9Kg<~oWEd=_|!eKrR_z%oRTo;O$Mg^N)I75m~HTp_q zFMugSezc7-6CqgCF7|nLi^zJ){jRCGBSwe=dWQOrFNmkvJ886S+57r)(YV6!cg&5& zJU{=5C2OpD7xcaStHRVQq-Q0~Ql2#`78$4tDjQT8-<=J`H34tbjJP_Ajhvw$je*Bbwo;5r}< zJSk6aU8hZR76nJUDcs{P_5ckAy8C>T29Z3nE58hg0_uhLg@Uz%NC?M;&tFjXTTMMu zR>0G+F|9yZoa7@*&qsCJkD|RAmyR)r?%(4sX^$L%zq42wd8@%sj!?JF;Tp}LZum{^ z2CY;v>awK-2ZEeLs+h_y>LdkB8P+dvK>3@E_b>1G6c7xCIHg7PZpi`JJQeVjBe_6) z+NA$v%>Q@+=!efU{kI07(}pv(ucy*cN9E=g=K}x!`Y>_F;xApT!VU?$@Q`P;K&xxdzBYu`RUG!xxUM?4L zxYqIVCGEjFhsc-+Buw^Ea4u-~u$+8yH!b9xjW(4(xF-+rBX73a!9yDd&mzqePaqn- zw*r#^Lg>tv(jA)=;$HMZLk)AQF65t?e6neeyTUhu*$B?gxVqDLr75Ck!vyA+tvk@z zlI2$fPawYml#OBBs8zq){+Y+81>}ASJ9>PBm!;|LvWDb!Wn3H?`cMq4csy!Osp9Zf z{PhM{rNk#(G-MYwG3H?mN}o=L29Ro9$HsTR2+C5wpCyYO! z{=#L<=w7v`T36tx=5VdR|rp)GiH_TH3SkCTuB zr!qtZb@Y42A~B)!dGLwNi|VMJN%h`vr44c9s!i!sK*J8eIjqT791Blh4b4YKF~>qH z{Uz1_mLO~zy#1j_c~ix(h(b`}O>^0d{J`ux%c(pFcNggOZIBIURZ<${YCkPM3xj+W z#ndvZ^X;Xh=6DKk`Q*MBjv(u9p8eQcmJc79O=)0z%;{s;3htgUNkslGEe)QmLT0A- zC0-z@QF5p1lGi@!_o7q15-o!UO6hyPgKJrxh9Gp%VfCZp9L`;hibdhp zNaXB2J%xkD^P%MSnXSdZJ4;8>dhW(BA3R(5|03p>vuc_{hi#Zv&#d#hdn8>yj`>MDLKdLWTjYc&|jjYJl}n9?fO8Asycj~Uho3%vcRw2SqI_x`qKnw@_H`U;g~H6FZWMPzyfrk|qM! ziU3n1^ho|wDsoPl#0aL>sAFkxf-t1#`xZ%A1M)OBGJWMlLkIiF5Y@B3=t-&WnMH0$ zSfMueQLMEl!~~0HcdYq0LQc6AwQdX% zPd3L5O&xfLqqzO&?qaiU%6iON$8cZ|;zu6j< z{n7Noxd2WFv8F~(wQSB;$AO3mcM4LwefCu$N=wJ^-PK7%O=`F*zxT2x&wd_zHQfQA zOzzwiBFWt^@!yZ6)T9evIc#ep zZgdYU-ih&dd(9G|^fXV5kN@S%2atDUi08GO-MW{<&QGnceab=~un%6!?pS_<>Q?^w z&>ijCm0vfc$3}YT#D~l@g7b2KYh|DEAg3N-Y4Qd>v}?BJ!*IKFY#?IXcN8z$A3jpr6_;JpxFv9xSUgNm`1DIUV{_`kZoj5n2J7&G_1o<&6lLvip z#Pj>|!?&VNrbbKFB+qB;7bPJx&&(Z6MOk5IKsogB`bKaTjY|GdLkoh7wrS#(;8u4c zMLU7q<44pvh(1JZtU2W!p1*iUHjdRCRtFHzFgPaMDgc~Z-6i!#BH4!jF2((s?YOKz z*|9jaUG#BLHc(MVXtTZk;f47htUOH`Wz55ZpNhOw4?l31F=y?fypH7QMvX&Rw-X48 zqjfju%R~EtQIcxoZo7!$rc*JbEMBI{Yy_i=Ep`F~3x3XB13i(x6H{tPFy&aItO zAkvP6TRh4**lY4R!vMAv)ptbsf?7!?TN#^T^V)FFK~E%xLsf+qcn3w>H_}krZ4Zo! z`S(UIf#4K;CfwJASG(pNV5_;A`{V(3i)9iFiU|4NwM68aTf-i@zNN2DAaE-NJ>Gd;}zmj;5e zlQYx<(N~*nvjug_1WQcCxp=?WzW%S#-mBIL(3cFz)_d}mcc0tGOJ}V-qsCB<+LSq{ zP~BUbMT!;Xs8>b9cNF8)LtOf~zW>}^wQ_CNt$#iy`cjX5)&@9zoq&v&V3c>@#5Mi%5vNPQ3cs{mJ~AziLr z^vb=X2eX6XUKd!Nzh0oPlmg_y9QpS0uQ11g@j_PH3@k9uJ1ai97EIB^sA7laHuvza z7$_p7?Tu94f7x8w_Jm@!W(*_+N{jaZe82fNisFwzKm*X)s>UqFapfxqr)VPv3=^;# z_%JRu&hjY3C85mqJ$D_os4f{?Cxqt2Zlf6S{Jx6osCSUv#qR%9LeMfH@lBnW-u>98 z^V(YY21qVu+sm5bM+#3}`Po)y#JxZx@35gvO#y z>3jhXl!_mOwUo-v-JGj4wxhIvLCMv%Ql%(31?uJTJF1Rt2q5sC9hQ@#8bx{qiVp;-E!d?b}(2jr`Q;OUw&M0jtAFj zP;HEGDqk$Kno1|jZ|9Vu)=_V`&nVH6sen_3{{#@UGa+*9VskBU;DHgY!+mt!BJesU zcg|C|KsL@?+rHJt4A$-sQ;EEW+vgGWPLW8(!39^+Yk&JFS=HL*mSg^x{vL$;P_%ZKOic-Z-fQdZ8?O>CO^dhz}T{LR%nT3!Pnj5W9%97@T%q6 zz6Zk#PC4+YBi4wjU7iRHKAc6=%^JlV`_;Q0@^#AKbV)(QQN_@PtsVctT2y7P|MqC} zzL3v4T5XNE0SQ7da~5=!VD}2%A|)ULfp-Cb=Ik7Z8R_ho1_rMwK?bCQwhq-ny#dpt z!$=Aq4qC2Twlb6kNeq8;F8KyHgSHp-+b?Jg4goQ^{{>I+et^MCU2Ds&!Kd_G7-MAC zgP+Ph*fzH2JlGut!(j1aTcwEF|sdk;T1JplXkQ16?{|1&Xl4 z;lMuRxn;}Tj62b44(Y$^GY4iR`!~idJX(BT`A*)m{)*ahduGwx(cL`0rh;8iim_Rh zi^FMPA5)xbM=LseHF!^hz$N0I$ip^56X+7;K38O{hu_E1`=&KcK_H^IWzC}swizez zy0%o#QvSsb=pYxfN-W#E@i|cBLh0J&B!a8jI?3zWy-6KxqlL9np8w=pyZoSAoa2U> z0i^{`*ISjWpG^iV+l$lN!D!TZ^9>`I-|+$O>;E0m=qT<&g)d#Lll^$zO2LF0o|o{| z(ctkAHCIO&Kci}zH#~i7bI0Iqp3lvkEh5$CfR@1Hc&}EZ5A@REj22dL+}(LbzhSq9 zR^jg{kk$Lr1GsqHgnab&j%5ZeHB!S@Df*&gy8V&UmC?&_m0?F>GXg+sOTklZh1h_{ zpBzgCm(c!)W=wD(<;^svzx2ANb7~o%M!0fMs0E^Cd#%;~VCUc!YR86~^#BB!B{YfO z*Qq}|k+ZAw`H5`?rMRWdZ;y|M3H+QJx#C}4%X!8<%?&Ta7MM9NdypjYh*M%DU`%BU z084HauLPlqaR*RD4*CGmw5Vo`t4j{h1-lYotk(j(G{Z-J*vr5hT_j;#zHh`$vZ_zr zS?tp^0HO}Iv0@Gq$~CU-tkc^1`($!GQr!if)Uwli2BP{Q{7jhU<(a-;?*;`CvjMrz z`=gvKmV?GGMWom-Cc8F84Ki2|@?=-jPymE}6bk^9N&uG$^KGw1AD%~m`9Pf&43jJI z)@@q8{pk)tQ7li;@Y&k&85OL{+Y((zg`o|9Eyek&`l&I*U+l~59Ee=qRs*}2iz8OP)lw}j?K`wjFap#Cd&TZ(3 zR0DkYonsKfg(xQvle7KrpXD|7lJ=Z_8FwI3ppm0)}tT4wZV%=^Drs!CCvv+v;Kj`bY#JKU3iN-AjYJ)}2VaLf$37-I`hR(pRO{bj9t zu>sC7B@?ycv`T#?YPqI$pgi66{G!TA=JUB%v5duTt|=RRCzA;?3oF^qRNXwVBQq9w zJC*oqDRVmJYf*$jpAqh zl?NZY60dt5p9SyNa9)&Koj}7ew+bI7E7Di5GOLAbC7zB(d9GBddrSuEkjLeRHzf1! zQ1AsjV`h3BLT;D6eB7T+(KWGk!Co!~ES@XJr*#u^>Pe|YOM1A?+H$EIQA>UZ2(J~J zd>&bl28lZGmZQ2Qw{)*54O>KdLdT}_7KZRHL$>qK3r+>oHJ*{ruy?wYv_Z-o@xMq7v$FG_Hlfh8#uz1vR*5j zhl*09pf^=-3~bzRWF)V?lf@`;avX%w;MQ`% zXF7cj?W>vUz$N*XL71W>o#*#f{d8u<)%&~OFZ@3wzyDA3=U%&~t!DX`OjMC+LsD32 z_N7S4shg2QMmdk%ueE+;D@k|ZLfC2-~8GDLY;YV~RFBZI>XmM99k#MA?WZv+Mg4V^S^UUmFdJpk;56Hk#(b#`@t{NZv>eH#x~Mne=-#|6DE`tXLBa2tQboD- z@52;JtvTwY52HMkWOrI@p6Ju}y*~<~=3|$W`1i~ozz!-jxfcWT;Lq!n`3EQwHTvNn z5jf#y$N+CW!+?jg71qaKFp;k^Z}Df=?h=*L{Kj?^oeMB8NWbeg*zC|fBkT}a7Ua~2IsF2()K|USi+`o4_^9`wp(?JUOd?sfdMr^?a4smp%f5cH z(@s+vS14P_TtnRTLsXb9gxN4b23YxssuaOF!PwP49F+?w5?U`J<-u>Mj6@tR+YVyT z=641|QH-4HqMkZVj&#r&x2_#w_Tyx|=Z>+|fi2f0$HB#9B9=1+dKowakCe_UZXiHZ z@}sm3dq@fZErd_9Rq-o=OHn(e%bd4;8A1>ay3xWn$$BOezy3;^Y&1MAm+chLa75jC zN@9p}eJu_7Rc^k(E>$h&qn#K$MTr~;zf`Q4GYKQgq#`t6KCyVzqCMz@aRsyW^HarB{M5#uu-k8cGv$i8_A zI7bf}EW?fN_iZqDy%?T23d%GZph)4{Z($dybmMX|&!??6DcRibQ=|_DA*Dm&g}F9C z1;SYztCk4be0o^)#a|;K8pekx}CE^m>Nef2UL62~3j+66OxHo37BB&8O&>-Kw zfbIX%zAyNUGWgLn-A3j+Nq(|^>!&M5fC^I%55 zScy?@b{ex-F1T0JgZ$#fM0{rqa$~c&m)Up`fRGWlON}X!fgc zy~5={guK7^cTMcmdKr;=WAR?H5tde$EIb=4Pyy;;M@9j5S_=A1wKULp{Qp0sG;JA- zFZIR}*D{AHoh-RfA@h^hl%8qD@MenN>+x%})GjIRDpbvgNV*>l>IAuF? z3tf~-to{t*zOWXkFd_wqV&ylG&|Ko%p>{cvG<*nNS!s=$hFr3%<<9l?QV*p zYpc-Yen3iPHq#Cq$<6m|rcJ)a=$*eg1}K8y){29^F9WU84Kf4^B9OnfIJuWM{;O!1 zyUTv99s3bs9TTGeNib!387lU{J9$+Wxz7ZG;T-^F!U`PF_`5o9KEJ;?O!8VQw*2Cf z4{HwOyRx1jl!+uX#+@J36iCHxm}B{*|6fY)9}$i}lkNBw!P6?a5}RwWC-+1-MsHPu zd4qR)K3}Fe6k&4=gqOCOR_2NVczmC^9cJAnPkaYjC23x-8lXTmcW1#qQ(i)(%`|b=j%?fa>ON4V^QSJ#qKe; zE2;jLh7M}n(%`mq5i`TfY!=VfiD7SK_c&Na*TjQqny{}3L8X|jlgyELPKH@F&zt|y z2CH}V%269Znkh4W$F=txp+3#bA~PkXb0+m|IhU)w6zj9HYhop_}|7Gi}Q&V7;$Q~G3KJ}?6 zX(=vC?xtw_{MOSSH0Ac1KYY zd{s#V)r9IV{P_Vhyd2v7-a*Z$UQ9_~S1L98Nb1_>T(oUccK5|xC%oP1fRPvP?KrIy zfxwdV3>Xqol(YOB>PnwPx#a<#WxNz|XQm=RU>DFl$6^Lr-E%I2%{WX(q(-C2CJc*kIBV=i7f>-G8JtLTnj;Gjv|qx351{&@SY> z_DA1UyvtnqYjo(T*uxJ-Ju%ux!&v_TZzCdmm$eEWx@@woOB-rLdAbC&)P@$Tun2D> zqud%3kG}hGgQWWAdq*`EOqGwd4mB5_kirEP>;yH8QUZybYkrZUfy=@G zmO122%vT(}r5mxR+U`_f zs^@Zc3mEJ9`g_wVUEc$@C2pG1zpQ|0L$9N7l#t(XC*mkh5(ShSfAs{it_po9!pusM zQv8L#uJI689b6mV!#>$>h;xJY<0@jGN$>gMCAQlP+{4dZ(+j!MG0g0=PMp37MQs4L9IQnl|YJ1YMNlu72ncWw`0zXHvJ;sQnMf#LQH8o@G!@wbG6r(?>`tq)c#bev_z;ahyA2R`gJdAqF%1z%p}J1AT` zS4RVj&E!CydId-nD&D@X&T#|hOb12;**#dfb%Esel~v}-qgAsNAQOE2??=lYKfd*3 z`pJk~msS3fOOx}VuhYCQKAjueu1fY@?CCNn2!DTy{pq0!KSE)EYgU|gMKIVce;W~j zp1qFbCv{ACVXrYKykwi$l;?ooeX{yY2o1@$xEsuen83sMW|{T#T!wfn@Sm&r&D$9D z&6h?i*AR(~9Xb=NwI`7U5WO%BJ^jZ+QUPDq zoTIR9yCww>xFtWtECxb$CI4&Lu6OVJa7yJKF=LxZho%NBg!`?{#h3=(JLF&}bH7EC zym{7KLCwL%;feD*>3j+oNwiftg_!V^HUxB%on!WVhPGdC2J$^E8}umD?*!U*5tbl8J#q02e1UIE3mQ6utS&} zZTmGNwZn-RTtE;)(Ul-&40{}}Y40ot;^^(1O3XVe6K*p{XM!+qrz+T z0HTuj6rq<|Q}yMqp3QnO#ytsnr4_tUnAXMHL{`(FW$qnCy*fF55U*uhS$ut3oDc6%*~TN6uEr`L^HR2RTw;OwpKCQ@ge zy0&Lsse*$;>)p`0!SvIn71??tS|g=Rmq|X5_PJ&Y@{?e#-uy^ceOsJwe`%_q-bm?~ zpkYd&Yx$(c@^A0uQHz=$=kro*ahKm=gG-xRhMvx3!u7SP#t=^dM~2&P8oFyUc`Bsu zIIa@)qAyKY0DeDID3f_>P5;6rzwE0Zt^8!vJzV!%IqJx0?Y5nnp%bVRbdYnCEIE50 zFaF}Jhw;Zap2{0x<8}SVbti;8 z7ixObWbP`dI=%SX?n^UaqX<;Jy7qpYq#$2liJfk+kg@+vd-zcK$A;OI2m6Yf*k99G zeS=c_lQVl6y@)f5^&Dd%*{Il`C}~iB;q2s7I54E=4X=8qy8Q9`DIF$EeDo^^2Vx&YDmrMbbm%X~N6|O<;wKQEG zJsppn?gO41Bp-dEixpPVPx_=!{Bb?8KJIcA`RdMSVU^s;u9cbgFI@#dwt|tww9ISo zQ9wY}`(ciz!vw)gH4^@jJU3*JNH$7E^i}Is|EidpY>+Z+3z69*+aq`d-#fqa7P}B2 zM6MBB=EZLO{Q>=l(IwNH!Lwm<>B`$_F&P^T{rjuZi+rlXI#$lp>RV3*=m++42GC08 zbyh`QBfaN~I4f*U5WNs}jlDtPw*_^edM&;IU?1#(SV}z%VF?o>zX!KvbfojMm%Fllo9;Y@zHNbPPO$`_7}6<<=2a_!h}5^g*JNrH z&}-s>8Irbu?@W$o$^Nd3M*n>~3^0@r|1=l2pJ+vX1gxS}mslgy#w(UR<|>2$acG!r1QLb(@{J^cjPZSt}Fx zV0WE*sq6E=9T-qFHIFvD=+SM?hNA=c7!bXsb6i(dx#DxZB~Z{B|>o9#Zv|7K4#MDWVXL~1_2mv(#9*Rf3Yk+GF%c}Pp z%>e~r#}|xt{eb|>w73Ad;xV9TN2%aU=!c7*JFWcKkubMNR4l=(2_=tg;+KvJE)Xur zb=5GHZ(zi8ZAn1Bvs9Z(PE#h@U)`JfZ)H;ESbA*96XFfEg>Kbc&g=b#yYB+Q7cz%; z83osQBNn1!XrilLMv>^Jji->c9Pim%tJo}Dujcw_z^9-8#k%Q zB%@Gj6e^HR41|0~0;xtASbRGK_nuj~0dqRVZQO~7u6cwv45sZKI+1)9uHrx2Chr_V z{jcnToOA|OQO|fQR-7nr#sUhEbqZ4r8);GBQ;;j~&LG6D1Ep=KU8F^?&6v!%~ zRe?GCa#0xVW76v!y4M~wN+KIj46`~0k)q{|>e#9X*W*WNR=**avhGCI20jv+)(KGo z6_c!VoC>jU5UFv>X#>1q0ogs&La%NK-u z(C}a3(37bPvB-k0fN~TWHu~Adk~*Eyoyj)leoi#2T~eg*^NVN@NmI%JgCnu_)KdOu&!=i|8+ap{CWz>~9A zwYQ8%+GE8Q6AjfuwCoPhSQ9ZZ_^8CBiaSK@rYe;GXVnN2=^e%R>ve>(^j6*t5w?Zr z`6c3)>e3kd4yi^>;lO@ksSb>MJmMC?oUU(U7}K&M%TBdYGQr9 zIfQrvF{%a+I7Kr%NPhK3DD+zOe_o>3ViaOy>=2~7qz~k(*`jyqtUPYnfz3TkMlDzH zlx(1Dj!=vph2hSAepi8KI|5Vc_5C4;tVCaZ9dqQUdj{4+R{izeH1aVm^X`_z9{q7I zdg>v$6;U>zdig(aq8M49ag1U-=DipCasr!1YueWIgXOwGGKZ!uL`ih>>g$NjR~X2k zvDt9Zaj4Hjd6*8xbwh8ob*|M;OmCQ1Eo<6>I}^JO_){!tLGad`@R1STzV$G6L70fY zMJjP_iVqajXGsTIgwz|mB4CsF*=#aUXch7eg);|9Qrje%bitw`hY-BCRYp(ecTF)Y456Gpzbo(7}(xUYxc<>smQE1#LaPjm=}m2UTN|B z^eWOGhoegFN7_t&)@rNq^4|LdvI8#5{`;OY@S4q(v!mBgG)Xog{8>&`<)P2A}n`n%VIpC zb=ak{m}s(xx%6BpPw;b9(4UTpQSj%-xx+j4zPa&viK7i}&LHwiLe(aYk{T1G`Q7X3 zW9C296}`v`3?w73w9mI8+~)Kk?=r8~hbB#g0EnowR(nth3vSO&qAgFiIZmfQ@}TZ5O-H~07h%+O1rv)GlU68n)j_&N{e z<>G{+$Hrbksgm-s@$!*Iv5I$mjjgj`t?-kaFVHq74_Z6#Us+zBn`> zftl2+B>?Dg{&_ngR`L2fCb93*m%#nsbg6WpX2jeD73dKhV@l}YJ1IZH0Af92NQ4~# zH^RI2bB7R>ZC_L;TLDWLl@BQpiKUP>=Mf;K2_~he5A%v1kk}6fZdS2-J#%+4*Tj1k zCQusHJ|KoqY6IJ$CgLBd{RdTmg(x=Mp}&4}Fj$&*XwcVh&jtVY7n|Nos{3T1Rmk~- z$6xG%M?z{D=N(YQ^6}b=L52%D6_?U=D@3YT(t@*(roe1fl^fW`1M7x@b23NZW`D)?v0CTb&A$P7mh3;6>GlT!?dUy zcfN$l-2-=ddEF}<#sj7S8Kdiz3wgD6tmPOQgGc|M`UtOHUZ@vQ-~MQnNN&JXzWC?! zRyoZF*2PI<1k7r9+tkCM5%72GYN{WuV#Wa!#HcY$r$`u@EZ>R0>8w5rknR=b7XgQU zo&2^Ljo4nk;SwHVU1i7$0|!C&ISnd$=0mDtPlx;FI&?#}X>qV+EB?{*y*HzYdO`m1 zdc_>upj)`tnH%N}p202hl}(~D4kA;+9fzL%=d&3!AGWx&H*ipXP4!}vCA`(tg?%xw zCO&@9qrh?6Y3{14`s_0+;s;cwlBm}|u?_C_`Yr=~O0Sad=XsKKh;Gh}XOxAFZ4FD; z;=PwDIuM$^LBh18zolTdx+B<%egzv4ACZlm|cX-_a{-@ST>gdHBJTdJzGMOt|m zv8tm)5>U}lo-W0~^~~qM@ov>>)ScV&0~v=@#J|jvAzNa)X%%R|^`5b)58%;0d8*LJ ztlJpdCLa(9q-3uX2ydT0Uro^4 zs;>LY;(XZPWP-btj{@@e9A7Ob2Q}~Xr$7(fDc(e<;`~$DW>L4R;jQql52k5%aCb3v zcGW4}Rh$>M@)RHkB_K1GLXWF{z4^-h(;=YAZJg6P@N8ef7b`#MZG46zu-O|7C+?Rc z>wVYVL>?=WE9y)IzXEsgLE~caWsLn57TQj+r+zeU&;UHgf+Zru-Pk4oWP!8_JfRcu zBJAfULXdCn*0jyi+JyQTrdlpQL!!M_3scOc21;K#w$T3EXr;gq4(rCOWrQr}Pn)OE zRwt*K^m-)UiNlHAszXq#qvdXnhxX5w2kdo-zEq4r&%MrQmpuFKj$pTnuWF;m45kB4 z9HPYh{Wtqp5)a*x{$T>$+%KT;&v9e9|~p*}C`6&=(n z`S653bM+i?Piz|W)OecRHDZ_T_UDWQ3GaMgtl+Y8+75&UWZXvEExqD5I!T9@X2 z=mA(f#b*y*T;XI}Ww^%4d-b^p2@(_4#UatJT zFsy?K{LRwQQ=RqlbZx?hD+57Ye)fg-Y>kk6N8l&nUejxMLD-~>KQg6(%>}=@>`yoY zpErrc*;co9v|X2S4cY_fGrUI^G(>$MtW=zP6U&!yT|ThqR%3q3Uq!Fr%=sTrBGnCA zCV#O47z-Lu^18BGUIy;s=YVu;4fZ!?5yycAw5kD!BNIjZh5lvj-M{Y#>^y6Ge6LAV zXQzs)3SRi7#dEl=Hh=tWm4{2?&F6Pp-mcVeaOTQiO6_A5F3;8!<-%r$Kt z>`Xuk`4oTa)==?I`x_HMdk?Ja@Y#ilD8XvA5pbe@sU!^uJ~^V)zYu5ZYV9!f2Cw6e zJoS#9BVShKY2DGo4XoR(x{&CZc`r>egiXvz0PAWs!Ta&9Cjf3p>MFo>N}KfM;`IUY?h5*YK=o z4&9H{@KL6ADmM>TU9an2DJPP~fSr&LVnd==%JKpV zy*KK?fLwIUk~#TAD&%yC4eE!~uk$>>m8sX@Y0ISUOZJl0x`Fk{1v_r~djR5e3A7n> zT>{gvzXd3wU=kkWT;wy#TPnPJ_{21@JXbd!%^&u&{Nk4WXzS&+8ogfbyK=g0=pu)r zriay+w_sPwnmglI@#ugLk8Fm0&1mqG_=!uE(O!@U430r69=zp$A%R__5^Ja?o2 z@0}b8#M$%BO@LKRnFSs0(PF2JjH&U!-bUHe@)WX<6Wsln`)um)22UzVaqul{c|{w% z2>Vbc1_)SFB*F3$an)y>Qzp*;`MCftcx4Ah_7D3aZ`<+SeYuqUQDbH}{U)^8Xr_W( z?J3b;`6N%)i2Q6r_2-r`EEnttTdY?w7s=tD2_Xpkrj0$8glvFUce>%2e3ZjVOA5W* z8Rkh=Q}#>#f($wMWZZgpwU-7AEuto_xP2^Sb*iY};tcn*7p|knOzfL8WAjFbLdcNz zY5b80h;dbpl9J*u)Egjt&Hk$0){EE3bPK_ntBgS5!2kz%!}d*wdKIiKB6^>1tPnY? z)f=%E3eu>~-}cQ7ndCw2a&y-x%D7!YHHCosR_P44_w7K}hr{xA=DeSK_#b?8*>rQaa!^x=1HwrDuSz0)e((zT2sI`1$F`c0O|Rfd z>T9JV+rZGLFO*^S^1Sg=GoxI=2(xLgnxW!OY&xVWe^i>luLUyaSUa#~=Iii!{d|cM zh4|o^e#`q*(;X3gynz(Zk#NfZ65M%-xTLk~NH>mA6M1Vk{(YEq8L=sg@q&%NQ`A;1-X z8G<034L12t`JfJ_W7n=a{io?FmbZitdbOCXCbU5tgAc?uiMlXN8#0$W?_Jk^F~#41(RN+mLQm-RRQgFC zoIAi^2?>U?UDNb$DAc(pa!}Qa?>2+-Eih%K`a&)jiXK#tucV=u>m%bT0_hf zM>J(}Y%oaUR)$ie%0avQ??_G2>C8Z}`aGi{#OfgQ-rH|hH(r=sC|#u?r?ig(y|#*` z%4K&16@14<6aGZ`!k+PXHRiAEZa217czj$?wT&%+7`LP3k!cBkQqvIRtCqW1%W55w z&_DY2SgV!Q6s-DbDG$nG8{hC;h|EZ$w@?ayjpmtRv)ABY1nVid} zhlIFVz&u0L0py`VbLKbU)YDIXU&^aMUtR+YR4sqVZ+)_`=a+684njXU1t%h>eRd#5 zTKT6n`{NAS<~EYyB>xrm!XaU+U$w}_;T2yUJqS8>2j{1~H03!BN9@ZT&COCUr2J94 zbeDP`(?G*-t<}I9V;||&C`f~AbtZH$H^ZuH;+i-9j~8GwT8!p+&$FM`>>kaL29!&Q zDjL|J_4JIj)HPTWQoqADA`7JYSf`s(AGYl6b_ z>DLtgJRGJ&xUFIxYiXEOmdl!`+P=88LlA8Q*FK%E*1`{+dlsejNnmEbxXnxHE zUxD*JRS|tw5ZgTHk$N2)+Y@qkV)#(n_HCf8@7)~^kvvQlEX{f?3_x{{oVPJhc$1OE z`eu~=s_Lrg)@}X(`RSs}L*2&%R3*q`hCCT1h4J7gVu|K~iHAarw4zJYK<1GKstbK) zAHbb$$b+OWfEe~`0ery*v?D}hoJ}Z(NDnAHDq5lz1R*!UNSB^$=b%#O!k>&&?)b_d znULU=k#4Eqh468(gqr!iW!x~-FDhLmjpsQZfM=;=D7v2s`0$mhJ0w8iOUUd3&nR^5 z&G&Ii1?Tf>yH#O|uxgWhFRZ>?1_M?3>wEogNrnVE5Y=~cVy;wOxvWiv^+pvn9s(K7w8TsqNxQ>Rk@zI&9-5uCq_S}1zCCA>;kI>rb>oW(x;0~g z01Qo~sY+PDt%zydRvU7#%?enw{gPWa0e=9@&Zucn zar~a2K^ADIf7^YNbpFdVXA_*<sFHo*W`Q&zSNyT&Wwo2#Ko2UuU~5?Z$jw-R3zaj`+lV_nF~o4>bDqV5AI1h( zGx9%f8byp=-v!!{SSkCg9Hh7vd%jyihwaQKqw?W7oNq(bFxl@#Drw9}i{c_sjiar! z-%&&wV){?F@3puU7m0^Jml1!G07HaH6G06aUb_-;Oo*-(dr9Gc-|!?AQpMKT-y#Jf zEQ6){&(<1CK0uMjU0FIb+10n&Cywn{r}7Eh@%btqK$8^hzyF280vLpVc?vdrl{;)e zMc}RF?kg?NqVoag>>P1I+1sBzi#X-GPR1RNlb;k}U7F2CZat0E_;mgPh{$WFNN!X) z_Y*SZ3;qId`zv907c_Rx^!Y9)++eP#0vguuuArD(Zc7XNBY?ET_|3P7LI4pwp-eTx z^6^y+^Dy)L?|O}7X9UQK@#eDSQj~5kSc0NgvrR;7bxj*hl&&j+5+c&HK|>!oDAboR z&XCc4uNiC1L}p0opHgNZ>rE*Amx~uVFUZFNFw$wMSx2YBRD;;r7@NeCxy0$H7yN>hiLAL9Q$-r;n$kAxf)p;sx0?FJ+_%8Q)=3@HU@PB}u>9xHz-xyn;8G%FcD@ zGraxKb*naC=nvS~91{j-PS7Ml1OSP+1_Oc$s4!F<67X^VAW&wfdN=U`Qi z=9XUwyNOV-+c%bUQ`WV^RA&DD-By&C=DMQO@0U{%B(yos-*`spd#+m#Sa>GNWR0A0)As<(wn7tyAhBk>m5=J6bCwC1vD-+meo6l4iZm zn47W)+&YQ@X7>Z&oC~y@#{8?8!l(O=!3GCWyL0Fd-stQi@fDzJSC~MP~ zkZ{vTezQ~?hy3r?oacm2)@Sdh=_~a^yCEh;&dbk(q9nJ|Y;4f3($5`ZGIwo%x)E@` zBL3$(y3D9Jsv3#bcMjMuDBk~$sxA?C9ilk{W~N95Ky{W8MyuwO^yE^SGaDP~U#czM zca2l)cNT3h0oq|?5xX(>s}w4=cwB{6LP0F=y*|K%I90R%s;_>T-->ayH&+KIzdGv7 zQ%>5YN=}Wi9_vX{+c600I}_jHWRib+mnO!qu*`?Y+fH~%&j&~SCF#AWN1iu=+%m5Z zrc%y1T3o9G^XzNuJ=Sgc6YXzVRf_H{w(9P(D>zXjgIJF-(7uO z`DU~!c2U56-|+){>-5ZxXeL}S>F=VA!p1XWkBIs9k=Xh;}K|zIk zJ9UC{KR(;kOC=ZokuKT0kFibpQ_9J^bgcG;-O8p@JYen^i%&5<5??X#&v}=5gk;OI zm+PM|Sfb@qKoB$BEZwzqiPDs3oRPe>OqY>Ekii)SArKp}LB$Ss( z{U1r6_h0$+e|rv%6#Bx{xUSa#c1eec?c&ysylu;)Gu@f*Ij6L~2cDChau;esYTG85 zDmS{N;lZk-ajMfd)pyRYGsc41TYA|7mRlm$J1i8|v)+zt3jZ1>0p2OZnBLmQrfH?n zxZf+aZR-w0h-`6}k&!snuO~N{8v8L5c)hJ1np#q@r)qutia`{W$n7D5f#cCgyqRY? zaeF63HJ#@=@a-hpY=tm^%5QHLCAJ^YciYPhp@Z3+<(@rN0B*|r@kfp_R2{xJJuVlz%*Uz5bMd3j9!t zOiH6A5;ZP6m$$n-W>|1ZM zjoKNI=YzU;cHvP-f6pIU zWI${PHQ(={ZRen1Z?~_yS(>-bzI}1K8A~idf8h$J9nt)-R=Yjop=dMF96km-VT9D$ zz2TT;P|4GVWNv>K9OPBsLg^{f@*B~ONw^w!kjX;3y4>hGp*@#N1hMsqknhj~Rqj!Y zTS}_%;4Z~T@bSn7jC*-XPT4DYu6}z()mDsXopAa}TtwfA;X~Y9^skF85M4X%9BI}U zGZhe5<18jAx~2~7eJKwFcpgQUU4`Azs)x)cWWw?9ry?p0hmG2s?DVYvuv4b>Aqq6{ zz8|*L>N(<}f5u)s@>G#pc*xC@_r?wtOSv1%M7cUI{68-8wh=Msz6d6L)cnL zINu_$81OD${NUj1QVncA*h}7PJj&xyl}JSXqr`)Myw$-RZP~T*)m?JRcYn_8#-+;M zH=aG>-Z+d8HUOM~6icJt>b}JqD-oBxF4z z)}W9RqpML?6na5&HY`uRTs6}il&#~UoVs@#6fs1klE6r@MI*euS6(oULTOhy$*Kk|Kmar#7WSGt2g1crr=wu{5L;`V= z_G=sl%ROadi6-M0XjyQ1cqy@MpkDNeW%Y9pgjB14sRMADuJ+&Tv9eF91fAhl z>yICNdUOAo)%(piZsO9DU~jj**%vmeF}}$4ebY2FdyUwpIw+`aWhQN@MwHm3O59>@ zqzfqbHnYV*O5K@`u<5Xjw%Sq_hUZ&>v*|mq<&aYEZgOzD+t4FieV=T7pa(+fJ$%t$ zuNDo5-ownFip^kPb+4x37){k#k{YYS7Wj%__rnx*^yc|009@}#?^&nVW}bH5czgt? z9G+0`SZe={`0s(kITX5v`BTIex>Plr_%+5UB99xo*XFo~XBM34#RU)w5stbXwAxjAhqWzy>!9Zln0;m3Wf?*^&_r zcsNu9fN3-{BvTnY6xZ9FfxIuS>IwfQz7rTQHAa&LCH@ma_!U+@-bTVZj$NtQRJIEo z+yyq2KnxSUP`lb&*%Ygx;rm@Z&p}2aNL>;rJnW}7C`Z+jyD%#ocgr6kb|Et{;x8;i z^@*)-WroWbtK5N8f$pVc=0y;57@>kx`S)r#evIDXEY86iL*1z!QddG&V_jFZB{`1d|R}YkRy3 zr8;#L;^v%ir~OCQQ(iqRIHyO}Q7pOM?g%0euRJQOK9*M8H7QY8YsqGb zgD0`^a~WH0V*Ojz7%dL#aZdm=7ixvka_RWW;?Fx}#_?RS#6xbMr?~9?+pVU4XjLbc zXkMrK`JKuL0;uyzyb}nS=k^vHCZ68eB_7_$g;$4OOO*kYJBjy`)jqfjG4O0DpC=Z?1f-ueEx=nmpN*YE-QYxe4rE&DW%Q z5crc%(ZcaRA9A8u|3BVz_G5vO7X7rF-$!yjKNUn#^pvUR5V@RoKVZ5h-Id_L?uwzu#^RXrFU3?62)MK9sD(tOHGLu%PK^!*ShBu zf7mDC7`1zSoZnXbjbcpe$o`G7^pww$3#nNPCR@b#DbpX04(Q2R}ImhZ? zB3T9i%<|G-BDc=SwEz8^Lr1a}6J%TNZfJ4LUObXK)GdSfVsSoLWQ$9smSp{5FlATj z`+e6hsiN{e+-anDg+tG3^}!~v*Xeg3$!Cc>Ze$^u6{9{N${oD1xUc!NMy_~5%L}r8 z6kowPL`z_EUdEyj*+q^Ng`K$wgLqi!;?q@ntkE$?3Q-P?Hb8ESG&xe8T8EES9*E1P zF5I*UP3%M%gcK*(iaq|PiqGNc($?jk`XYzUtJil|%wJutv9LBTT(E)op}-l!|Ja1i z`gFNa!|#VK;*3DOa;*_*RC9AoZjYII;G899Ywxzp)CbY@_C?WHG%`vd^%JXaag0)} zju2gXH_CPPWhO!f(w;EK>)DrO$Vo zW^;9Sh09Yd^(bD^yrDBodpU<}MMkK6P4B7EoUZu)A(oK0Tl7f@X=kXxoVl z9rXX)Pwx^puJh88i!^58s zK4i%_C1VTY85>%%zdwo|vC3N~S9}@r4H<=gJft{KCaF2aa$CA9f;9U;R*<$k%t$ip zx2SU|O*619;P$q9R`B3O4W4pj%C# zp40l*#02Xz^2{&_bsmwEm5GN`4L4T{&e2v50j$)aPGvRKE%$YiI*Hctfr?(5O}LKI6(CEA7sA;;6MEMfdu`L+7lV9#~oLaBE{SVFzNSaGQ%{ zD&L-s;_XQu*x3)XPhfo$k5+_g{{1riuTcm{Rq)E{f7c*ofPWj-3035vsyLMe_o=T! z?xHSUp4X+Y`(tf?jR$mK6*fi+v{Fp%Rlde)p?8OsN&34((5o8VzPUH9VUujQ5GoO| z)G9uc7d_ItCWuk6G`EG_^-LBJx(iM?8De)GEkpdydCKjWxiEBh^=&$Pg)&4mwPo0B z(k(4Av5B_&@+PQ8qz{%x50~8Xea5ATnJ-%EfQ}|*FHC!hko{K_{WaQo=z)|C50fef zPzRfh#_ToQnHRT8Bp_D?0KdYf$+HmT-b>_8SkY?KFs=tEBd0&0iC8wpRVkq&(DfkuYKm zYa^?neV+JwHuPSq8j0z`w*N0%r|DE7^9~OEj@;8Xjbq>2kWbHgq?lj1u0s`mTGy86 z+38JseDYig<7Nr?*Ldy^6jU06NPHLsg#MFZLqe1RZ~;}i!%%jYEDrer%R)J*eC8Sq zq)APGDjgZ(HPqqq=GTL4%=D+=>bGTcAl#3$BwReH>V8A=K1+Mgj8^i0a1V+n8eX~n zZAA%XVS>3MSk<@aAIL?ycG4LmW~h_L3oPh*F7=g6B^XrLb6gzx+PSly?Wt%}lkAUuz* zRN)XVZ2{nNUD^dWDwm(($D+$R{qr3vTARh)GeFc8S2;`b^#FmDQ0f^tYeh0;hP z9Wz|o-}Z?>l4?fS{_d{%*Rx5N;M3XA{CEV($q_M^c0s94C~xm{!Kg3hcZ+~(VE${os|nEP!LWQNFLMgiln5sO}kg%;@jJC zzRPvb5e4RM4Z`I@naZ1ctf6{QF-+Rm$t|^vgoO8McQ74AC%7?0cgi?M_NUn6dNn-@ zO%-F-lu`id7Elxv50|~${zCY^WFl^H7e#34$75EQnFdD{2|lM}CX4Cxa%msg&kZbOQ0VGbVvn!qq9>}c}eoQeNG|(&QQIME2 ze5E1HPK`oMQ#Wa$5QN!Bk9Yn6r3=IE-E{*FxByq!(hXn^#nLM+O86>Q49Mx^V}&>Y zxt=wl)4QXP3{)YR4ur|o=nK2f8YN<|*Gh;9M2*%qtk_c|z+YbuO`4+Tk6IqjC$l_9 z%aXSnoA$Be4;(%qE85&M3%`yAnClHogy0uxjvy5C7Va6-E#sTN$80YanY!)?*z3>c zpoEG3drZv&r?LCK0%jWhOJ<`s^Op+W31qMtn zXg(S6?p+k)7!YaoU`-yET#w>Mz^Ra`QiNLe>mJb0&_|G zwAcz)oXmBgaS}9`FB8vP$Y!V2jj)&gQo4w8NnH>FI!~=Uk>T>NP1T3cB{G8F1;0J9 zbsQ8>k4D=Kh=rNXa-6rjvC6qOU+NfhzxG9ioe?pi>uKKAm6z)sRX*EN?CCE$i7GAybrEq}ByHC_q6 z_}c}a7JgeHRmFEQufeD^UDiOk-R2U}34)F=*lM(8Qax|zRtL}5Z-0|9nzII41Yy?d zpK+!xg?9w?5Bokl@iTy9J3w$aaL;2LqZs#;@*}21?!)sah*_GFqUxjb28b9*WLMTt z>v#`Vk?(SlmlNcW23F%wvg@Y|vA55ck|suxWO_fph%DH3(Z)_u#78bXABj+I|4Qs5 zz$V?XB~Cz}z>Rn+#RRf_>th=Rl8?Hc=tg8OjZsZsJ-K2N?f##-g_)q{Mzf4)@%J+- ziN7s0)+EhEHk9Mpm3EeYYgl3);g*P1ML)~^HM4cwN>g;ktE33pqRk^2`jAo6+KL$+ zfF%<4R{6Od<~t~Wy>NJT-uIfboK!13z0auuFvU&o&%AU3q4uA<=FsV{4vcdA^i%s? zPc5}F24nKTuKZ)Odk%_^)It&X;7VLS$xmcc0@R{fi(o$-W9k__SCk;jRME55n;!ZD z&Mba_&w_uBz0LQcPJVPh*w*|{*a6sb>r{xD{Pt^V#8Z(BksN1{YcT&tCI6G7aT4qc zD?HH}Sq$#CLsbNDX$Y|$frVOqT=D*3Zda#}&}zpht~Olaf*5C{0@g9g%<9oGw_Bii z_KX=Ct*nGNE2J`7CK@VSP>Uxq4odueXuNo$*{oN*%0@$T^?C2N#nI=M#9RsKQ)WDR zF8G_OpCNY&$?}%y%Uf#K<#m~|Do0_t))}Y2j(`j3ScrF(A71H-7$5uZZs1e(!tQc2)zR8f>1cB5I7yno3oHBV3)b65-9{W&QPbZvudn& zeEeqnBV4NK68gKxe2yK;1z?_h&(G&wLf`M@gNe*~&ahP`c7u8~i?J*gWhF8zuFtcwSaGl8xM(J8Ws8*P!Tm-3wcq>i}{x zdrYy$1Rk4Y?KRubK)J~|Y7UQt$Q9c?Cmp+M&W99?ea;3hta6<4P-&_SnZ(65j*LBB5Weh{cbZ!ET!u*;-F6MJEY z5gWO|!}=IRwNq2zn(a1jZKkSQXuzE5yA#yj^i3hlU(8In|C_us*ulrma5S`ZC^d;y>3#n zy#t3$qSuvFF5X<1Q=`dsn>2xg~|I~2PZz;FK2K8(XM`Y#Y3Lm1R~EAkNw|; zGqpRhzix=!b6s8_KfRjuiGk29JY=6jn<(QvZnUG3bV#K75V`H+gYr9J z^UB!u7gI?eH3rs;7L%%QplaI`wI!u1C8L!3?F%4#v6%%25YbPT;^cx->-%zZaxT=8<+3LX*hJ>4g6hO(O-F^rX306bT`7`a)X7*mhju4 zA(+ZR-`81PFt$99UP9E(@(kp%@$~v5J)zlMX85WRb<%smh_E`V3$axYkKy^}ARU3u zE~x~y1voesJNSuNJ-z$a3FzNOCc=*0^ugOaPP`ZP!VLhw(Sc0Ia(&$mNl?&Q>+n}j z-cO6Q+xXAfmTE7-#(iSZQ{$2B0u62V)nBXrwzHBnU1=ec$A)A*tJleKNH34>y%r;$ z{pL)y%`8H;Lx{1DOHa`Mt^Gq3N&c%X6tV!Y%TQr#8mrNno0(5QsjaJ9eO+ph%xR{LrWbv4&z4p@*n95pb8yq%>Z`G z51TzpU@sFsWuuV9HAMAj^;;Lq)gbxPAD0cQ27Km1t2inv>@g!y-&l>1D!VW~+*1)H zq)jH`aW#4={eRY|2mf`S`L`Z44?3XM`nx%!j(!)uufK5sB|14Frd&9H4v}o;a>vuI zq+zT_J#G*wCF6N` zh$8v-gf6yS(swUP{Pf-+|L?B%Zmt}|c8ES$!!{ct^gSOo6ZMVQd`@MpvLI1YlK|7E zx1CRvqu$fo^1!raPVt*+11=OcDvWc^V{JC8ZkUkoJ;-<@i#^BoTIUS|B!ba`kvplW$slr ze0u(~CdW1G`NEugkf*!sxf{&vG;8@QpA&X6MJZKL<~bB!zL_pC_{C{+AUa zO0`dRXgwNeNcAMR-4#&h@g6^^BAp4qhw?p!h83Q0c!LvF#WD_V+id1^fdh63B4I#1 z(WMFFE_6HE@+kMy`C(ItC}0bf*WDS&X2WrwOAP!dCR}d|d%a=|6DcW#litztcZF22 z&>#6zD2E@I56ILXUWNbxond4HB8Kf9bO*xWo>_tP)y6W`=R9}44F?WOQ#cHizxDL{Xg9Rq(Ky`>J40k9AVt8EH5sD-V;hE=K^?VCmm z!X_GQ4@~G&4x|(V;2TDgl(c&FFt~MX0n)y*Hf0$LU79OUsJR)6TYpq38lLbVFt_=~ zhwxfh7cGw>mVLFc^aLdafR+UlXs`Yk4^v)|$zTIcN-1^g{7eSVP){%}H*D1o^itH2tTN|5H8 zCdI;@w#;xlQXp;q*zrZgeedBif-crF<&inCfPmKDA+Wya%+w;2*!Z&!SB7$INR(Ag zN^iJ;oX?6FI7&wt;$Ya}$wc31cdz23g$$Jt2ooTZHn_9s#0kzhw%U{-O+AR>;`l5Z z!0?)+sx>M8^iLWkV8I~C;5L$NHMzamK`7TL*^0FXm=c9Tg?WdHo2F=n4jWv!PY$7NDkY&xfiYf(5yAP@hUa?n0!%7UV*A8Z2&n$dGI@r2@rPxgb#kz8nYH#Z``Efo0|tV zJ)t~QhCG&v|LTCR$uK8#{?G4r;9tKR8gPIdi8A}JEA`G^#eg4ZHuH14={5L^e>R|) z6iE%@^_E><|FE{{g*U$eUA247Gm=gmq)1!E!9YVYN>Qi-(2*}T8gXe!y#Hj6;xpvK$YN4ya0*I3lyBp>{ z%mcDRWuoEe>i<+1fkVME;BH7ZZX&mScq~4T0YhjomeFw^WBZZ#+TzUXwh@9-W?D!d<(oN~T7r5}KeCER+f>FTa5v ze+J44aKC8hsJ8FyyIilQN11k6QnE5{J*l{uB;F6(6eGW*oS7yPs3Gy}8cja$e1qRq zdDCI4b)N2qzCb^AG=KYDjMK)~!=QQ$0)7k!If_nb0tlmUi(e+?X625*$IW$oBs)6O zwYM7gavxY=%!2}#fdq5!JbFuQgxAk|qb9Czq)VRL{?t|_G%|Kb8L15pFv<*$eF-Mf zW%``1{{74B*?Hg=$Mg|nxy*|w&JFXE`dYarAL>k?z$zMFF;74{THGz4O=1#Ro5w*B zZ%p^o4ewgKE=f=rl<!trRl3PXm4)a|i!aD* zV6-_wt7ue6^mV^`Ny2@}O`Oa;4q`x{A2588)r{xj2rGE_dg$EOHA7a6u?T3 zijW0}n!*ow@DKA|v_IN?(^r$d|6M+NG7lcC-f z0@aS}|Lu>ou^lGtctR(@dl*BoANiaoo;laHsV3zP&~XdgTwnB2&K;co6Wx^sJY^9b z6puP|c$NolVB}~lVzCSQlrS$qUwyB1P+;qxp0zoAd$|f}Up`N4eu(gI%WN>TKR&)U z@dLSq`1S4t5FxHYXXmnTg|Hgqxb#u*{*cQJ&& zK3da3X1!5EswnU+!J~I=iZ;`}KI?Re{B9%o%_Hqj=Sp$#qfNR)WLs$HF|nePc|b_g z;~$(%4D4E}ZCXaKNz5mK2v{*`={GhA5nXT4$izZCuJf;a4EgTCoD-0Ny<1YsIR))v zpIQaB!J)>e)Ef6j!1A5b(0+1JC?0tRL|L@?`ZQP#Np6qE0X)TdznGR*nMO&7cM2SC#I*w4@fJ(~CF;x%`fO>+gS=5ixam7Pg0T6yVQ?vQYtk2# z`P4hD6dCL(;`LR0)#3TyoeclJjv2*t7#>hBkL>dVv8jHDuj3K-xeZs3e|!SomewDu zz5m^0@i$md`q8jl3e+XloHoch3S!vq)`?a38N9t7$BH@V&L9qttVchJtm~jBDttBl z)NZ2Chx*}8!d_#XWvnu@;EMvPU;T|}^B;9JL8*{*9zc-kVjMr3w_^DZr5IVs9;`bI zed1)3&xZC$n>2zL_ljQ**Nbwtz$`1P4TJFtfk)RnsF|s*pq-21^6qA5zZW@NldlRM zi-s4A|9TzjrMgXVd(KIh?my+bS*zRz2xuiXSDB>2@AV8KX>5eo23?s_4%u`gv8DQrvN1 zeHLNhtB|}hyMs}a)Kxi{00KlDCdV3|{runN-jBY`Cg2^%65XfmS;NCl5t3`jq;5HV zq5O_qqOpU>pp8b_KoR#{(z@h0o>c%@33KxKQe=#C(+5 zW6uQh30xUa3Ay@$L1fE%;Ns}dIF0Xt`^*09SgG}Ys@mZc(e@7EyuM%YqiC&zES9C6 z`;!ZirAZ631ez$M(#M6}<;))|1TE)8D8Dip_ZShf5WiuahJtQYmlYMVKnY)nWr$fs zBnpkEj87tObZ9XZ9w%_bO%(5G2?`y2K3VEFO|V~#J9#|J7L)9r<{|aZ$muT-z<$pA zOI^Z;uN7`~zAAw)bV0Uq%Zu!vicO5X$kWc}7i74|M+TR;Z?2u#9DK*RR+%!Cbxpvp zv|g*=ui;;9e=X|y?Qcs4{uouR^fGBdX$T}5_4XDBNO;D6uQ7zT32qmkT$ENSZLW_D@f!k~=dT$G56CRQY=2&~PL>nXRv^%i;KRJ_;c6ZqU~b{G9Z~uNvf9W_nc8zg28Jp}j*5 z^EL@IrR$;U0{MNkkvrsH1q#)<&)rNd&R+uwUsa?Y_lonIIo%m8L} z5cL}QEDN)95C$2nufCS@qJgMBC}Id25dOita~)!Gpx|55NjWifbkG;83hG*{7Z3)0 zas#!zQQ8oRfxG(745>d?RT+B6*>f<2y-MOs>Ss0<_;vz7SSmrq^nIy>RX?L*C=jDn zCvWI=7O~<6u4mGM2pu*!K}wlcjYeKNdqj~vJzYbnedgit{T+8t_b8s%9ny+Q@q1hB zPdDE-adNrsH*yoh7SqXF+Jex5cWGsp9NC=z8I=Yx2BbA{#@35}oYp&*vn{9BqF%vC zgIQ8U@yyGCnKxe~9=D|cdY(SL?qHO@sXFp)Z$4lzaB8F8^hZorqvCG9`0yI6bIT^U z<32y;@O$>~QOavM-3kU86}Rb;-Y=7TkZ=i~E$=z>Xzj&AftOB|de&~Gy-S50j zvZjAd&jfPznEK^IXR4)F<0R6jd27E>Ve`|1C}Bhl7Vwn_y11Yyc)s#cVJmuz@$x8) zyB_i-^yd~372QB1NOwewHN4y>)I7(h^8*>d$=)q-tkQdzrClbqF6-f1JIJ=wRQ60H zczEjI6AEW@BL;;VSnORxxdEr)k38emoqdh8s%Qjd; zXzn_a#6}#d_^BQ;8W23Sj8;FY4_H!V&ctg)c}}hYZG6b)912i0ad?+G588mLpC_ng z^k67Ebk=F`>@da`zk2*z-BfDRkMsIiKae5Dx7!wD)l!edNAdlYq=}O4 zPDDCofLrw*eh(1eHX~2c+S38EPL(>Tc<*tFjQ|xglK>Sw@^J%^iN7;l{~s+twSQem z0t$X7lEYqH&DtiKX^q=sxI#e*^+i7!YWy-T(;2 zs6y*q)SJDCYhpYXkz~eo07MepwdPd+k?em&MLuZ|rqs9?YePCbbb%d^r#oo&p7tP1 zx&V*{vE@U3mWE&0o!*&w2J-X7O9cTfOaTS~vcdCo*+K3!#&bwmpvR!cCQTOywYlo- z@q*ptJ!kJ{)DnG&X0(G(fEOCi6{7?_S3SOpt`QgB(XFrxyw9fpV{(QqZUMDL@QO~KQ?-K;PmvfD?gk>%6hMuxqHVGFeS0T7WowK{ir=%H z+jWO%q>kCYAFp0s2D&bXQK z`~p$DrwDTAylJd@2J}Z=gQ0fPH~?l|nOCnQ5~lX3t5z{(Ibrdp-8|pS7H&y0GN#KJ z8x}2I`VnG^9q64BWf91;r+objq7Y6Y0iH0((YjdA`u91PqhanvxZ6Sj~(kRlWW_-+|}gNqs}Yt z@X)9dS4jITQxJZ z1WD5kN^A3LMOa$e$NjWFZ_eGrwz{l{rOPbqT+m4b`#b`wg}2uj)nJ66E3b74qMySW zlzfp6Qy3@%)8<;{x1aZy>(rlY< zCTNj((TF*^7)uT-eW-v)QEh3j`ih3G3(BsKP{9YIU;IBdqsrUamg-FxY0 zTK{>$6Bvqup3cF-hoUrZPh9CqG^s;76(b%q+yQu;T6br&P~ukp6yqGP{+*o#1&IN$ zK5t1)CQ)IijCWCdVWja&(W0DcEJ~(*?p!AZ6}wO;QKd`xENVNX!aG`)Vvy7~c;2r? zrX#Tmi0utXN8vnGoIO?PPAv04OzY4*GEcOK1OM6x7hmDx@6KDhoqaYy^mMO$&->ys zxnRiek691Bf-$HNPv;7uLc1jDzGHX&^=%+;#sYIre=g_L_P0S#fi?RS4Z*A$C%t3t zj%#bh`LOfXTwCSkceA_R#Nady!Zy*6Hwu zUUA(C{l1v3h^0ed6T{j5``hU%tGE>gb;>ss6so|vn@qSp>~$S4Upp<7GG`1->aZ>h z+Mg~9>g#B|X~w8Qv=upnoP?1=GnPOOV8fOO7||y49_eym##Jk@^?*X`5V71m1!9=6 zY+V4cF80hRRwI6BHTk}jqc;mr1t7n<8fGi*u$veFF;`ow!i=t@-?SD_*=7XcERq$9 zRP!=h*>b1n21(?x?F~xeb|Vyxb4fj%J7VgA39xQ20+f14uvouMA$tbHkLKTF&a_HB5ojYDqCN4nRMjfYD_yovDQG-nUrLcP)hl0dG zBfBB4tb)GYq~y`zU~9){(>;(5!O)W?cf6K$|v@p{xKuMZ;#42riF%E8}9GVfp1%NCw# z4ye<+d{NphfMdF+I2StTR0dm{3SNg*GMrohfT=yoBL>kXFaP6N7F1^Hg13UwD7O|h zMD>sp@NLd(zzdd_!($Yey!Tqf4HUtcw}I|NE40wE;&|@BMI1r5{)ke-*z?pCh>_Cp z&Iz|Jagk?F*X#L4+FncXXEatDW-R9T0&d{6vfGJks)6X4ZOqkvwVcJA8t$n*>j|zV zfi0=s2kr7Gcotcq@}G@8{+{w7x{^WCRU5S{_R*8!Zyoj&hFRb`%7K^#(aFEr)+JWZk-zpXX5;vvf9WG4HN6UwV$hK)T|H2l_04_r(RH zyj_bE6jdYJdzz&HcaQH>S}s4*_<`W1qI{emGXTQ9;lFpFc5U?`gLqmj1akZF0gUko z_#PyB{G!jK)v$=Wm}B3~gQJ7;L(ToZSx%H9BK0C z4Qj?EM_#_i{Y6xn+tX|6qZ@AFw3vy}dh+)@VT)u($hXkaIDeEpG;|leP;CRg#I8nc z>)n~F|Jb`(|G-!z?JI!z*~@$a-@+m6U%cpl&3?O=a}*CN!7XofSZ7r&ou>rF<&R*6 zr?19$JWneujk9o$y^z9(+zh;_f}N??wFA8ME87%`sI|ZmnPuXeJ@5li_JzHr{(Jmh za$Z5Aq)s#%y>)*0J#9^QEMB<0fHrn z&KO&+@_@zf&j3A-_G$qN(d2*qTh%QxSA+g>1T7z$19Ta#)LW|$dMLXnr{Z1jUIvM` zw)&ulW2T}8w!3?!np&z}E8r@iMnHs$C}gy|Cy++2=(1;j4zba?#Q9NS8Wc2Iwj1Vo zZu5Lt+T`N*R@SP?t2Y8C#L3orqiTz$pe=;&Mi>^E#=bB*BICj)v=2nM6XT~nnV~ak zX{v={K`MvKmwrE>0Wi`tf3&#k?x9n9A#E}oF;~Ms?6xEC_Rq_6$MOE69qz~RH|5HT z(wg&9#xhc@__9~Pk)DQquV7C55Fj8;!!FGnEM6fbnotrhs=otCr@pIsBK-Sr!OVyKVhzK92!>tIrQo*+NXlwwkexve&aQO^3+uaLAJ z^FCNTLv+dx97nB0DW87q$3CW8>$Wo2q^&*n!oB5dYb+|atBj`}D8{{TJ-=+r06TSr zL^CEsvKIm$9lS!-!i>`Pk}n?w zVo9KaRWC59liF#l2z2Rj>izNW*G_u3qSD;>$Sd6MaHto&{f>?zCWU)6O{5cUs zvUlW>_F>R9T_h>fhmz5dUXr}{@a{2?=?T83pfE~}VewrRv;J_0@FihoOQ*eEc*D&4 zzHR$-6GL%Z9E^X;wf%^7eUhWU(;=LdJ~y-(kh|k*M^jY!NNVhUW)uf)@^6Yj$xLDs zHo!Q%Duh!md#^CNxRNxiw#5i*1W&*cv1N{_Rh#q}f)ekN+V$hNxu49rF9@4kw_iGG zGI92@pWSJ4QZ?HB+txJMRal$Sd>d2(P(6$D)TablQ2w2#1oi)niE4i<;trTh_?rXk zy_-^)a~_0z%n*>>?MdD-y)pVy>Ik0i!hch$sz$fP9}%OTHO{%hFX3#dUH(L4d99jr zV5hG_#q`JKbXG$dDlub>P}~PNN;ch;PEwA6z)sZ$=GfZFox^mC8}w5kX&Eit?{~hL zNP8HPOPcyfIxdo2KsK{%k6-d}+czm4`PKM^6k9~pg{U=;HhBa%aI#i#HUfEUbQ@sf zIX%>wd7a37iyZmXF75%9W7;u_4p^M;i)#GnB&L3Aft}F9*C+=~YW6w`j&m3(vq=`) zO)M0RusWIQYMx8L-tdn3M5?u~a_?~0a`3w|c>#A_@-(;%`(#nv1apQHU^rMTaSdoP4F*kfjLqi4eLWg$KdO(w+*7ll7L>oM- zzq`{Y6J0k~bXaV>8D^+g$(`xqFj?9(IiKN39?VDa1l>r}`Aj*ox;@m{ZA>o>dW?-= zRU=Oi$r%0VmI{1L4R{_dZ%b_dsO>D@V+Njb^Oc{ZV6~#o;5*mQGd#HA2wR^lV!)4* zZJV(Eol_vL82pjC6y9b>9OOdYei-za7}&Wu8PFCizXKck`pyP)W2lr-I2`!4wMx+y zSqNQC%~|ZIom2+wY^}ZkA1*E13>lk$h|b+8e+U0TIiDYJq{}s??TgA=_#}qTzizna z>}+KVIJ=m<9ugvqQ(eVc&`$ zQ-6K!gi{nwVT*A0}}4f=WKGC#G)Z4--Dtwmj(`YO>3%5 z7m)#eQq0wlT#dg%KGqjOH~HmEYlyLx0?en`B!H^K?WmJjxjT>6Jn}?A+7Nez(@${4 z$B08R(WR&tfEJ8*p{26=B zG_P71FSa?g;SJjaO%!rA3rb_PX{hnkjTUw51u8BYMMH8kxlP=}AE#{?xErS9(Ow9AJ8C<$m+&IZ!Lr z_NT3T%~pUkfXKNf&k!A%K?xjv@E;Sy_|)B=>V+I1H5f7vI?A#T;9LG06}J_QDC}cE z-4w*v4l!T)fd(5Sh3WC`hMBfxQSHVI(XV=xn;5#oSDLrDw7n~{7qU3*oQCAF5CHB? z)DD_w*6;j(BuxiQzdk@CCzjaahKCh-rnxV_zK|{wL%qu%60B`7ONAK3ztU9#!_ev7 zpbrb0PJNSgcil>*o$h9LupsipBxWK}vGv;7yI$3tDkvB1%Xr<~Tg!(_@}aov*{soU z*PK^e?_Wvu+{g|CBjz@vgM)jH>z{}h_HuEaF6Mr~ArNoq;*|cFG99A|+PYs5Ba?j| z`a9spdE&|BW+J<6!4>ndaqv#PA9pCCXe?`sDssQJb25gBsl}Z4fzQoA7s+z%RA#|8?F@*9{YPhBEG)I1EJh ze(P+@K#n`lq)s>TWGqJtr4aU~fmEbM!L^UHP1o%_=zFBtr_D~%NtV>s+xJ$Ci;nI~ z80`Uq=_P58B*;P_rT-oKZDpPnKLnvs82DL?IG7H;3;45Yk?!^5>G3O~pxNkC^|t37 zpXFe7{q?Xfx6fow!3KG&A`}>22V*^i3CJiuT8|nHUy-TH1nPlW$`P5O+b2n*V~yF9 zND@0=k~4YRrj>k=7b_xt)!YVKR|V`h7xNmIdGjxYe0`cN^!XD5(y;u&nN5OoG$CSs>GW}dU*LW zlxD0gUw~9Xkb(bE-59dsx-af!@M1UNxl}GiWXz|o#H|YX>7&xnJAbLUf*8>Z`oRfB z(UD6KM=NiRaeBOJjH`Vtuldu&($I$~Y;?*nz|DfIJMN@qY%v-F-sv z3{Sv|HStVIX`wdK5X9KD-`*;z_web^?GxrQWIFUhqyWGHc^WZiO=vj5$K)UXq9dFDWH7Q zKT4m7lNbYsSUnAu$-C2eGeNP2>?nf}HOxr4n9~g2GV+q>n0)V+Ma&Ov@(}LlM#;pd z`kVwpe1qo+^%tkw4*<%n@}=Y_pFn_q8VT!pVJwvvoOl#gL_067r|RlM~G%a=>qn;=;{d$NGpIipxrj4I8VLOqi2*g&scBfxNV z%X_nOH~@DvA1yPoW=PU8$rm9`8F%=s!7k9$G^+1kao_LsQ+JQfE<$WZgZN@h6L5-F zETu-57k>oU43#*HtqX?moY$winap^Uk(PD9C~LPqAVxO}(Ff0RX@IqE42mF<0)P^i zjod%qtOWD1rg4}YENg;*V{h3wPO*D0roVidjausidrVDRX2ZGh{VfUlC7$fRt}jg8 zu-599o|@^Vkz4d0PR94LK=pjvXkNnVVaLtQ4D3cwk`T?BKP7so0u?!Rl%CwQMlDZR zpipbC4~$)FOhh3o*jW-T0Ipt%^oU*?@4h>`J|pR)XYcQL9bMgk@w%id9i&_#8E^W0 z6jp%5TgsHiWM-bEh+A}vyyV;cH29<5CeS9?xclBwe|Z&qxG)$pd-}L9bj^s9FWt5H zLDS^=lVkJQ$B%;&cKwcSY1e{@E{0Q|p^r`NYTu#Y?kh!*TEd%KtRr`DTf1D!T@WGP zW;>P2auocJ>798>&lc-JFRpG|9Q!eVtO&#eseK9c2wWP^18dm~kq%_NRu2{{RB1N@ zx2*P4xt4VL6wk1hEKP1uRz=A=6pe6IR)`I?U2&bJNlg9gH#!^rj=c89$a^{$i>I&y zjT`r{0Gs@a%;Oh(2kUx|ZgK2)4T;X!he;F9w}TO{2Cvy9Lhj^Od?=Oca#^X~`80kF z1EU`zQ_2^`PVytNwsO)eX>TB*7YrtID`#6@1}1i=u;%9~^p~lbqzFYwbcW$XmpYvS zDtY~d%1{om$@iJm9_iQ5%OYigL}-{Lm17&_>9QOi#&J`sCYW<*2na>Bd(L(dwRUk4 z@-oGl7ID(yOV8uq_s$FWxj8i$V!UO*#qjg$BQg~zgzw6M)UN3xiJpq(gr_jEJueXB zUZ^yjJv|8m>i}{{@AKD2pe!;s51%zKP4Kd=&6%5HQ+s$0pDw9;Gm##fBPC|?h$D_3 zdBoAz$DF1LMJumQin#zyp&S6K|JcBFq!Sc39!Ub>ict?yb-b(h(D>i?6Qv`vnLrHy}USe_pvy z>A)YyF_eMJaNtq47aruEo;;(f6A+~6yyZDfsdleeHPiM-wvWD{BLURHGN#W&wS-t* zIiHX6KC*?jDGZje*U5ZNFV1(Ffr6ae#!_DyHmNPMDYQ;L8r<3Cif_iL>~tqNej=cCpGnFv^Ge!an3 z>n~?>SX`V}{Jx6DUm!GW+3%r3^|9v%LjimnMRO(4rc`Q`7Odawv0pp7E!f}jAEM~L zA0n;9QPN{#rC+~v1$US`IgfqGMigiO>43AhrkZM9tXvn0ybO9FY@xruyr88K4W)XvrE0l;m3Tf@O zZBSU=CJp%!l|p!!Qkgew2DUVQ?3STl(C%tabdgV5X<2jh8Ga#AS6>cD+!Y@OWN$3a&=&SE=k>K$lAVz_F@Uh_!pm4-yZEYD{pxbF zH#9#;hYtK$VLHS8 ze}DbgG+!&h?44~CEW7Q+`#)NM^bs$M&8^!8-?#YAcPTD+NnCO@&#Q@q-eYI~&CMgW zo}4s#vs9zsDh_pnZi2bo>-N6XLNl9__bzy8CJ)NJ1^W?bDR|=WJxbsA%KRr!&J`+R zF3?^!!&qP6v=x7ar^pC$+ZR3oU*x@V9AsYdmM3XW2@J*qjqQ&^$AkM7l*}qGO`6r^pyw-<2jKpbBK?oQ;Ky2Y;eNWH!GiM#)mhNYS{-2xPltT7W*f=)U%kN7K&Y? z!#~ZRhj7QCR#VwStSHehCZlFM7N?6*AJTxTUqM*!}%SL*sy^=Bf%`+Yd zJ$HVXQ$HZ5h-H4R9+E?mdrlSsap`tn2srloV4b(7lz)=R?~-^d%04ymk&QUycFLLg zxBm{0h^OBl>i$q9JCk~==|`LNz}DhDr%!T+dG?k=!Y82X%3NN=A#dBeO^O}O%pd(H zReAo1XA|Iy6q_fk^MUd7$)6JzUh^``m%JSM?`eA{unelWZ#r@NMcC#2i zg)71d!wZ$H6kx~YsVx$zp~7Q7?7|nmr}!9QeUJAn8(Int0A+X2fRy}C6Hv%)fs^f9 z+{GiNAVAqyf@|)c6p#)b=bR1%3YYCEq->5Fg17$9KUz&}UrY;rtZ$=IO>8sxs@jQTIuCZ~7UMw1K48)9U1CqMl zbrt`wMCH+8m5wKqDkP*b%Mx4Pm>Fi^9}m7?kvhzHvB$D(dZi%~*QkTGLN?Gf!px(M zZQd#SGAZ*{{iU(BrSK3p@~mSRgp<~_{W{hZRHo(K*lN4MM|8`i$UXxl zD=TfhB2HLQpcBqB#`N1D##&3S-*y8k4l=h0**)sY-5ayIiOGff!mOrT9vELXUX=iq zv~Hb9>)+U>c93_XPzRp^`I)dm!EFJcrBA+l=NJzZ0?wG6&D|@^4j)eVNaSL(k7m_p_G8M~$>+`# z9%|-a`%tg0V+@$9AAmb@9B6Wx>-h!H=g#Q@iZnceb{MfJyu>CGr+`Qr8g%Dbw8H8O zaGo6%=w&Nfj4!qvL-8$nk6%j#BYZ`c`Er@jIx^_)(T5Bd{LEOTzTDbVA)p9C))*^L z%usxw*H?VFO1-TY__A(T_6dkpqSpG7xU$lBs_IBtLcNlNa65X;c+%EgfM%fWP&NTE zy6}L|g@F}#zFMn+pGzO~$msd3ej>e$)R28rJX#xKB-ATXq!Joz{J{|e*Ng`DrI*II zNbbpkQ8gq!{0l?n5$S1GFImuJsuK3a1+1llMlm_(cxji+Fwe|> zKMtJ29N2f4?YU-oAYb~V4xnO?shB;q9f-&FDidzHEyUR2g%)J0cMjGX$m1kiFs2C^ z-MR!-CbP+qKh6JiLRbF$ln`X%oYS3;%9MOA+v+>cHGNB?!wY_4v{icyITp!{*VUei z^q#V!s8>!JVRI4$3`xnS?(s_wZWK&uk4btI6A_a_-mwF5zB!`teT0wYg?Vi32IuN^v~7vn2inNVzOOldIib3-@Y68KLg`#d@3X#Ao z{jDFlLZ0Az`ZtO6>jpE!^*^yQ!p%q;tIre6*T9mQ>#qi%jx(2+PZ)GQ(xtO)ZfFPf zwlzMYh$f4>hzY&e4m)>5pR7yaC-WT^t9DoWKWE`w5{KW(RBmGaTm&s=+S&Cm+1)hL zj;c$ZK6=4`g>2xuKH%q%0l}Vu-3@#BkW>uOkZUVcT`p09fdjJ({@ukQHh?-mRtHA^2CUMZ`>&608 zASUo9Qy}MT3gxlSq=92Nb+!33N)T4{bUVZOAs`n3l8we3MxaW86iVDx^&lx_g^kS+ zR$<{elH~(cmetuif7eR z2MyggykXt27FLY{lXS8bUgoF>$CQ&b1XRE?G=U|ZrHu^3w|>!zl2v<%Y07!dkqq`l z1FUm1Q&w)a*AIsh;@TiBzDFzH3}HD!*_mZGP)(Dsf3v}4%Z<+zJFxMUGF zZpCyXu!xxDFA}u94WTHWAmyXQ( zRZZK?W-GjxP%NSq!wNJpRF|7rVr`1hHZc)OGK90#U{P6UdF6H%T4{znW%YulNnh|DKz7#0=*ek_MmooJe<20|Lc|Kii zdj0Am##S&8N!0}Ec=*}wh@X!E{CB$=vjKjlyCf@Ydbz{oTS_wSAp50B_k_X4)?;H* ziu+$8#}3N*Q|#xg?}A$Njf5<=57s!Dmd5-#zEco+eM^PVt$<^-v0N9Ly9_b;&`p>o zz78cHB!TX<**xScaoB$%JoLJv?h;bTpQ&>?3=jyrX70pvs@l;URD4S`=ghGCjUG#h zT1$i1b9<(viNnh-hcY01O?1^i&rYw*SYo$0U2Y&^HXlozl#!!H4yMGP8g{yDHZhCb zxA~1tSYB_E3xEH&E33q|w6b0Hbcr7O3Mao-{UNcFp|X$sAgJ%+p?#AT=~o*yh7CC( zOME=DUo{f#>$*|Cx3v?S=e&VM=~0W;dA}UCKb-S7($?z}BiVpD+{vBP+RAphpf`gR>Emlw z+B&yD*==-d?FpD=C>KI7Ycs*s1he5!TIy8bt=3S^|9t6=! zU##K+?gjL?UO0o`(7m`>Z95+}bCWN7vsL!;G9Pifx|PD=?#D!W#JU?}TSa$ivWXfy z;95H|x?#IBQCpnn^0!m*zp(bd6*tHHVmbkW_OKlHm) z_}k82q6CaMj~OhJ<(1GhPwG_|koC@3;K^Gg=~yvt>T_gtnx7Gh_vVinh2g@l`I zcGO0VMN4W(iAO(gctD8SkZ)U^J1J95Zwk^LnPXe1@9tqIspa3|Yh=E8neE=Z>mP|) zI;|a~hJ%G9fCo07fm+WPf`(+${23B-6dnbCgJk{NRQ12!RlD}DSkvChnH+Nq?<$VR zBxGCisvR)5EGEz%MY3LT9j$Ec_x3RODjqX&BE%KxomH+0Ra?mD>Nwtj^l7;rW z?j9MF!$+6wZ;Nxi2olFbU`EaK9Yw{wnbb74@gjW{G}a_#%6miI2mNf9J6$FoKWfU$ zih+yJGnEAQh|f}d{p(?mu*FC@l*!QOdW~nwnG>Obe~>J2{TAkJl4mA4@T|Z(70LH*J5`dCYr08W&M^Kt#NK$C@#|rv$Q-%EvI9 ze^^Er`{m!v(GM27?!nV!0VreCj8={nppIll2frVk+h+KH`gT2D68VY@ zxk$Cr!d}m_*+iwdHzr>qxn74%3gJVzjZ+-%3tqJyhOlJ|qq2NM z8&fCPXBWI9GHIa+JvG6l)EMYd`AhQsf05|FQa!13W-Vi>#fR=;BY!k6zAO5GhzPIx zO^b2FWVRflqBD1_j(-R8^!!VF4K?kgltYWdjkJF5X_r!Ex(ifEtx^>XFi;X1Fi*}|JUE)XFrhHD z`I08*sA@i#2uq1WzUW66+E{~@CdNLv`_-U)rc}~@+w@u7V!?n7;jZ!RJ(rdUq`lR^ zl5g?|b4-bkvXHfa!v{2mi{$zR-F`%bDMPhkL2rDhEk)N>6(*5S$3~2Dc(2p zL!_@5^yIWl!!c3%arL9A4aKpV`K4I6`j! zCiVy%53@UR%aMmM^LqL;PGu2APSQ@75Gvr-5R{VYLHT5HrBK#PNw@HlV!hJnozr|- zCSIlq$b9^V;)W#%vSK|a5rXrPHMcjD zF5K=g{9G2~9)%xZ)=4xr)vlJOR9_EUOtf&Ob3kTgwb)LLp8RKJ(y#2gSQF<&O5A*g zC5s&~IP=zo!xJ&j)7AsszB|nWKl%c$7qI4YYI=MrVMiD+fQE7SSSOmlRfrr8ZDU4~ za4~kvKf&__->?8cV~G>Xb*A!BBm)NaCuLAb57|0XP*?iy16lxf_PR1bce~kb`x$6} zFzuW<2$KO)`GORWga_W~Z{MNx&5o1_WY=PF;2Ti zw*i&FOoi~rpMok3v!hKbm%f0M-ZE62Ji?^>MT90~Q!SK#SlAdLr~;0j?Wghs{_&z{ zCxhWKwGOP zl8q1g=^|hYFZ{ba@4r5Ef75R)*%|Zft~$paeb;W6c{&X=KLtnR3$%%x5;Fb9g}>oh zJq3$RK`lwB$JT!^G3h)$IKnN4(GLdr7y)~@8Q#OVFNyF8UKk>UW2wyk(bB?q#xY`R z?@nWYh{}{=T^E0~J}-t6aVj@i@CRTP{c!Qiht5jj+PMCGE^;E&23Lup*NJC|o3e;G zyt@6{Y(5G|ocuE@Hv|mxnTsu6@NT$?i z2JWc4-k84%YX&TvX-w6ZH-!MPJOtseM2BOYPF zgl;dle@2h~t`b#y<-Ym;DL>nl)(%YlOiZ|4^P4ET{bt>}GM5?MPaizsDxk&oGz_nVW7j&h^fKhagyaLfFE%Eud`&jy+CjE&& zecU?cBVm>jM6Sa@Z=~gLkyWV26YE#!65aFymB1Iv`2Xl#ZO1kx zFQl24K9+TSZU%@3X}Htm{K1I7;6V$_^Jbvxd>>6-W#yWy%1>YT zvl(DaP=k*>ocqYNSBtdC%f_bI52HGer}a};Y)iwr9q`u_)pyj&Q6K8{owAPttY+`= zYYpG<&p9_k6EW5PQVk{nHP(Qx3doeyP82AUN=`#X~+ybUsJ%Plipd-xLdyK zOP*E`1q)0`%40QpX}8&O@|xu$#AxtGzS9>XZZ*Bhv>?XAykm7sD(mHtQ$t(oH89ZD zKr3dukTR0yzyBvux<9F2B612^8hCS1cUk&VakWA&>t1qFBMYc=&l&d+wzc zV14f!^nt#9{ZYvP3mpGzEn-N7c4Q>PLfawK*x3$D#`_bl_{Mm8;bHjQsxl@BQqYyS#~S05KUMUzMH>C z20@Q~n-tHS{)|kf-Ik;Cf|$y8R_Fs28ht2%M|=0M{WbYeHEI&Q0T7#wT}w7>=w?2> zTW)>GdJsqTc+s7Mf}^sx7+2F6^CTb@$VJkp`97A!#Y~YLen|h_c7%nS4wQ?CLRMV4cwrMlgFq+k!WGDC;vD+H6ss=l@p%CeYbV3(O1ef!@wj@ zVhd~h8lOsfq<$B6GKUZxP%7_q75Eq+hkdOfqpe^}Pc8P5bx9bUkX08i1I>7cDg{-l z<^qb9(das|zEekcollA|ppIFcn>IB!wHSUkNV9PeK8bRT$UQfH@J zt5|x6K&~3t0ALSN^26aE3vEg6ni>r`(^y^X6@ib{f>}?hfi)cHfPJ(5+?hNfX=A)R zCaA8l3a2AhWy~hXHI3muU`J2?Ytt86<xxUqEr4_ZPV}u*qHnBav~>w?lPNxN(Ijo&xk63UTyHr zs26u0TSG=w1kip@#~GJQlXn2)*0hw%5FR^5DOlzeuw8^y^TIZ(F!T&j_NL>xiR7+`I6)LNgW0p9umu9rw*0Giy*HZj$&i9j)PZ8AeP{iGDOY(}SnmKDA*F3yq& zRF%S`_A#$hrcKIE zYGUkIE*Y6?bDAow3H2tEr{^vb6Z^=W7h#o7KqE_D;}19VO|{R&nfkv=Zhqy8L>@7v zU8w>~wsMOz`CvW>y*H_Q8;kys?f~!X?c(2ma%;ctXiMnFh5Cg@JN1n=GDT9`fBrN* zUpyr>8=)DtDh2cN?+?BC%rw8up;a*$uPz(n`4)I|t{JZGwGi7kzJ zgoS)8w04ftGt2H86&BCWl%o_vQ;+vSZZE4`V=9COl+W(#CPTz_R7Yge1J%JnlYNU8 z+JHciu!~OR`nYw-yJV5h;IX{BcQM(jW;J=)B~z3@-=|L-w=kS{=YRVc3xRCB{ft69 zBVeDCy+csjgv6U^&}mk9)C9Z)uP6-IV;97J`fbthqcUynLS_-MeNS*B9eqj8JI=(|bz_ph@>s&AlOkM%WT+Q!63R zi#l!1cnYNwEdKfF{yIx-bH2LDjK1j?+l3Cc5laI7;ONk~B(6rOR^Nez8a`()SK>YL zx+LCOqyGoYKXCq486_WOzcrCM92fF{yKl)QrHFNZ!h+h4#ywp@SE3XwN^+~gmI z=Fq$9x7$;J$jC|-R`N1e@6Da2V8<8t}Lq}V#Gc>22#4B!&{iBEl^70^~ zq}$dbT?hEjim6dbzD|>kpcC4go3_$~T4Olz|1|dAK}~Mm`?rV!DuRki4X7MN6h%~u zp+pn`sY+1kpb-%1C4?Rk6;TKvy`xg4NiU%a5{eWl2`#kH1BBkv-hJjfzxO%M%sF$O z`~fq-FyZFD_g;Ig>-t=;=zQ}WvVqFG(wV{W|4$2`aTVz?&&%`&zkEhZZ6&h@D_BLE z?z~n$zzej6p6nWMT&Bh!RuFP!9<*7`iH2ULE;Xmx2Im_am9N(v$2c#3gr2598}nz6 z16Jcwm+QbAD$IrT^X&=Oln?aYgZ{Vy?eXrsU@0~MQ2+qxospuES2AQt6ND+`_bfNT zK53Lo|=*gOX!d^yUA$q&6JT!vz80AxQPfg?U*dVkbk>Al6DVVj>!k6eQEd5r$w)YUH z%*PGnV)`W}=1_LdKFYa2=6>@fa8@IkRBA=!T)+fRMZ~7kooM;Y&WU(|JF1ZEzGqTh zJK`xBnc&to3HHbp)!v8CD2do42I=t4{la-weW22aS!8$9Pc#wFNbSF`P$@LvnV!d+AN6BJRp+dsrp;GsgLn zW>78B^Fv3Cuh0lXq_1!{3@aW0_#ZkU)%=D8w(aI8Pt^9leD7cJVlEZvz`i^6`mSFv zXI4E`JTv!xOi*mBt|vqBh`N`a+3EcMrBe^jzPxbsyhcla&S-W@%1}Yr6~59#?20R_ z@NV9nC*2zR8^cjBUH0Zoxp7@1Y9afdxnIPzofqzhLZjJ+Cy5!4Q=VrsS}Gzcetf}9Dd%oW?FAH; z^r)*HJ27hdeJ(b)Jrk$e?J!S#}ucRzx7)AKKGHMfXxS+=ZSr*ARBaD==26E2wYvBXjIY%=55G?5Idx>q~A(4biTq4S(zatJW__)aN3VUGduG# zFgC?GDCpLbVsEV(56A#k_r-Q$S7E#SvwI`QW?gr^$t-oDaaPw?UAWuo6+a_t?R|(_ z-Zh=bUqkh)Y9VCyJ3Y>n={lK-yIdP@C2!ljpKdPXTK!faK6Mn@y!!X8yq#t}NBSj> zSZGZK(aGqZylLWIe_W%ixD&nhx$fKr_cWWkY=_fb;NvDn8KV+pgG>we9B(Z>#@J_3 zqiZsjF)d2_;Elg(+=H5r&6cPfTS91D&dA=tmLau<>Oo$KRK_VDVv#OtUEJ7NoA_(# z3Y6<=iy# z>~djyX<$=;O)sc7EOtMvP{$3KR;j(nPi2n$JP$E!lr!6ENGu z#NdjpbQdq;DqFH`QJPNMKKDEx8|}N0hW%0(Q`CoR?y6n2uPpl?+RHTdp~aLHPu<|s zKwn+@ZlR>7=LIZi1w+fPWKG;K+;&N9Oj=y1xN!oBe6#92WMH(wjUABqEnU3Hjy{Q( zt!5lz#{_SpmNdum*-uovCe%vK4flt;JEQkDz2LiLwD^dR?6%{|&DWhG^gccc#>#aA zN|a}9M8VZ1)g?=^*DfmkY9WOO`U&QPqHz~Uovbl6qHMkg@-1eX_Mj`Ni&jNJ$twvl z%P@gMcJm8-idics1U{^D0cNr!xuR&}4JjqXMhv>2Set-4mgn0Drd6x#HvxH}Zs}%H zGG@xO%l75mN8PS*Zrp4^EoSNvE)F@?)g*c3DP(nz^76)S!5KC{W2vSb8I~FAlB%>5 zb)yk}j}uucMsVaZOhRKHb-+}0a?|l|%hbQRzQ%sHy*kaYrba)BcD$|Iqf3D^v=rofy!#gKzm!W+d)9&lTnmM#^hn5cQdZZi|xy!-Us zzi4k)X)kT~z4AwS+``arpuQX}sB_X50T$<#MnSb$(0JPY$;Mn#lMNi>swoQsqRcn0 zkk$YV#&{AtEr@;J`^rjY9&~H__*m$x(fJ_E2JJq85HKPpB}~Pr4{a5yp8VMDg5pWc z8&G^o6%LR}7*y+6@}8Yu`81s5GHN%<;tyryDr(LFAgALKfdA=sXOeY+=6p;LJcN1K zgE{Ced+DDIZ|Ma~ z58#lA4G4uQHGU&0J>4lgsCOGdEQCXzzIoV2^mco5vO3lUdZMU2CU$@2EhtfcG;u&B z+m-IS7#-gpSb-%vTm_M*pR692yCIwCVGf{vN#4(({^7 z&BIfve#gi_wU^P2cVmX01Df>|4-MS;sVSCM8)qP-)XlIPka_6qSdSJmRg$bO#rndv z@{LfUAP&g9PR$n2cPHse$E=83a=|i0IeUCE7{t?drwJX&JyPtoN$uMD16L2et=!<& zF~(Wf>e(-cNO29AWR*juOYT|2M; za$+`TagP_xnDmb`kgXS%;}0mi9KiW(rW0wrkt%`P;TDcfx9zFmy32!`kkU|O>5-y5 z8;f|NGjod8s;>jk_CUJ<%^?tmS~yg^lXL_&rF_uYZ;p>7 zZHfyjK?+6595#&sw^J!9B|o8s2MQ8ZiHFpouVE)O^nq^LlF!D$f(ZE&bN>h?D*NRM|NK_VcuwRic#2iecikQfLmtkt*Vb8uh^u!?kzUy2o-eF^0 zXl;{YY=gDeSi9eSDDwEN`wbaqsS@ZR5#+5bzT*o%&rnGI)sX>nP!&ZqqF{nrxe-$g4z17&9O4pw@G zIm>p7G?HMSMIofA2CqQOb72wBa_Un&X-x8W0~DX%RSnts<*f3aRUYVemp<@er8<#m zs{!o6w6)Ch-+J6$qUAgffws+wd##V3c%M^)mN^PxkJNhlz6KkJnk6qhc8Hb6YF$5s zH%IFr6Ql4sB&VRPW3wAGa^220@_o(}mUjrBicqkxV$k0ZMzY^k^xv<)!jyn?N>Y9e zBoMD%;dtJu^=oOR139{jwxmV<-M6aSC6^{zf^4_$i9d~#>o3fnSmG-QHHEu!&2`2vji>PGwg*6uoa@AIN2POkh)O0>-1-*!a@ z$M;*+zpFL)wXZDURliDn6t~{s(Y8P0)8gR66FPAB2ctx<{jo{=AFdrk9@h8fMe)~X zkt}HjogBsK*z6ohrB)0wx7P?vsonM8ITJDPRJo<<bu>ETslRK zYrb^}pD@UU(@`?dA+~v0d3h5ZoK?_sfi@x85agov`R2hG^;{&)=w0B=S>?mm$a0_K ztdzv%H+Ugfsc`9;s+-$zik=Z-}FlbS&)dq zaxklSgYT=zO8nV6-DklG<`!)5u-+esob?Q4G^T6I`k*~u8|LHpTTy+fr4SpH24o`?JkoI&@*9EcJe+RoTY1_74ue zy)wWf3Ddf=+Mi$-FI##FJ@$L^`n}o~`MpPe24$MVI__&j_78>tC&rbwSeaekjvZLH zjbL|N^Lo#*V4!MAnJl7WQDPGAXIExJ+}Db9BO>AzUg*DbeDDRB_)<_)lS#uulh;`J zNDpux16d^?Lq@b(BsGUL)BKxoT)_jR9Pp>IyQOVI(;7pecYp@ z{rmbOli%9>WQAb)J+y(wvOxR=ePc@di!Edw0{x+r(I=%b9U>sRecUxuO7VIycrf1w zO%G#`CcB0h*XX-bY(H7NN;AsM`s zv}arQ3&6xyCARrV7Yq|Fr=7^`{Q0Vnq6mUDUJRarOk8hX>#$2YOrXM{Co;EUS!|iydq=)cy_h_3ZDluKr~FN@ZF*mNLP*-L8m?SV`wN141I-R?Y3q^P;|0qp08oM=gq zcW#S#=pW|ZhrQ++G!y*UOOuU+i@b&4<2fiv%;2_Xsbb5N>EcTdnEGIu*EPg=21by3 z?W020W*`0-`cl9K3ZgdJ50p6K_8flG9J`I#eOzP?(!{PB6tC24$}hLE%S$&a2!Wy9 z3ciH`QyCla%b2OTTr9HwT*W(8Ff{LZs{`9*tP7Bazb@9Y-@FK&w}$Hb)F(`$?uj!R);)5gzGRH450?X z6X!<_xOox(gA#O4mvFUb;}U%fvSX59rh3@*MGhTA8}dq6@NhpLlRq4B$p3q?!&ud( zFr-z!iXYwYJjqh$WqrnKXc+?i;-p~K8vq+_ZIJHAhtpc0ZUkXEpyO$xwiT;qQWgeG z+=@o0TtE6(LGg%1g?fTLz&R?(ch5ke%RY>=-Fx93r7?bm$4mUF%~QezUzqBf(jZ^5 zYqfW9tNcgT;b8wzk-(u}ZU8myl-6y+-ONW<7!7U**m7U}6F&$dgT z@vj5=7Kyiss(&)HBV?=zqET7#kwcXZ6kwB1B1t0TiuQ(T8Sb`MrIe6O33R#dZ8a|k{=7P=j+5KW+5BNNTjhqlE{h{M zw&(-d)k|+7FGn7e9;*tAW6v{ z@er|Jh>bR9C6J9N-2yqsHFMwT*C>bz9`1i+NZMx~D zw*yh~jk58>#f1H?w*7k8#AOXd6Tz?M2UNupC{I?mwNu@1T^0!7a*>HH!5IW*g_1g_ zUk9X`Cw_U2I{Xs*9W%w9emmd@JIZBTSrt+syf~l&{bXKV7iv#gu|+W=K)r51sJ0Tw zz^-3U@bc*nA6@^R$9ng|Tn=X3^yu-`*vYG0Km+4AVh-}PDqM{UM59GoS#Nou4x5(G zDPzo)Vt|(f(d$IH4l^%oS)x zBfV?k{dP$RI};G|v#iULALkarIQL8m`QJtghelq8UalQCcQ=Qu1 zEJ|(>TRYsDuk}ZlmGsy~{f3b7gFM)lbW1&o^ws27H6`X6rnRBQH}!&K)Rjj(*bQ*` ziu>W2?i(8-Q5;pB-mcY!i36W3HRdM*jsUI7ntS4F%|K^G**(zelsv4ccK$WM2VB=b zcD-mrvCr9!k+NW5FI_F`Qu}Nmx`#)sjC~-#^D!e(cpn$?%@OM&MjqB+yAyinfeBm( zIg;*TK770HemqLihwr;1M6O@TQI+Q$2pHFk%coug1G`wgOPB``yQUUp(y=;_N1d(TcK{!qx1% z=H<1bJ2U#zR+-jk2zQ2hO)^DhY5ka5YPSGmF*WrlCV z8YEq$lV3$4CrxoZdORuOi=tk~c+mjGM7Yj}6avv!Nv}rho`Uq+p|m*Pe){SAU1Q3x zlu|Na(w_NugfpPv(9KnRm4g8lrrBJIEm-+70b+s1^(F%*xsfzKpy1$Ecf=WkR5?m| z!3q(-IwFfVog#HX&1A{2iVe-@qgq*WnwD8F(sw?eNM98drfjbFARi1}#@R1$IA{4h zF%!H1{lRA$#)rs6tp`;b=iB$9(nvjhV>nA~Vjfzv_cO-n1Kj3k_bD;p{jYtbn1S#m zg6>~Q^G&2yAn@yN?n+{~5vdqU9)}pL43gHk7f8@p7YHT(=R*G%CL}}UbQ`86NHa27 zJ$v}GwInNa8(a4CXu>p4Swz4|4<)1aR~4rq=wJ1@do^-PvSJvTshR|#k$+AZ$I!uO zP{t4VIWVdYu|hA9_oqj}6Z=Z7{nhVEJOmczes^+4N$CBA{(y(ve5AD2&7Q_??&4c4 zAo?zJb$C0z>ap%pIcUAziFaLMIik=!CU>|9LjKN*4H;1RbAjeK+mDqeoRNXiueI9d!jzL+gg4+2RL(kc?DD*J;sS?i z`I6?bPB#fEQ7co3Qo5=sTk{4m&6yP#EXiEk@DP zPmh3!XUgTBT#?_-Zd7ytrqIWrC!Fo`d>FexZ0u{1l{1u4mb+qS3kYT}_btD_5Q86n{zOd+a#$g9Mq4~J_OZ%z8k^<#&~#2&YgJf2^W{RU zj<{U5XxMZ={&-g*ag!U`e3qH&SZ?pa{1f_D(F6_%+xg9aa%mL`#!u5DGTShW>k>hP zHIK)c=7J5v(53tTeK&6{&^7CsvV7qss8;J&^wDCt+1kXOxAC2v`P_8H4lDaxi%;h7 zFruL7t$t!odhRoT>%Fdm7B@dI{0YVsnEj}`@B}T=kRrE|ztsNPbO`J+t{l~_5hr|2 zzusD6s-pV}lMUr?3$a-BGz68-c}<}1iD+;Nst6;0skEXqYeAE$E`OggKG3-c^5K6q z$n&MH5VA2g_u?WKZ3;qHtKTBOj(qsq>6XU&05??`hM7Jl7-M7S4a8{PBPzI=9H9%0 zk?JLRx9X!0Ih6@7YtHWm6IREZujG%vlwXZ%q>8KK`q=g-lI1EKuhzPM*z<$18&60n z^-I+~1`6LE?BPjwy6BJ4)eRaeg$p<$liDptvk-H`CQm|CPot|NiU#M+)Q>d^0h4cJSRo zOazK&%lQjp>9n_l2q4I~7>J%EHSq+!^kwisAAem}T9eim9%xWf8t2yK0aKu*=VJ%G zb45)^9yIpSQ7qI-WWArY^7p(rB;ijb?2Ss<$RyUCV)`+zb|>8kO4CWTJRYVQ*G}+%DntfC#7U9s;^W8$uf~UpYWlMxxI} z`PSuo36Wd2Q>@+I_>RQqGxJGJDY}S6vO#EQf%Q-m@JSSO3RJU_9igK)RG+Ej3Rc-})dG2tK1=DX&x?M}l><&q_j=rV}3YxWcLHyUK(S$YLAxN9FJSRUgx(8aI&=qJV_uu#rf!zo>Ku!DoEZ7OI_|;d z)8dGllF5y@k}qYM?o#sx=3oR}sY0?%C7q3ZygMoMtM~eI1GXD(Z?loIO(pn_y>@^@ z`hD z4kJP6NA^%sfh(kag2y8`0b2CVvPEa=v8FMI7Es06n(O7`3v-?_ZvHMrCDGj9lH3QH zp~*IU#`6Y?Zn1%w1<{{0LoLjHNBHFgo&c3X(7#7h*q#fgdw4yW^i{!q6^*@pS z=919@A0C27Tjr)ZA$YQWHE`|Laf!GhtvpJXSPQG45W99*g6+Z~!0~w1bH};2L{J-2 z=<_h%Xo(;gRqSnHuLJynJ}0-2*)noi=Q+R$@_7Dm zqpjs6aYlO66T&Q$0i;hMgbBQ{Y<|t$O)F%YPgfD`hNKP0do3B4uTJt2VuS8hWRu2; zkcgfSnU>dfh3Y)M&yOA>1v@Y|Wn)SyR@3#@f0@!r$G&IajfrpO=hf3U-P^aS0)DnNu_#Cg9>f-QqO_^xBSKeqD?6z-Vb=Z=xZk#7G z%N?0^bL`=uY+uUGC76!J$%h6Yvp`CQzuOl=>buyn1J23beiu8lF`6`3w-)zu^FZ@` z>{##W3Vug$mIZ>?y<{Z2-p590JQP3*z47^^g^4V=YydZ*z?Sd z@@=hd@LPW&UB970TyAvt&mukPKiNEsEKaae>RpW^jrBX1W#FBypk@^9O}>&0##Wvf z2;Jf~caCGnpgI4O6aJ5DV`X0xTDk7JU5pGi+I`S~y)cnI%GH4JZZNnxbQtf9&X-DI>4Ewo=%ymF zy;W6HYi*G#YEqs_sh8_t73(WVyKWac|DN%y7$0_qG#haMp z7`w8oo&_~?%iU(7YG# z_Yt#+@czna0!pB-RLtikvE1@3(sH|o)LzPH!`%cKq!!_%P!H&88N+*n7do>LkYc9U z+a*GPd!pAqt{dWUl@6#wgMOj@|5-u(Vf)_y-^*v;ScJ;;OAimkiE8#0#3l;{rk<2G0HqqVkbC#4qZX z-gYBy##hl6p7|)5%s0HC+a4dUmrR~mZA`_bqwRs+k1U zp2EipLx`cSzQP-Mt2_xj^PmrtA~bQs;8jX*c=GT9Ihu>94*dE#qaWbA-q7XRXKu62 z&@K3i%|zQC(-b5lvX`g82Oc*LCzCzi{pV8tbvpT1;~-pgkMnEH{>j|Y>1%8r*FV9K zt8uS9*+YZ_4s9%DHw2jJUU7WveJ6V<`-J^h)3j}gn~L?rJsP@m@0;^O<}=ApFv8V2 zsLOA2hs%=tY{xP%Q{++aV_4{q>UEtS&S$e#js#X=3(7?xsg`E5pX09E8unPhQVehZ z$@Fl(19Y#)*pqPudllM$j^bmkmCAsR@I<%8I&1%$v_IFbO)`UWL2=XhQ#!UF8CbE z@79~Owz%G1rgAFn$dAltmzexhCwwDZ2K%LE0W|#KZnMGg{2@qoi8klW)?$BJ;v+S6 zVtQ=0P3qApho?rng&3A!Tm`eLGBF6qtx#DznQruFK(l;aRUu=wqKOBN6!gc2wTHBK z49v=0WIbJ~40_X(`U&YokVo^(2G%oE+8a*${avQ}(>fbO7xZlAP3S{Uzu~~}98d*} z&<$96aV0Yx!>kg<$qg!JD++)fP^HgGvxpA)lEibjQ4?mdH|%$5qR1wF;)qzscpXvZ z>iS&>_Wbp_NqO!pM?3Pud&=^7xtPLN#FD>Q4VvlvjT8ri;cB?X>Y9hn3y@ZYBZH0I zC4z2LG&|GS-A4M2F5|qxiO7c;pP}bXUP{3)-TZ3XRVD89jWm@c625ty8n;>Sff-ZF zlLCv`N|-ZnH9FV*?}wmb(IZEXY=aWc;s>PUUdu1dkoJ+u$EAm!O%j;j_KprsihYw# ztghB4^ZA%P-yb)xu9UNOcdlLdcHi-4YqZlCtA^iF9A?{&jDvkftN}&&{MgnSE7kSm z#N^1Q*_Y!n#_jYU@HV319-=t!0>jB%%(yMcGD4JKW@q< zdAT6liN=lmwQVp70skT&k}?CW2B13apI(D7`_LkaZ#h~v*|Xc#T<&p)UonUhRJuu( zF^5QP^!M@w$hi^gMVsNEbMQi>S5ya%GcB*hY`XWMwz*!f%OM4S{wK@xubqwY1i0)4 zPe^34ZoLo%S*oA2Rf#!KFZV8Vi5daQiOf; z5y7tX?z+*nxiim`?gzPPzPVR~QKTC-GMcD|#sREE%}I^c>~B(K*$7oE%bOq`c!hvG zbpR^P{F?D8J=LN3sxGy;WRcTHa+B{7DV#q$CZBgKDTx~ ze1mVJ2J^6dqWJ!Y8^4cVSh*ckd$VQ6%v3v2bLrj@b;+6J;=p3~k(NKW{)c*L9yaIy ztwY5W?YFiW*2Uib{rAphwQF#dW67fu#rN4IydJXIoFZOllm*vrPxD@mTn80WOv}6o zvlhc6xq7cRh&|j*>%5B>4lT?0ChB3WjME=-nk@DPa|P7x>Tek20g8#z&6uTH51*@< z9wIlkm#8EI+yL*4>yoSyoPCzft1@Bq=MomKj%y#AV}WhQUG-%*(}Om{9@SxYO{f{! zzC@JICUPWtqRIQ`CLiwFc(KWh-a84l8bAyACH-X~*5>^lAAZktdRq%J5i-Lq?!c6Bd|Cu6=+Aq#wzkSE+8d5EghVyAc5-4b`Js1$OR7!RVy zDvliip7&P zN>0ZSoB8+cxHHE4{Mxu<+tjmrrOrpqMK|zAZ3Xl_Tu9JUi{1!>Dkcs@E0bqZn<@y$ zY>NGiRx3eTQ|-pRqLLV84@{<4&nZS3rVV79 zncZwsX4FHo5kV|mn2!ZzRzC3}XIfyLneP0+n3~R^q=6d?x;M{-!0ubxk>xI#A24ON zVN_%&m4x~@=JpQt@{wP4-&jT{GA^Dk#pWyNzx&W`@k2?+?al1F1m(|?^BjZ@dAF&1 z`SAi{f|Q|{{50^RMHvnoY9G0j;`>jZlvtAO374rJl?99?E?IxuyncI4S*1~6cz9Rm z$M)4^a zQgO>|MDZ?AyJiC*C;hUVm#-miPawskc5H%s>`HdUr0nbsPt-nps!34oER~^4-Z}aA z+qjSGrOWBB>h2iRgT^&v^>r@DC@1q~0L4swj6FCvYKOGlR~}2WWSwuoiH`?DKgpz` z7QDZaE~4fhsL9DX@uF-(+Vue?oY3)yxefodo11RG%HsXvXF;r-UbhucJWAS!3Cn4+ z1a5L?|GbZrN4{Of&R5}VUn=qnQBGkl=VvEEnQt%^8F###-nj*vk`W_1WIwuNuhfQb zKMtKYij*5ApM~@`J_Os!_2)LUXVoYDPtU>>nETx9a|1&{nLJRPAsHl^ltsvTs`RL? zl#&M6+j53X;oicz7+h#0JaM30R`t@@2tJ%*`vUHs;6sv zD6Me4^Jl*i6F(oW7`E-Yi<))8o^K{BpWl}z+MWNfhz`V%^@<-E8$(YNvu_R%R&!{P zN$Wm}`Pwn`GmwaaTwxJNKY1&t21`4Y4LX8{wPmS;rMY>H$(SvXQcftwH6_w+r_ApKvRA{y!20_nIZ#m(@MiHm(ru|%nW7q>D=hJ8O32(Wv@3o zJe`(xr8}6v{3nUqQ^us$84>DnTkY!D0E_`rgtx+cs#6HgZhs0X6=;$2!WhvcG|Uw8 z8I0zXlGLR;^gdRG^mwsD^@6@$aj0SLS=<;Bd(bRRGKD$kzO`&BPfTM-~?3o!;f5`K#X z2>{IetSQg$TXI3dnlty@PGHXm;&q>!K8X;;1PD16-(mZ!xbi3771D+8%Z!bjXdk|s zf|uJ6@+Wu@-OY*$(8MqDGAro9zEP&t-(R1<&Iqxl$QdN*P~F-izk2AI#rsKezOC(# zBUEqe3i-U=<_SZ2l!XR{6~JuXsxrMeHYy>@?AljC(8OQ`i)yCZUMW&&iIM91M9uDN zB~4lFgZE~pqm~(2O1O!Io8~g2XM;n{sYA#pt~5ChEt@y4bZq*ly4t0bxUq&4xQel> zTST&f))_CqUI$Q;kJp^;Zh>yO4TWyAL3)?b#BFcl&b^6VE!!<=M-C~w{N&1oTy+hO;O~gjp&)nR_N5q6kHyNbgKRsKA0N< z)1C9knm~lTOSm%ct)DaPDD3m0H>KeZ3{CghzYD}yMPS<85(Hi0Sfw*MTd%f0=znSV zCPAi+GQWqu2+b#dSJkntDcGv6J@i74%wxFl>b0o*gFu=-&IBl?84w_nzhw{J@(WYO z>-7tFpg+8?zHqR(oHTFHRGp;DVg`R2iGYx*l-2ejg?Lb}f*I%fBZ+G3c_iPaxaKM!<$2Evkk>33@x}wmAp9JhvM}kRg?u`ywzM+Y&0?Te_}Tju#4-e{-l^ zO(xkxM4gBdHRDMl1^yTtH@RlmHr;{xL!cLQ_#7&P_IVZHMBJKI#Tb2XNWrYt`-()k zb3V*+j8+xB3}vIJ4FuP55n#Z2lmcOrZvkgBrCbzEb9@49-@0lNB7v0BT`{*bY?~?$ z7^&aaRm)o#3d~hyhdP_VNw|Cr*}eLDL%e{OUUox1#wYYCJ=CTSd(jUJV46PT!mV~| z$E4b_YpVbcqP8UC3udG^x#5<*qoR-fS&E;L<7gU!*QeuDuoOSDq$GtlhWp!#2xK6x zZw1aqw(T6Wao7KH!STp_^?;3WhXuPmEgZ1hxJLI+SNt4lefZ_kjVK{_xonUL_ni9h zQqPbf&g`&Dk=g@411%OiGT+dUYDCB=_Z(mE+-XIw#KJxC zFae~oE2ZV)tRNZykC_nNSr0`Xki0by8oK7wvp(D8z4FyGF70t;4CVHVg^KmvCvfi? zcj(rS?&|E48OOwA^ElePTVU5&cFC43Hd@j#x4bT!csuMLCXjO-_WJKA1~{Vxg;M5I z2)o58eFHh2%kDEvRiL-*=|ojy$Wm$dbpGLpW4JF`OIYKEPIe=Kn_l9gwVrbFTxEvN z!@Ts^wIepFUr*AOO_*T;Z_a;<_Osr4Kej~<1OsEKFo$d)5BgM0}kSf@=)< zG-mP)GIsWKLM^mL&lX>p@JTq2wIg=e@+iQSLc&e(hThqnr+ zy!hR6_dG&JHF1ho_ab2UCwc2AfrNlI&nKE9aYT(T+%ob5Yb3 z%Uf)Ml89TGBeKtr>x8k`GL^Xb zQ%gs^m}<0M++JpSzqSlexnr-_`?X!je_h`mE5Y+h(7-Y4K^5L~IPW|2yW&BZf;z)Fh3MBjJ`dxE-ohx!DS=*cdhCsHXJmqzA z39$8_me%0*3&dz2H80qnlPfGuyPgRCL_6U~Vd3FI713XTy)ee}HEEom6Q82MR!^25Bu=)(-`$JP{lqTp^DW$5m#%YJ!BbSbeAGmt0aPCqgl z8pdE@EQZT;10Jw{b|RP8Z3=?sKI*x4r2b6YySaPS{9l<@Lkrd#EwC#oahMp_05gfg zRT?0S_*YQ|Ex4g%j|u?I?vp%Gl!u@%zozd|Q6LF6gnCl!HuMvFwUucZ>d4BVJl}Vf z;S+veVb!c}s;eK>5x_yuhfU!Nn3z7r`UHu~lP;v$FIhw=8du>kRA)^OMLv&(Bq1KH?psNLyKrZ)5g&HV2-uK&73t#3Nq zr-!V^^3T(~EPJI-dtZU2{+=iI%PQw#)hQ>=P>j&>Yeyp3Kau({BX&8y0hkAi$k{+q z?&pAY_z{LeGq996_SKyopd@`bh6qOQi=Dj0kW@5=$Ch_z@63ZeQNG_ zOml2?{<~DyT(n~@ZmfoN90L8&qWBLde0Ybj7UA>Ac`c%@KR%S;w$!&CFU--}BZZ_6 zNoJgx{PoOh5*h#0=b~Y0MwAPeemN!0>vvY7p=``$_Dkhoe`rvPobDy2Id^G<_YOTv zts}?6c|ZF+9Eo)^aY-emMnX+zH=lln^ni4Mhfp^m$1kF3sgmH`K2@lYxgZl->h;i< zm`1+~Im^C&t>6YX>Kmelft03oUF_chcETs`LMdF@5OE~4#5_px_P%{=hWAyJ^~;O~ zqTNOYgQLT;5X-)@qiEIaW-&-F2l=gjsMMw3at3G{7Be@AK(&g+Gsb5IS`TiOJoJ(? zytYhDujF)id9&$)F|EQerB%tSY_GAXqf3J>g&m$SVH^I8;r@9%-1^^_VIYOeVLuh@ zpc|Lkf{ok5->t1@9ZVj!CGpZLDZErhcAxp+dige5o@=!DcB$pXPIWcDVkS?`HVywq+y`;fvHFdhJ+ z$mWdE{nrW;i!mF^VObs0%?|2NMvaVtfP)cYHvehNmPnODzO2MqJiaj5xb`%a>OU>? z(eIWP^MC?oJ!V_NZB}hNC9sWg+!!(pP7@7Z1=dDtR_#P|<2X^!(q05K=!STsn!+hH z6$a`b$T8c0ba;y&zh@snOHFLSYqDf+SV(x6h==!SPme{d9}zTT8yR5DO6<$QTP?9! zw#bN&lbsXi)Ggn$oqo^mHg(boU_2~t)#P-Xu`Az5>T`$oI=fW&hAp}1IR&3Z%7w@l zj^FlMgU>gRuX2GUl!GwrxITt#LR5+0-TG0h=-r&=^9)}&TF|etkDxl@q!&nLf!Jtw z;7X+fPTSIG6Nr~2vW z$&I7X&in+1+a6R0-{<8ss)m7gEeZ89?lBzyy~QnSxli&BNt=!ywsg$*KMX#2E}vg2 z<*cD~=*dU;CN8osE9qv{47&V!`cf2vO{dF%84~yO~^OaM}euABIiv7v?24vqn`I~^*QUi+pg5U zDZ>;VbQ9|1K%~&6twu1I)usTy9j^DwHO^~XkvDz1c$5mGX4`it&}F<_GB*S80>R)@x4ZrBBWcwC++f zk%^HJAP3y?4BXvAp*d`3_)4jqMi)0ih-~od#s+;ayC6YMHCbp->ndVgyjeKXonKv{ zS^KDC<~j-@mVT-W$r(h z@Q#-czOdF|kh^X63YkOjsxljeT@F0PU07)vq!u5Ju~AAVZ%ZUD@M*5Co2YVbR}lp*76zl+sD}Uk2BFrkFMn&+_Z?j6>wf=|Jm~ynh!`jHttnS;jWNI+OWbi zU!8VOp%@Ds@^UlfP8#Y_2f_fpw?-rH`^M{T)keEpO<0o?FigRjyiQt=-77tAOj@J4 z9lUx~8*WJ~E!0*-T?*ZFXgAJ%7A!Vg(6{{2d?Rm76X+53_kmYE8<3X$O1R_{5iXfs11%#kc!Wam%47vM-er>-W-=A--d)Hm-lC|KF^X_xb-uvDA z+0Q>q8A3>lZoPFELaOkmD$-DcAyjW=IQGqN3w@6Ue1bI&{D{yZMBlo3 z&xxeYxAv9ZjwkhdS{I$(GLx}nLU%#IqR+CwUgPAsbE&qP;of%|>wZW+Ym>{E>+fyo zd1YJt^D8JeAYOvI!sIfU;v^t`#&BQ28jEp=HdR9kJzgjo(W;6Hpz$V^((L^wd;Jzux zbSYoWW(`77gQv>F!f~y_G|xr+kJK8bq(>78S}4R^40>0co zRjipI7NqGQ?g!IFE#3=eUUQTOCX|V# zo?Zma%`-~CV?Po0!Jk!_i z{~5osfyvN82?#;r5p>djKJ?_pzJyT9pjOj5Vt{zN=Ty*awoo znl0%(I&-g^jNiPT`Z%zbd6sq{C(Iu#H5?8hlT1xl1^cpp?7Jq8l`>$PkB;!5ziFX< zGH$uA53}o)Y>xL0anF({nMv+CdxXjhj8#exj1+wg(t^Pq-vPE6_oQjKcb4Ir^s~i1 z`>a5cf=A?wMW=i2#+z;GFe$$CJx7Zejzc<6W|c|K#uvNX6tlM34(d_}c!VmSZ`QqF zl@sO(4w%zDuk6+;|NI>}EqmhIO<1d-o+c#XO^7k>c#HcrIPTA58!1Wd%&zR3`P(gW zTKXN@Kqv*FfL5&*mcPRZSErno_B$_`k`tN;kYfYM<#v;1A59(~kHra|EaG8!B3L^aJ#@z<_#Ly!&U`gNk1dAdp#kg-n2ju-OL=C=#gpW{w%6@OE-2s<6izIkuMhXo=`zL zkB0OBrdUyKf1niu7He$m7XVlxyDEU-#T!;@X68TJUlyd5nQxO5w!c>uk@qzIe@ZfXPZyr)8~N07MPN6w+!#qKbSQ>BAb(WL(KZh76i3HkXIBjDHyjF zK>VSLhU0yy+ZKN0O6R*`!7;F~rt$03&z;6%Q^lw_mfJxSvPKPPvz#lc|trz}kqesvoT)Z*}i5 z(x_!x`{uginV@3r!K}9nqGq%gvL9QVa^Ky!n4@(EK(zA7e%>B`DO34Wd4#nr`y}Hl zsE=PY3`NTIlJNn9f`G1tJonwN(?D8?kX^;|@)a46hr$Pb-e=RV>tqk!mO$M$zasrS z-A~}ZryH#Jv#7o%YEyFWMyc{Y3Z4z>IzbsqNGVr=@(egXyJv1C{Amt&Xzs{5whx_47;vrNpxkIx8taSD{UfJ08aa+O)V ze97)tOzmr80S{j4E22(9f>n6VPwvKRrg#V8QCQd+%A%yt`Cdzcw1}s0h!WkE8%rUR zBk^T_BQfR27z}TM2JIy?0BFr(sMi*L2PM>F6dmiFg6;jflnr>aBhmuz-D9t=5*03# znRus)H<_xT)a#&k*FvLWsWPbf`IuS7VA*V?2dAyslz3-zPT)-bWciqk?Ej2k@ghrg zq?0x@(M^)uDK3!KFAvpsF$43ZM@J#Y4Zmur!+Uel{Y3PDYNnhL#?7rPi2XfUkTOY#_l~jcC$@M8u8_o z0z=k-kW&Q77uqW1eu{TSI$c)u30r1YUwZhRJ3|v;Nx>&8QY$o5Y!%kbuG{J1C@BJ> z)T#h;<#KN+ud&&Aw5VpY!z+%mmA-La%qQc_%(xA&okyEth3hQH42ZB$ zYlV+xD|h#>JS$JRf%^EfAi0ui5HnWZIgyb!Xl@mS9y&t~8#W}4%fD3^S$c=v?m16V z3XRlUn+CmMYj?`SOu#9-7Djm}-0tN103t{f4TZ^yumX(ZnJ4k5>-+3@K$Y zB1_Gqhlvw>1=h_Al3%q^^kS4d_(5KPQZ~m}#t$VK7<~$VWA@6KbC9jU_4o}iB4=pA ziXP(4CQz(G-#Cxf)-1Mc=ZAhH)B}VtEv$1MEtAbbju=B0ag^^#$In;c#E;6e^33P! z?So*EFDp37COjnQAITd30Fp)(u;=rZt18dVBZBe^hAPS!I9r25s{!Ssjt#dCch_eR z%zIEVp*LY#*pScEV^G0-YQrpLw?06a?@+*th4q7F=FKCSXK4?Z`cnwUA8NjkKfb%V zBA=;@4U)@aurE;$m~E22kco zgTsVgZ_}vH@`6Cvqwq80HNTs zr@MmW$Cn3=!ydQ9K6*HvGK8Z0N7L~FsYB;ebt`qQuuX#;4SmA3p^)Re1rT4tx4Hh` z&*Tr$c*S0DRwMI4HtK|u6MeTbO-;?^)=Gj2i(06n3GHNnm=o&5bAhwAH5U4N9Rh?f zDENU*aC-c$i#H1R9wE!&9vR9__>$^33ZqUkF2EZmdyK82bC5-621(kXT+<-FZ)0H5 zM5U^)`k3W%JmWQ|)X=?srejBB77Z1FrJPX#Y;f~RQD1fqjRgYDPw0&BULpQ z%dyPk7YOKF;;$Ay^YxH+<|LgFq%^IWqB#6xuvroTH>ph__N6geFQ^<2rcCt?gZ&wx z+A-q*nLqgV9b2RBJajX0MMT!R(lu1U_ux)glM_QgufcbN{q>X5`d_%4!2#W3P`({P ziL(|7ey^-sj7Lf5rw*I$KcHw%H)7Kr>HniOAMCIFBPYH8mXo#S(O9A%L&Fu=Q^5W8 z@M9lpjwND6I^H$Xb9U9o5oj~8E25MT$`k^at%q@Y6c_FoxMpU?QwCQV5-N!?3YP!VqFIl%dk-oix4-mJe zxuMYbhN!-lo&w}vyRTEEH)+INeGKUCZSl^~Tfx{x#ZSU~&kay_%}Vyi8f=`J?99#^ z9C+A=%N!UMUAdJfDv5jizLG_?_esWKS2j8y9)axKmHr>zf!!KzxJUppXpQuvFGoJg zQFMwfErUL3d0+@uPx@RO(PS0)bPg8zt_+Yq$I1~~RR?-M&06PCSKdN!MBJxGqMvTu z7nSg&22d!khurm7Wx!1jx!xP97Co!+{FfmQ=2*VeVyuA4Jwhf@w*czGtu5{jNom7D~6XXgbN3VoaXBRiyiSXp-FtUV*A zmY>NvoQ$wyYL}Kb=uJ=20Rq6;*HN|@ZcM2{W7wBbeb^1@Kvk@imVgzxO9Le5V1EV` z*_Fex^t{2XylSu_JlLy4kak~`LRXByi-@iE(L)K)fF#&3yFw3iT{RD9_Ws^gZ+=}= z-~3zk)t%K#8}eq8wZNieQT;ewpO}mfP)LBtI5WG_NdJIJo9x<{9mu@}0b&SN?&n3p zTt{b1m$MP*8bOM=0Ho^o^oBeFIT^bbzSQ5OqzK(WW&a))v&-Hx3ZwlT`q72S`0Q{i z7iOp_RaNjDs%C8mU+Kv!g6;hJ88>Lk%e5TkK^_eXrXRZ|Ig}9qaR#)&e%Z({&_lvT zmlm2b69}X=Z#EFQR>|Dv5p@S>S20rAMY;+UtV&{R71E&0lkrQfN10kQ@WQa++1l2M@T6i{b%UTfb!Z~dG;p(| z!^%61WG)n*o0tdyUG9PUQ8gIJk{c9wvbAl3)(JiCi#D#OKK%(Uvh5U)NICP9BX}wH ziVvcCM@w}aWwsiUuz-je6wriO>GyV&y{GFR&N8FGih(A%wXYQ~(b7BZbY`6E;Vd_z zo~mTSU!9MiLZ|ot>U_4VZL}X{rKG$NrVbrscG1$ykt>|_SLe0eU3d7GU(YyIR{JS- zmDYX{kEPY;olaGxeo0Kn=-U!Pf>i+m9!<0OxAsI{U0tD9;7S&f z3`9H(<`G*WCN>bN493AFOi{!!!L|afI7%o`6&6lXK&2`L1YumJiZTQ+5doQ^Fu|gz zI6Nvw1cME>!8`;4iI*N+z3;u_gZtzG5&vyF~^*1 z?S1yyXYbweAFzGO*PdLxe&gE9j&{c{J=rY}9i1#6cCzdq+ASx~UzXhiC(H6orN{Ar zj;qq$yDTU7NWP@ws1J2_*G}Ykx7%{iE$G@-7-eF^Y3#}`(v#ySiIZdTj}`y+a>=Im9Vq=f1W5yxR*!@kj+Rxz&v=+4_?qb>2v z^P8^zTt$BB=j8B|JpIS7`QY>Jz4z#w<>ZT>lB09T6nS2-t-LNa`Yg!ixr}^gvZsB` z{B;rQ@uVEqwOt7oA8%Sn=e2VBs;^`dNc~|xx$^LKH+*6BuO8<1`K9&UDuw8t_%!FY zoV0NZ!^eH~qhBH?uakr4K4~ZC5VHnAA|L9#J5r^|-)7;Y zUl$mM>pDMqeipwr+7#N+YO&F-3t!twD#tH9_S*S{wQ+C`@f*(uNuw}s=xXMh&DI;Q z;_u$0c(3`5*FEq(O?pz@6#ee_pZMDAFS)(D{hdnlGw+UhHaZ&vMC3y~_HorR=oT!) zD&Jv0*w5!@vBS?MX~$>r(d*!xjZ=9%U3__Gl0?W|%cDAF&TIVSk@)+3cqc!3boGhhYzil=`)k_5%wL2pqQz`Ju@50G)sNfVj zoXGZ|Q(f3+@xx0`O2~K<`L6lJ-SXStp$#*Nk@$Du%RKJ9@n>4_fX zCq4RXG{SB86?4nquk-Hy-E#B;AN86?zpBs|J16`d(I5ZXNB^!~KL7eV0uKN-_1L$Q zfhXMkzP+y=*8|%=cJL*vJ8JS$i*h!V@e z?gp)OZL3q^qPRQ$mTS*l z!1Lo9sgwA)pzOQd7ry0nSAP)8dF^z>J#;@|{wb*sK5UU+HV4!!`0VEJLKou6^E1;q z{-F(t{g8gMTs+F%4CL8B(dE++Be1u} zQa1d_@^?2B{4?(K#G2gBZ2YKxYj^wS1vv8wb2h-K`rtLS+C4j5oS5zZQT6pjk(( zJ4B5)x)C<~DS-Jn#3lX27u>p0yp_M+jn)mGYaUy>+T%Nnb1#0!>tbyAQ%)nklRSgJ z&7=Ic?ks-hoA@5fJ^x~JiY`PYkDmW0C(plGd!Q$Ex;t|N@d~qieC9rdJUa(Jbmg%% zxJoLcUW^RY7oUugb$iXkOVyLI8AJG+ zNchYly!4G7Y^6~5nrXo&e$8p}lUVB0m<1UOEOBY-ht5+)-??6hPx|GZjRV(b``>-$ zM|{PjUt-09)0*964ZWy4qG3A!iZuCL5J4vSq$?ol?wO2=1e&!;9t z{HK#&d2T{`aKZSSV$8nw`5IF+b?d?_&_RB2Nn@S=KEJHRZ&{wfFD-HANt+d!8=g@V${FeVy<@Q=p|RCl}k1iW;RIY+rXYw+ro1J ztScYrS3bq4R+FlcH(!!*-yB2t`NcV#59x0CP?FiqC-VdG1vMIuAg3o=Td=#P|3Z0B%|-@17rLGk-6p<6~!$6~POh1kU3(XXZO`=|>$d z!lw$=5_RyEi#Jr~RP#^%iC^4A^2m;K+VClBHe2;z6Z14*Mk&|$%X0f<_lmdugY8>E zPThfcKaZ0b)2b2Pn1`Dkmvb_pUZ*zC08jjo)ep|hccB`;;R{6kL;Ts-DL%Zk@M}Ec zYe??S-~5VIlRb~$9A!25WQb$>P5#6re$4=RZ7!m^$ICJHQwLq8^3qO zSIW*0ziJfhY2#Np#+5qaD29V6USiSHHu0r%dVQte1>d!Te30L9h<8T(gM1~;2HMmK zAIaG=K2h~u$+A`Ao#yL~^C@rnmi3*Dn>*0%_Q|VFij#Is9D-CUfq|-t52LPSO>Mf;|h8QzG9r>i*kxj)D&%wf12-@hxpQE(boL;`OLW% z&4ra*97R9KXL{m{MVR>LH~jeO-Z?hkb&`yq#K-O6lT$@0DD?-g)^Uzc7T&5n8gw__ z0DpXP`45D@vQE5>CYLA9MXJba02$ioVhjTWVS5bZ6(4zN`ENe`p5>!H^k})NKh(Lb zKhik@lUA-Xx~smjY)TJqEB4J>%kshNC(AGX&hhfC|NQ3id+))>f~iYr%eBS5L6diS z0c(T7VNUk2yzB*+mM{H`dzO#=6GzJf`m=$1G@nblG}%hD(09V$W~@UCQLSS;5BqEV zWae*vfSYo>EH@?Gc;aOFp#GTWmw)f}@_j#ZYkBJ*Le`;RxE%9>G%3oHFxKHSfF_;E zFF&fw_1jO}dg1SWTfI@g(_fZ9_1ee&mj2x4J1a|pX>wLqgaW;Whu>GnNZR9Y^4s;%W zx4i1NzvUU8TZ6Uq$a?oX>%J5^9jAU9em|0;-_C;e(1}uEYG}e zr$t+qTP`-spu!U-M~AgevS79|o^g>`wAc>y@e7Vk`?z91a^qxq>GOBXzxbc8ET8gX z-7Xxv6CigTGJZUUv*`9=vmA1gzg4h49N+Y^ODZ8#@KI9`q-_X zaPu5;fuSS!*@le$mhP;#HK&jK(B1NbUvXvmPhY0_kiYDk{5AHRoIkT@vw@Z8z;F1q z7l7fCCi(MA@@nf@5q}|i{jv8-IsM&M6%o3LI{BfEQREKp4HG$@wUJ1eYx}Q!%BAIh z`K$LWk8838tEq&7|H$p$UeKq__MwZg*U!9Rnw3=(J#1>imzU))z3%$*uKvrZuZ{Wd>ES!5dgNmrfBPTZ zSl;rks&UNFhD?$g9J)KT33%MPXFTyAfBeSP=e+&fch`Iedi2_(FPHhgB&G`tFhZFY^iGZTPO8%A6S;JedWE&6Z7VgKJMLTtbV@Au;oe}a$|fo@8QFpeTE;~ z=(!{4cwATZ_x+vv)3p?oK6COMai}`b-FNw9`G;R}pRW2^Ajgt*_)SjojgA<};ZV-D zH)q&q4iEL*eWU|BFmM=S?>NY;&)5I;`<6?(5sl{jyXGx}^8>dxQX%Vtv5PEo8w6JK zToHH6efQkYp6Q3Mqvhz+s$i(tXF7XpLn?CV%Z6Oqu_p_+nw!5{zT;K*3%heMNzF;f zzun5oTzGVll(CU?9of+U+nP1y(OpU zvv~w9Sr;nLG5?3p<|70ueyyDbUY}Yd!E0=`V+1F2S@%7DUU z!+3G5v_Yp@FhhD(9o{OXys6YM@?dLP0LotS!( zZ~o{ThY!62s*m!Sg&e-XdU0#<$S=0*Pb|w{eYqaXoLkS+K6Rp~Y^EN+{G*Qi6P;tq z8XuKI#YV0>%Nz^2?6yhv9fh2b=evx?JV#`6&=bQOMZM+dz(~P{OOO4g=JV%2_LA3t zIWdLGe~6_L*6U?ZoidN$t=;E~mp$XEY0L*5)a)#9%C_**_ejXj1}SaGL~lF&7ro-L z5_Il{V)fCw*fu?YZqYMj%cgB7z3S~eAahn{_@cQMlFic3)%3UY#Noj!JH4cEvRr#S z^9EDCiHH1&FTSjo9Q4r{^K&2ha-QnFK^=vKuFYqvdxW=7K2uz)M)&XO4}*2S)oU;32*?s`tzhPoNdy zMK~{~T*=4;PVlC()T`0MfB8pTs;kbv+GgKHr(Rq!;3+S|5(B&y+n5*@z^5dLrcGjDVs3` zF=w9B8T=Q$;LA>~9`X4+qVFJ-liI=f8qb5;adlP9$i*t%;M>z~dBL;M7jh(|v1O@a za}jzx7Y{1+b#a=fVe#WfJ$C)~F&^GD!hg8&3xD97hwY{wLOxnA2;wJqo|?br07>n| zdc9}P-SQkmio~mhtX%z&MJycY7!O^|^}~~L*w+vLY!DscBm0>6jPaAr#6u#lPtl}a zn^g8A4RF_SY<9BpclX?P?PZtsH(oFGD^X@u>A2cxb^Xba#{f#>E7Bp? ztFxkR`P@dmpq)Vyx9`@uFnA8e#&tpr-DGb_G^IYIlqLQGW*i-bW1&6e29O6Y4AR#5 zvw3QcRQo|aIrZklmvExE$M4X$oUyA07_9mhM=sXuWE_~5;nT=?xmN7c}VZTZ(}?rL~jVuDCHDd zW0I>4RkJL)P{rpZ{mdS{51lA{3Pf+T`jPlbs|k>vbZN6ZbRkPI+fmPp0DeI6t7Nc~ z$NhZ%nT)>k;6(Zz50&~yf1iG^fs4sKviK#}-Dl{r>Bu~hY2DR;F}T*pmL9|4wUTbw z@xnlPQdFhr&E%R&<~6QfTI+#VgCJrYF+`(acGqTfD_@rASLH)IiT<#`a<+xCqjpL` z>#D>_%Q%UnL=``~nBcrnhfBLfp$0UGM~}`pY-%%xL2Su?1!0>O+=jhV^Q|SHHsi~S zD~0ov1zlYjfNIlt^GFNNb-;qpg1EPAM(ME^ps)?4i@M~QXic5q&!wGA8~zyJ#}kr& z^`4JJ%2R4dCKVL9!V%6$c5)Gv^*q_xt7|K06))bGDUPP7^FtSfX;?h<0|XKb062A zIY|b0!pj0C)Y$7;i^P=d-~9Mh&zQKh^`h&1%>hsw!5hUsnpx4t z<}nU3;cAnu{B7X&Vn5^sgN95?k&<*Nw-dMSz$p_Pc^$xvIFk*X^*T}DEO_*uml7(B z&nEcAJ#m?Xu}#P#5u(vuOElFSM`G;J(?_?d0s0skGYz4+p=0BMwY@=f?C04B`6n16 z7Y+?9wH$J zAxS-==YiY@80*`{n1+s)KEk056AV77g?$%2H0xq(Q))9XS&VWbRL_G=l_J9>UJl0D zL}N3`NDj2QCw^L+J)AKpGPZ04N*&EdoH2o<_uVvg5ExqK?h8cD!pAn(v{$fP*#~QU zh>wrmGmlPAjvv4qPUcCCWLhX|Ka2&~1>W*WY1;yK(tBoXnGCEf#s(&kaR8=O7&`Rb z4)NokexjR!kF~8MOFmU5aQ$lW3aOlWOo#8pn)8ot^lQLVQZO5XoZ}x``u%x;$Cmjs zwt{}jE1RV@QuzczTVvNF(%{QMY#aX3$pievr_W(l1ZA{3C6z9Llh!WOKW`#3*AYhq z-tucRhL5MYjUq^yq;P4yz(j=;Uhu<*6tg}0;12PFp$~4~hxPm_+Zg8Ct>f7*BneZNsSb8?%&Jh@KlZTTrOg zc*d4a&)A=--&QSt^&=aCKtMfi2RM(tjY0_3lN)$zC%(pMOo(G{xaW#VQD)ml*8}*( zn%f398D{+~2NGYgRbLr0gOY-ta%{uQ8}bVGoMs=E!xb*`2zR1d+}H1qgGY~B`-@YJ z>*a;j$od&444i_t&M>U#WibY2>CmtI+6%Qc>JFq&fKMxFac!J|LFhSyp@oAfvh|$Q!ky#K zhS(4BtuuI=bE{5uez>A2b4!3M+hm`g$1$&w|CB6iS~rUj(~}eO8bJK3dJ?_67ebx{ zSHS|R%y8%`=YQMnAR>?_}JgGOix59Mum~lwBBOj7l{Dr%(^B9~CeuB#Ukb0`^qvuU*Y(62BICR)&Tg!A&&-M+!2eTcS zQp|kcb?_I5@TRuW`$zm0SeN?*o>tHfJx!tLIT3p}glz!EcCx$YvH;wLhF24aiOPLh zoyM4vMhXD7pn%KA%I|SJ3pjFVbc&HshPKa%R-zM#w$p3fhA+q*C$x=DN^`o8SMD%{ zlYy6XyKVf(AvWYbX0=U|B7A&%L$qy^lSpgCbq?mNVK#inCYah3&VIO?=1DXw=#`qC zbt3TAho;;JwjNhLV1kW_T;f+5&f5zw$zb{>8{!V`+%h~%KVy-DqlO+=H=VZ=FkY%TPJGOKbO-eUMZb@k`Qw5*kXQI4 zNn-VY-V}k{dvi=NgDj)aFv2b;9&Lhj62jH0Xgt5%4NV`a$nS9VFeZ8jwL3ZT-35mn zvUwAUQ9a=cgBJ%U^%9B`*>UXEt~NPJ9a#K=jILPgIq5_LF4);`bivL2J}%hVmz_pI z&(zfWn4ASNsVrtA?CTky6@SLgnCP>dnQ&s$k2bCduV@v=0M<$2v&?X_w&f?0 zdVL4q!ob4O|06wo;ixOrj>l#y;~Gg=-=WAx*pV-hTSqte=+)3!U&FCJJ(R7IGj_tH zSk_m_@)csRD}7KQl3@|As*N?`C_c!U@vo=O(oUUM9HYTXr$fev>%5uanu%NzjR zCb4pse%58Ff_FbT99ZTs=22SCWBp8Il>D>{j4u>gKeWxhWg0&$HJ{gkdPXCf61P@& ztiI#OvjYd~D)hvhL4pdPanYqKH?T(AS0xsJjcpoa4(T1TJw`VIoTCqRpI?P*;>dsN z5f0BOf=znyxkaZ2tJWn8N$N>lK}c;lWS?W5vOBR=JKko}KC|$3Z%PH$J5|jKJ-NqE z_ZknrZ7W~D$^f(y8P~onU3Oty2J4NY*@llDx%i|JpU9&wHDK(xtG@VU#^kYat*h>i zdSLC^jL7(-#cz$a=M=p%&kPDtW4)wR`B-^()-G4{E(m^LY+5LRq%6%7l<6vOPNhVCyvY=4yUI zIx&MxLE28(nmXlm7viLOLSs$b4|GCD7I{^>sJ)bo<7qB^r=YAS^^JFY6;xwEh zZpDM~;ZEeb0~BvkTQTEG0U3VZL5j9H_mXvxdHwoPMGk8H%GZ$DSUoG};o!Bp*+kXX z`qy7&0LlzDGC5UnIv&!hC5g%LKEG*AaEI$`J|`zF9*~_UC6v2ef%Yt=w?iGS=`x{m`*tc1v}Pz zf~slY{K=p-7He#u7L@_cNMwKhd*f^(-Vaneam*r{gTf>LelwEqaEL>^IXTI3UTi}^ zZkltHCYX)!fRgkGlZFWF0F?CZ*bebcbNh5(fov2_4=P{4lkUMPb=`l~2uhFxu>7&DseW}mFpI(L7m<98w3m<&s^gYwzKLS`@ ziH2UU5yjHI=Sa0E5;z6n)mm>R$Iaaa0HpF2H=cyKrST)6aY5j>Y2EFa4KyaOJpi`Y z0cR0NFVNX;eH&s&2RLs_Wk`!X1Ktl5EXMuVY^M5^Na4ay{PgzMr(hU*GqwVm<`|tx zHqpMHc}$IYj}CnPhO8RSa9ryZ-xY7p0CWe2u`wOua|f#J0CPySsjO015zUoj^|=$R z&P!8a>m2?Q`plg2TfXWox!mch;lqB)b!%4}(i&%-8hjt^C)?8v8krgXwGp&JSbXUmUuKNKj;seLQ@+i{*gD4%I@RALNg?5Nv zHQN3d?-dcg{ZuEQo!};N-E}JHlr|#Z=D+=Y^?ah~?(8cL)5{VsbD?G)a@Zyct*NHxP>~FNNVt39Nz-u{udkt;$vC~g<^Q~(o z@!$ErW946qkAsrqYR=YH5b{$F!kam>41*1>C($G?Qu;QuA8=!KcHIVdWNDr-8-7uK zNuNiULdrZEx{d!~v71dXW?a|C=vhDe#uyuYWb4hW)6k0ypF8ER{BAwTAx;YE-wb!) zU;16Was^(;$OUp5dXvkJY0hDAS|8fn=gyP6&xSuan8cZ0vW)z(=x@DiJPDG%HphC= z- zpYdSh-(EFF=R=BYI@>x#_%jYWdLEjhM|USaBzVpNLG3+y_(R$BD_RmMas$MWs~oG^0ClV~+&9ED$w?cD|Yz+=nu2k$xd2U}uu6PP0V zCo+iBf#`{lqWxs#{-;()(J&9)cV& z*MIxg+j{>(@hd`~jcXbH;1z zth?n%0u(-3tD58KJI#tQPuPp_{T#@NnLsv#(utmIWON>=r)G}FN{F5lNBD@6U;Bn9 z>MqnKn+0+&Jbe!0Sg#XY1|IL>WT_VXUT;oA+Kv6ir{@DlMjpC8`1rDX*N^ifn3Oa- zP>v=r{|3wSjsMrp<+?rvZ1#&IQ%o*?Q%fUy9{OfIvd7w82leqs-`IVe19y5!^8?p+ z%lE(O);9mymq@O`lr{MH-Gap%a!lvK(+9_5!wv_d}s`<0wzR2F;-6sG^f)1 zfAhBE<$Hhn)^a}|--)B-fGBwkg|A}DfUPxB;ADB-k7x(+!4Wu(Z^V|l+qB6&n>1q*9dcD_jHBlT z*vR|+hTp{?KmT(AyX9Nn__#hpI{B~9Yw%ik6(uW2wP}cuI}>`1H0k-6=fBTqX`C$v zyXpzH+GeRX%|8xjW>_S<&=S+Pnr``~H$Jia)W5&2PruNUE@20Cie;tIvIjt59r&b0 zjV=c|+__#ALk??qI+k=+1B_gv^QeSsUl&j? z;p|tZ|KgJ`FMscq_bfcG=0&dhz{tYj7c4!e`8Av9+C(?nNM0J_+A`~hL2+5Y%lGV- zcj`{^cVGXwo}+cX;<;dQvT7u2?0R+qYFq{XM198e*L=}E%d_>lL3~zo=0om&Voy%^ z%h9>f^lD0ytPpr zg~{1jZAiO~^T97J@yeh09w`1xwSh24F`NSEhCjRLSXJn`%mH@4#+$x@;up2ebwIl&_3snm%EJ(YEoj{-clclgY{Q#$UL- z{G^^VuQM1Gu)n(U2vif97a;}2J2D&cm4Ei0<mZtf?9#n|`tkjxXn6KX&EI1=R@*$+Kyw>;|^ zN6TfsKa#H^pu#R*_}$O*#n-X_6q!ggu8IzGT!q@a0d4&GoYsxW{s08 zxcb6`!zl91*VjDiv#}r4pKJ1goci!UFDRc`2%OJ$tT_0@2dCnL<$j-qr9L&M`lL5D z(Jg%h*(2AFmk(S^Onhux>cB?H;>YJE=cKZwR~3}pmJcYob}zo~KupBx=(Nh~M4*nz zFreXsw&7fy?>G)Rb7uLh_>fd0az4fHf;q3Jlg~yVw=Ucr;=5V{Uqw2b-#L3OowL9U z9j+Ix`1q<;8v}WtQ-xXig+I)9(3;nXc|pGNB1^pvR0~0A$kl-?YrweTR}h1GVi

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/backup_config.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 000000000..78f40ae7c --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/main_pages.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 000000000..b2d427a7b --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,11 @@ +{ + "src": [ + "pages/Index", + "pages/PageOne", + "pages/PageTwo", + "pages/PageThree", + "pages/PageFour", + "pages/PageFive", + "pages/PageComponentV2" + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/main/resources/dark/element/color.json b/ArkUIKit/wrapbuilder/entry/src/main/resources/dark/element/color.json new file mode 100644 index 000000000..79b11c274 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/mock/mock-config.json5 b/ArkUIKit/wrapbuilder/entry/src/mock/mock-config.json5 new file mode 100644 index 000000000..323d1d611 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/mock/mock-config.json5 @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ +{ +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 000000000..7f30942b8 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 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 { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +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); + }) + }) +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Index.test.ets b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Index.test.ets new file mode 100644 index 000000000..3ef88d773 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/Index.test.ets @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2025 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 { describe, it, expect, beforeAll, TestType, Level, Size, } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON, MatchPattern } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function IndexTest() { + describe('IndexTest', () => { + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + let driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * @tc.number PageOneTest + * @tc.name PageOneTest + * @tc.desc 测试PageOne是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageOneTest', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageOneTest begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageOne', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: PageOneTest end'); + done(); + }) + + /** + * @tc.number PageTwoTest + * @tc.name PageTwoTest + * @tc.desc 测试PageTwo是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageTwoTest', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageOneTest begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageTwo', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: PageTwo end'); + done(); + }) + + /** + * @tc.number PageThreeTest + * @tc.name PageThreeTest + * @tc.desc 测试PageThree是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageThreeTest', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageThreeTest begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageThree', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: PageThreeTest end'); + done(); + }) + + /** + * @tc.number PageFourTest + * @tc.name PageFourTest + * @tc.desc 测试PageFour是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageFourTest', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageOneTest begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageFour', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + let button2 = await driver.findComponent(ON.text('Click me', MatchPattern.CONTAINS)); + expect(button2 === null).assertFalse(); + await button2.click(); + await driver.pressBack(); + console.info('uitest: PageFourTest end'); + done(); + }) + + /** + * @tc.number PageFiveTest + * @tc.name PageFiveTest + * @tc.desc 测试PageFive是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageFiveTest', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageFiveTest begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageFive', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: PageFiveTest end'); + done(); + }) + + /** + * @tc.number PageComponentV2Test + * @tc.name PageComponentV2Test + * @tc.desc 测试PageComponentV2是否显示正常 + * @tc.level : Level1 + * @tc.size : MediumTest + * @tc.type : Function + */ + it('PageComponentV2Test', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL1, async (done: Function) => { + console.info('uitest: PageComponentV2Test begin'); + let driver = Driver.create(); + let button1 = await driver.findComponent(ON.text('PageComponentV2', MatchPattern.CONTAINS)); + expect(button1 === null).assertFalse(); + await button1.click(); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: PageComponentV2Test end'); + done(); + }) + }) +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/List.test.ets b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 000000000..c33c26367 --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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 IndexTest from './Index.test' +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); + IndexTest() +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/ohosTest/module.json5 b/ArkUIKit/wrapbuilder/entry/src/ohosTest/module.json5 new file mode 100644 index 000000000..59667117c --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/ohosTest/module.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 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_test", + "type": "feature", + "deviceTypes": [ + "default" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/ArkUIKit/wrapbuilder/entry/src/ohosTest/ohosTest.md b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ohosTest.md new file mode 100644 index 000000000..e22860b0d --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/ohosTest/ohosTest.md @@ -0,0 +1,7 @@ +# arkts-wrapbuilder 测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------- | -------------- |---------------------------------------|----------| :------- | -------- | +| arkts-wrapbuilder示例代码验证 | 设备正常运行 | 进入页面,页面内容显示正常 | 页面信息显示正常 | 是 | Pass | \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/test/List.test.ets b/ArkUIKit/wrapbuilder/entry/src/test/List.test.ets new file mode 100644 index 000000000..a60c87c5c --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/test/List.test.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 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 localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/entry/src/test/LocalUnit.test.ets b/ArkUIKit/wrapbuilder/entry/src/test/LocalUnit.test.ets new file mode 100644 index 000000000..841bfd77e --- /dev/null +++ b/ArkUIKit/wrapbuilder/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 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 { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // 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. + 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); + }); + }); +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/hvigor/hvigor-config.json5 b/ArkUIKit/wrapbuilder/hvigor/hvigor-config.json5 new file mode 100644 index 000000000..3b057578a --- /dev/null +++ b/ArkUIKit/wrapbuilder/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 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. + */ +{ + "modelVersion": "6.0.0", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | "ultrafine" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + // "optimizationStrategy": "memory" /* Define the optimization strategy. Value: [ "memory" | "performance" ]. Default: "memory" */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/ArkUIKit/wrapbuilder/hvigorfile.ts b/ArkUIKit/wrapbuilder/hvigorfile.ts new file mode 100644 index 000000000..ae9086af3 --- /dev/null +++ b/ArkUIKit/wrapbuilder/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 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 { 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. */ +} \ No newline at end of file diff --git a/ArkUIKit/wrapbuilder/oh-package.json5 b/ArkUIKit/wrapbuilder/oh-package.json5 new file mode 100644 index 000000000..837c0ff9f --- /dev/null +++ b/ArkUIKit/wrapbuilder/oh-package.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 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. + */ +{ + "modelVersion": "6.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.24", + "@ohos/hamock": "1.0.0" + } +} diff --git a/ArkUIKit/wrapbuilder/screenshots/PageIndex.png b/ArkUIKit/wrapbuilder/screenshots/PageIndex.png new file mode 100644 index 0000000000000000000000000000000000000000..fb39e96706d9f3badf12ff751df8bbc749114d28 GIT binary patch literal 39022 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 I-1*o41IQc0yZ`_I literal 0 HcmV?d00001 diff --git a/ArkUIKit/wrapbuilder/screenshots/PageOne.png b/ArkUIKit/wrapbuilder/screenshots/PageOne.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3031df4f3222ee7ed471e9f0f0654beefa9040 GIT binary patch literal 40088 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 literal 0 HcmV?d00001 diff --git a/ArkUIKit/wrapbuilder/screenshots/PageThree.png b/ArkUIKit/wrapbuilder/screenshots/PageThree.png new file mode 100644 index 0000000000000000000000000000000000000000..b2001241c6e9cbfbd795fc78c315b64cca4b3fc1 GIT binary patch literal 31948 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 literal 0 HcmV?d00001 -- Gitee From df1ca098b4abf59386f201444365e40916e19f35 Mon Sep 17 00:00:00 2001 From: tianlongdevcode Date: Fri, 31 Oct 2025 09:32:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Fixed=20synchronize=20openharmony=20sample?= =?UTF-8?q?=20include=20UIExtensionAndAccessibility=E3=80=81Watch=E3=80=81?= =?UTF-8?q?GestureConflict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: https://gitee.com/harmonyos_samples/guide-snippets/issues/ID4AG2 Description: isues ID4AG2 is synchronize openharmony sample Signed-off-by: chenbosongcode --- ArkUIKit/ScrollableComponent/README_zh.md | 61 ++- .../ScrollableComponent/build-profile.json5 | 5 +- .../ets/pages/arcList/ArcListAcrScrollBar.ets | 27 +- .../pages/arcList/ArcListArcIndexerBar.ets | 65 ++- .../ets/pages/arcList/ArcListContents.ets | 5 +- .../main/ets/pages/arcList/ArcListCreate.ets | 77 +++ .../main/ets/pages/arcList/ArcListCrown.ets | 20 +- .../main/ets/pages/arcList/ArcListShow.ets | 7 +- .../ets/pages/arcList/ArcListSideSlip.ets | 15 +- .../main/ets/pages/arcList/ArcListStyles.ets | 37 +- .../main/ets/pages/arcList/ArcLongList.ets | 4 + .../arcList/arcListBuiltInScrollerBar.ets | 30 +- .../src/main/ets/pages/arcList/index.ets | 8 + .../ets/pages/arcSwiper/ArcSwiperAction.ets | 19 +- .../pages/arcSwiper/ArcSwiperHorizontal.ets | 4 + .../ets/pages/arcSwiper/ArcSwiperSideSlip.ets | 16 +- .../ets/pages/arcSwiper/ArcSwiperStyles.ets | 8 + .../ets/pages/arcSwiper/ArcSwiperToggle.ets | 55 +- .../ets/pages/arcSwiper/ArcSwiperVertical.ets | 4 + .../src/main/ets/pages/grid/DataInGrid.ets | 48 +- .../main/ets/pages/grid/GridCalculator.ets | 9 +- .../src/main/ets/pages/grid/GridScrollbar.ets | 17 +- .../main/ets/pages/grid/GridSideToSide.ets | 12 +- .../src/main/ets/pages/grid/LongGrid.ets | 11 +- .../ets/pages/grid/ScrollPositionGrid.ets | 1 + .../main/ets/pages/grid/ScrollableGrid.ets | 41 +- .../src/main/ets/pages/list/AddListItem.ets | 34 +- .../main/ets/pages/list/CollapseAndExpand.ets | 42 +- .../list/ControlledScrollPositionList.ets | 5 +- .../main/ets/pages/list/DeleteListItem.ets | 52 +- .../entry/src/main/ets/pages/list/Index.ets | 9 + .../src/main/ets/pages/list/ListChatRoom.ets | 22 +- .../src/main/ets/pages/list/ListLayout.ets | 18 +- .../src/main/ets/pages/list/LongList.ets | 2 +- .../list/ResponsiveScrollPositionList.ets | 22 +- .../ets/pages/list/SupportSlidingHand.ets | 171 +++++++ .../ets/pages/swiper/SwiperAndTabsLinkage.ets | 8 +- .../pages/swiper/SwiperCustomAnimation.ets | 10 +- ...wiperDigitIndicatorIgnoreComponentSize.ets | 96 ++++ .../main/ets/pages/swiper/SwiperDirection.ets | 12 +- .../swiper/SwiperIgnoreComponentSize.ets | 37 +- .../ets/pages/swiper/SwiperIndicatorStyle.ets | 4 +- .../main/ets/pages/swiper/SwiperMultiPage.ets | 16 +- .../pages/swiper/SwiperPageSwitchMethod.ets | 82 ++- .../swiper/SwiperVisibleContentPosition.ets | 134 +++++ .../entry/src/main/ets/pages/swiper/index.ets | 25 + .../pages/tabs/ContentPageNoAndTabLinkage.ets | 70 +++ .../ets/pages/tabs/NumberOfCachesTabBar.ets | 83 +++ .../entry/src/main/ets/pages/tabs/index.ets | 19 +- .../pages/waterFlow/WaterFlowDataSource.ets | 3 +- .../waterFlow/WaterFlowDynamicSwitchover.ets | 13 +- .../waterFlow/WaterFlowGroupingMixing.ets | 146 ++---- .../waterFlow/WaterFlowInfiniteScrolling.ets | 7 +- .../WaterFlowInfiniteScrollingEarly.ets | 3 +- .../main/resources/base/element/string.json | 184 +++++++ .../base/media/ic_public_delete_filled.svg | 1 + .../entry/src/main/syscap.json | 18 + .../entry/src/ohosTest/ets/test/List.test.ets | 4 + .../src/ohosTest/ets/test/index.test.ets | 480 +++++++----------- .../src/ohosTest/ets/test/index1.test.ets | 441 ++++++++++++++++ .../src/ohosTest/ets/test/indexAdd.test.ets | 69 +++ .../entry/src/ohosTest/syscap.json | 18 + ArkUIKit/ScrollableComponent/ohosTest.md | 27 + .../screenshots/device/image4.jpeg | Bin 0 -> 28002 bytes .../screenshots/device/image5.jpeg | Bin 0 -> 36505 bytes 65 files changed, 2407 insertions(+), 586 deletions(-) create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCreate.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/SupportSlidingHand.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDigitIndicatorIgnoreComponentSize.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperVisibleContentPosition.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/ContentPageNoAndTabLinkage.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/NumberOfCachesTabBar.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/resources/base/media/ic_public_delete_filled.svg create mode 100644 ArkUIKit/ScrollableComponent/entry/src/main/syscap.json create mode 100644 ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index1.test.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/indexAdd.test.ets create mode 100644 ArkUIKit/ScrollableComponent/entry/src/ohosTest/syscap.json create mode 100644 ArkUIKit/ScrollableComponent/ohosTest.md create mode 100644 ArkUIKit/ScrollableComponent/screenshots/device/image4.jpeg create mode 100644 ArkUIKit/ScrollableComponent/screenshots/device/image5.jpeg diff --git a/ArkUIKit/ScrollableComponent/README_zh.md b/ArkUIKit/ScrollableComponent/README_zh.md index 5b7104c0f..98191a1a6 100644 --- a/ArkUIKit/ScrollableComponent/README_zh.md +++ b/ArkUIKit/ScrollableComponent/README_zh.md @@ -2,24 +2,28 @@ ### 介绍 -本示例通过使用[ArkUI指南文档](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-ui-development)中各场景的开发示例,展示在工程中,帮助开发者更好地理解ArkUI提供的组件及组件属性并合理使用。该工程中展示的代码详细描述可查如下链接: - -1. [创建列表 (List)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-create-list)。 -2. [创建弧形列表 (ArcList)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-create-arclist)(圆形屏幕推荐使用) -3. [创建网格 (Grid/GridItem)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-create-grid)。 -4. [创建瀑布流 (WaterFlow)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-create-waterflow) -5. [创建轮播 (Swiper)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-create-looping)。 -6. [创建弧形轮播 (ArcSwiper)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-arcswiper)(圆形屏幕推荐使用) -7. [选项卡 (Tabs)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-navigation-tabs) +本示例通过使用[ArkUI指南文档](https://gitcode.com/openharmony/docs/tree/master/zh-cn/application-dev/ui)中各场景的开发示例,展示在工程中,帮助开发者更好地理解ArkUI提供的组件及组件属性并合理使用。该工程中展示的代码详细描述可查如下链接: + +1. [创建列表 (List)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-create-list.md)。 +2. [创建弧形列表 (ArcList)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-create-arclist.md)(圆形屏幕推荐使用) +3. [创建网格 (Grid/GridItem)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-create-grid.md)。 +4. [创建瀑布流 (WaterFlow)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-create-waterflow.md) +5. [创建轮播 (Swiper)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-create-looping.md)。 +6. [创建弧形轮播 (ArcSwiper)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-layout-development-arcswiper.md)(圆形屏幕推荐使用) +7. [选项卡 (Tabs)](https://gitcode.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/arkts-navigation-tabs.md) ### 效果预览 | 首页 | 列表类组件目录 | 列表中显示数据示例 | |------------------------------------|------------------------------------|------------------------------------| | ![](screenshots/device/image1.png) | ![](screenshots/device/image2.png) | ![](screenshots/device/image3.png) | + 缓存数预览图 + ![](screenshots/device/image4.jpeg) + 标签与内容不联动预览图 + ![](screenshots/device/image5.jpeg) ### 使用说明 -1. 在主界面,可以点击对应卡片,选择需要参考的组件示例。 +1. 在主界面,可以点击对应页面,选择需要参考的组件示例。 2. 在组件目录选择详细的示例参考。 @@ -37,6 +41,7 @@ entry/src/main/ets/ | | |---ArcListArcIndexerBar.ets | | |---arcListBuiltInScrollerBar.ets | | |---ArcListContents.ets +| | |---ArcListCreate.ets | | |---ArcListCrown.ets | | |---ArcListShow.ets | | |---ArcListSideSlip.ets @@ -78,6 +83,7 @@ entry/src/main/ets/ | | |---LongList.ets | | |---ResponsiveScrollPositionList.ets | | |---StickyHeaderList.ets +| | |---SupportSlidingHand.ets | | |---SwipeListItem.ets | | |---TaggedListItems.ets | |---swiper //轮播 @@ -85,12 +91,14 @@ entry/src/main/ets/ | | |---SwiperAndTabsLinkage.ets | | |---SwiperAutoPlay.ets | | |---SwiperCustomAnimation.ets +| | |---SwiperDigitIndicatorIgnoreComponentSize.ets | | |---SwiperDirection.ets | | |---SwiperIgnoreComponentSize.ets | | |---SwiperIndicatorStyle.ets | | |---SwiperLoop.ets | | |---SwiperMultiPage.ets | | |---SwiperPageSwitchMethod.ets +| | |---SwiperVisibleContentPosition.ets | |---tabs //选项卡 | | |---AgeFriendlyTabs.ets | | |---BottomTabBar.ets @@ -121,6 +129,31 @@ entry/src/ohosTest/ |---ets | |---index.test.ets // 示例代码测试代码 ``` +### 具体实现 + +1. 初始化List,可设置space(列表项间距)控制项间距离。 +2. 每个ListItem内通过容器组件(如Row/Column)组合内容(如头像 + 文字)。 +3. 配置divider添加分隔线(设置粗细、颜色、左右边距),并通过scrollBar(BarState.Auto)开启按需显示的滚动条。 +4. 固定List的高度,确保超出时触发滚动。 +5. 定义数据源(如TodoItem模型类,含id/title/isCompleted等属性,id用于ForEach的唯一 key)。 +6. 在List内用ForEach遍历数据源,每个循环项生成ListItem,并绑定数据(如文字显示title,复选框关联isCompleted)。 +7. 添加交互逻辑(如 “删除” 按钮触发数组filter移除对应项,“新增” 按钮触发数组push添加新项)。 +8. 配置divider和scrollBar,保证列表样式和滚动功能。 +9. 定义分组数据源(如GroupData接口,含groupName(分组标题)和items(组内子项数组))。 +10. 弧形列表 (ArcList)(圆形屏幕推荐使用) + 固定List的高度,确保超出时触发滚动。 + 使用弧形列表可以通过在ArcList组件中按垂直方向线性排列子组件ArcListItem,可以为弧形列表中的每一项提供独立视图。此外,可以使用循环渲染来迭代一组列表项,或结合任意数量的单个视图与ForEach结构,构建复杂的弧形列表。ArcList组件支持多种渲染控制方式,包括条件渲染、循环渲染和懒加载,以生成子组件。 + 定义数据源(如TodoItem模型类,含id/title/isCompleted等属性,id用于ForEach的唯一 key)。 +11. 创建瀑布流(WaterFlow) + 在List内用ForEach遍历数据源,每个循环项生成ListItem,并绑定数据(如文字显示title,复选框关联isCompleted)。 + ArkUI提供了WaterFlow容器组件,用于构建瀑布流布局。WaterFlow组件支持条件渲染、循环渲染和懒加载等方式生成子组件 + +## 具体实现 + +1. 弧形列表 (ArcList)(圆形屏幕推荐使用) + 使用弧形列表可以通过在ArcList组件中按垂直方向线性排列子组件ArcListItem,可以为弧形列表中的每一项提供独立视图。此外,可以使用循环渲染来迭代一组列表项,或结合任意数量的单个视图与ForEach结构,构建复杂的弧形列表。ArcList组件支持多种渲染控制方式,包括条件渲染、循环渲染和懒加载,以生成子组件。 +2. 创建瀑布流(WaterFlow) + ArkUI提供了WaterFlow容器组件,用于构建瀑布流布局。WaterFlow组件支持条件渲染、循环渲染和懒加载等方式生成子组件 ### 相关权限 @@ -134,9 +167,9 @@ entry/src/ohosTest/ 1.本示例仅支持标准系统上运行, 支持设备:RK3568。 -2.本示例为Stage模型,支持API18版本full-SDK,版本号:5.1.0.107,镜像版本号:OpenHarmony_5.1.0 Release。 +2.本示例为Stage模型,支持API20版本full-SDK,版本号:6.0.0.47,镜像版本号:OpenHarmony_6.0.0 Release。 -3.本示例需要使用DevEco Studio 5.0.5 Release (Build Version: 5.0.13.200, built on May 13, 2025)及以上版本才可编译运行。 +3.本示例需要使用DevEco Studio 6.0.0 Release (Build Version: 6.0.0.858, built on September 24, 2025)及以上版本才可编译运行。 ### 下载 @@ -145,7 +178,7 @@ entry/src/ohosTest/ ```` git init git config core.sparsecheckout true -echo code/DocsSample/ArkUIDocSample/ScrollableComponent > .git/info/sparse-checkout -git remote add origin https://gitee.com/openharmony/applications_app_samples.git +echo code/DocsSample/ArkUISample/ScrollableComponent > .git/info/sparse-checkout +git remote add origin https://gitcode.com/openharmony/applications_app_samples.git git pull origin master ```` \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/build-profile.json5 b/ArkUIKit/ScrollableComponent/build-profile.json5 index f9ba3cae3..724b825f1 100644 --- a/ArkUIKit/ScrollableComponent/build-profile.json5 +++ b/ArkUIKit/ScrollableComponent/build-profile.json5 @@ -20,8 +20,9 @@ { "name": "default", "signingConfig": "default", - "targetSdkVersion": "5.1.0(18)", - "compatibleSdkVersion": "5.1.0(18)", + "compileSdkVersion": "6.0.0(20)", + "compatibleSdkVersion": "6.0.0(20)", + "targetSdkVersion": "6.0.0(20)", "runtimeOS": "HarmonyOS", "buildOption": { "strictMode": { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListAcrScrollBar.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListAcrScrollBar.ets index 6cb9df1e9..27c499551 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListAcrScrollBar.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListAcrScrollBar.ets @@ -20,19 +20,38 @@ import { ArcListItemAttribute, LengthMetrics, ArcScrollBar, + ComponentContent, } from '@kit.ArkUI'; import { ComponentCard } from '../../common/Card'; +@Builder +function customHeader() { + Column() { + Text($r('app.string.ArcListCrown_set')) + .fontColor('#FFFFFFFF') + .fontSize('19fp') + } +} + @Entry @Component export struct ArcListAcrScrollBar { + // [Start create_arcListScroller_start] private arcListScroller: Scroller = new Scroller(); + // [End create_arcListScroller_start] + + + context: UIContext = this.getUIContext(); + arcListHeader: ComponentContent = new ComponentContent(this.context, wrapBuilder(customHeader)); build() { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcListAcrScrollBar_title') }) { - ArcList({ scroller: this.arcListScroller }) { + // [Start bind_arcList_start] + // 将arcListScroller用于初始化ArcList组件的scroller参数,完成arcListScroller与弧形列表的绑定。 + ArcList({ scroller: this.arcListScroller, header: this.arcListHeader }) { + // [StartExclude bind_arcList_start] ArcListItem() { Row() { Image($r('app.media.wlan')).width('99px').height('99px') @@ -119,14 +138,20 @@ export struct ArcListAcrScrollBar { .width('414px') .height('129px') .backgroundColor('#26FFFFFF') + + // [EndExclude bind_arcList_start] } + // [End bind_arcList_start] .width('466px') .height('466px') .space(LengthMetrics.px(10)) .borderRadius('233px') .backgroundColor(Color.Black) + // [Start bind_arcScrollBar_start] + // 将arcListScroller用于初始化ArcScrollBar组件的scroller参数,完成arcListScroller与滚动条的绑定。 ArcScrollBar({ scroller: this.arcListScroller }) + // [End bind_arcScrollBar_start] } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListArcIndexerBar.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListArcIndexerBar.ets index ca16ea355..8be18dbcb 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListArcIndexerBar.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListArcIndexerBar.ets @@ -12,13 +12,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start arcAlphabetIndexer_start] import { ArcList, ArcListAttribute, ArcListItemAttribute, ArcListItem, LengthMetrics } from '@kit.ArkUI'; import { ColorMetrics, ComponentContent } from '@ohos.arkui.node'; import { util } from '@kit.ArkTS'; import { ArcAlphabetIndexer, ArcAlphabetIndexerAttribute } from '@ohos.arkui.ArcAlphabetIndexer'; import { ComponentCard } from '../../common/Card'; +// [StartExclude arcAlphabetIndexer_start] class Contact { key: string = util.generateRandomUUID(true); name: string; @@ -29,20 +30,28 @@ class Contact { this.firstChar = firstChar; } } + @Builder function buildText() { Column() { - Text('Contacts') + Text($r('app.string.contacts')) .fontColor('#FFFFFF') .fontSize('19fp') - } } +// [EndExclude arcAlphabetIndexer_start] +const alphabets: string[] = [ + '#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +]; @Entry @Component export struct ArcListArcIndexerBar { + // [StartExclude arcAlphabetIndexer_start] + private watchSize: string = '600px'; // 手表默认宽高:233*233 + @State contacts: Array = [ new Contact('阿哈', 'A'), new Contact('贝贝', 'B'), @@ -64,23 +73,26 @@ export struct ArcListArcIndexerBar { new Contact('叔叔', 'S'), new Contact('天天', 'T'), ]; - private scrollerForList: Scroller = new Scroller(); - private watchSize: string = '600px'; // 手表默认宽高:233*233 - private fullValue: string[] = [ - '#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' - ]; + // [EndExclude arcAlphabetIndexer_start] + // 索引条选中项索引 @State indexerIndex: number = 0; + // 列表绑定的滚动控制器 + private arcListScroller: Scroller = new Scroller(); + // [StartExclude arcAlphabetIndexer_start] context: UIContext = this.getUIContext(); tabBar1: ComponentContent = new ComponentContent(this.context, wrapBuilder(buildText)); + // [EndExclude arcAlphabetIndexer_start] build() { + // [StartExclude arcAlphabetIndexer_start] NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcListArcIndexerBar_title') }) { - Stack() { - ArcList({ initialIndex: 0, header:this.tabBar1, scroller:this.scrollerForList }) { + // [EndExclude arcAlphabetIndexer_start] + Stack({alignContent: Alignment.End}) { + ArcList({ initialIndex: 0, header:this.tabBar1, scroller:this.arcListScroller }) { + // [StartExclude arcAlphabetIndexer_start] ForEach(this.contacts, (item: Contact) => { ArcListItem() { Row() { @@ -101,27 +113,36 @@ export struct ArcListArcIndexerBar { .height('130px') .backgroundColor('#26FFFFFF') }, (item: Contact) => JSON.stringify(item)) + // [EndExclude arcAlphabetIndexer_start] } + // [StartExclude arcAlphabetIndexer_start] .space(LengthMetrics.px(10)) .scrollBar(BarState.Off) .width(this.watchSize) .height(this.watchSize) .borderRadius(this.watchSize) .backgroundColor(Color.Black) + // [EndExclude arcAlphabetIndexer_start] .onScrollIndex((firstIndex: number, lastIndex: number, centerIndex: number) => { + // 根据列表滚动到的索引值,重新计算对应索引条的位置this.selectedIndex this.indexerIndex = centerIndex + 1; }) - - ArcAlphabetIndexer({ arrayValue: this.fullValue, selected: this.indexerIndex}) - .autoCollapse(true) - .width(this.watchSize) - .height(this.watchSize) - .usePopup(false) + // [StartExclude arcAlphabetIndexer_start] + .id('arcIndexTest') + // [EndExclude arcAlphabetIndexer_start] + // 弧形索引条组件 + ArcAlphabetIndexer({ arrayValue: alphabets, selected: this.indexerIndex}) .selected(this.indexerIndex!!) .onSelect((index: number) => { + // 选中索引项后,列表跳转到相应位置 this.indexerIndex = index - this.scrollerForList.scrollToIndex(this.indexerIndex - 1) + this.arcListScroller.scrollToIndex(this.indexerIndex - 1) }) + // [StartExclude arcAlphabetIndexer_start] + .autoCollapse(true) + .width(this.watchSize) + .height(this.watchSize) + .usePopup(false) .hitTestBehavior(HitTestMode.Transparent) .selectedColor(ColorMetrics.resourceColor(0xFFFFFF)) .selectedBackgroundColor(ColorMetrics.resourceColor(0x1F71FF)) @@ -141,8 +162,10 @@ export struct ArcListArcIndexerBar { weight: 500, family: 'HarmonyOS Sans' }) - - }.width('600px') + // [EndExclude arcAlphabetIndexer_start] + } + // [StartExclude arcAlphabetIndexer_start] + .width('600px') } } .width('100%') @@ -151,5 +174,7 @@ export struct ArcListArcIndexerBar { } .backgroundColor('#f1f2f3') .title($r('app.string.ArcListArcIndexerBar_title')) + // [EndExclude arcAlphabetIndexer_start] } } +// [End arcAlphabetIndexer_start] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListContents.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListContents.ets index 007f3911d..8a2561f88 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListContents.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListContents.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start arcListContentsTitle_start] import { ArcList, ArcListAttribute, ArcListItemAttribute, ArcListItem, LengthMetrics } from '@kit.ArkUI'; import { util } from '@kit.ArkTS'; import { ComponentCard } from '../../common/Card'; @@ -78,4 +78,5 @@ export struct ArcListContents { .backgroundColor('#f1f2f3') .title($r('app.string.ArcListContents_title')) } -} \ No newline at end of file +} +// [End arcListContentsTitle_start] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCreate.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCreate.ets new file mode 100644 index 000000000..cf7506b4b --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCreate.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 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 { ColorMetrics, LengthMetrics } from '@kit.ArkUI'; +import { ArcList, ArcListItem, ArcListAttribute, ArcListItemAttribute } from '@kit.ArkUI'; +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct ArcListCreate { + private watchSize: string = '466px'; // 手表默认宽高:466*466 + + build() { + NavDestination() { + Column() { + ComponentCard({ title: $r('app.string.ArcListCreate_title') }) { + Stack() { + // [Start arcList_create_start] + ArcList({ + initialIndex: 2 + }) { + ArcListItem() { + // [StartExclude arcList_create_start] + Row() { + Text($r('app.string.First_subassembly')).fontSize('38px').fontColor('#FFFFFFFF') + } + // [EndExclude arcList_create_start] + } + ArcListItem() { + // [StartExclude arcList_create_start] + Row() { + Text($r('app.string.Second_subassembly')).fontSize('38px').fontColor('#FFFFFFFF') + } + // [EndExclude arcList_create_start] + } + // [StartExclude arcList_create_start] + ArcListItem() { + Row() { + Text($r('app.string.Third_subassembly')).fontSize('38px').fontColor('#FFFFFFFF') + } + } + // [EndExclude arcList_create_start] + } + // [End arcList_create_start] + .digitalCrownSensitivity(CrownSensitivity.MEDIUM) + .space(LengthMetrics.px(10)) + .scrollBarWidth(LengthMetrics.px(10)) + .scrollBarColor(ColorMetrics.resourceColor(Color.White)) + .borderRadius(this.watchSize) + } + .align(Alignment.Center) + .width(this.watchSize) + .height(this.watchSize) + .borderRadius(this.watchSize) + .backgroundColor(Color.Black) + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.ArcListCreate_title')) + } +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCrown.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCrown.ets index cc76cdd3c..1ae5539fb 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCrown.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListCrown.ets @@ -37,9 +37,13 @@ export struct ArcListCrown { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcListCrown_title') }) { Stack() { + // [Start arcListCrown_start] + // [Start arcListCrownDigitalCrownSensitivity_start] ArcList({ initialIndex: 2, }) { + // [StartExclude arcListCrown_start] + // [StartExclude arcListCrownDigitalCrownSensitivity_start] ArcListItem() { Text('Network').fontSize('38px').fontColor('#FFFFFFFF') } @@ -109,14 +113,24 @@ export struct ArcListCrown { .width('414px') .height('100px') .backgroundColor('#26FFFFFF') + // [EndExclude arcListCrown_start] + // [EndExclude arcListCrownDigitalCrownSensitivity_start] } + // [StartExclude arcListCrownDigitalCrownSensitivity_start] + // 设置弧形列表支持获焦 + .focusable(true) + // 设置弧形列表支持点击获焦 + .focusOnTouch(true) + // 设置弧形列表为所在页面上的默认焦点 + .defaultFocus(true) + // [End arcListCrown_start] + // [EndExclude arcListCrownDigitalCrownSensitivity_start] + .digitalCrownSensitivity(CrownSensitivity.MEDIUM) + // [End arcListCrownDigitalCrownSensitivity_start] .space(LengthMetrics.px(10)) .scrollBarWidth(LengthMetrics.px(10)) .scrollBarColor(ColorMetrics.resourceColor(Color.White)) .borderRadius(this.watchSize) - .focusable(true) - .focusOnTouch(true) - .defaultFocus(true) } .align(Alignment.Center) .width(this.watchSize) diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListShow.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListShow.ets index 932600a06..cc3a37633 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListShow.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListShow.ets @@ -12,9 +12,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { ArcList, ArcListItem, ArcListAttribute, ArcListItemAttribute, LengthMetrics, } from '@kit.ArkUI'; import { ComponentCard } from '../../common/Card'; +// [Start arcListShow_start] +import { ArcList, ArcListItem, ArcListAttribute, ArcListItemAttribute, LengthMetrics, } from '@kit.ArkUI'; @Entry @Component @@ -125,4 +125,5 @@ export struct ArcListShow { .backgroundColor('#f1f2f3') .title($r('app.string.ArcListShow_title')) } -} \ No newline at end of file +} +// [End arcListShow_start] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListSideSlip.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListSideSlip.ets index ce364a1d3..0f8e53a66 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListSideSlip.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListSideSlip.ets @@ -28,6 +28,7 @@ class Contact { this.firstChar = firstChar; } } + @Builder function buildText() { Column() { @@ -67,18 +68,17 @@ export struct ArcListSideSlip { new Contact('叔叔', 'S'), new Contact('天天', 'T'), ]; - private scrollerForList: Scroller = new Scroller(); - @State indexerIndex: number = 0; context: UIContext = this.getUIContext(); tabBar1: ComponentContent = new ComponentContent(this.context, wrapBuilder(buildText)); + // [Start create_SideSlip_start] @Builder itemEnd(item: Contact) { // 构建尾端滑出组件 Button({ type: ButtonType.Circle }) { - Image($r('app.media.MaterialSymbolsDelete')) + Image($r('app.media.ic_public_delete_filled')) .width(20) .height(20) } @@ -92,12 +92,14 @@ export struct ArcListSideSlip { iterations: 1, playMode: PlayMode.Normal, }, () => { + // this.contacts为列表数据源,可根据实际场景构造,indexOf方法可获取将被删除数据在数据源中的索引 let index = this.contacts.indexOf(item); + // 从数据源删除指定数据项 this.contacts.splice(index, 1); }) - }) } + // [End create_SideSlip_start] build() { NavDestination() { @@ -106,7 +108,10 @@ export struct ArcListSideSlip { Stack() { ArcList({ initialIndex: 0, header: this.tabBar1, scroller: this.scrollerForList }) { ForEach(this.contacts, (item: Contact) => { + // [Start bind_swipeAction_start] + // 构建ArcList时,通过ForEach基于数据源this.contacts循环渲染ArcListItem ArcListItem() { + // [StartExclude bind_swipeAction_start] Row() { Text(item.firstChar) .textAlign(TextAlign.Center) @@ -121,6 +126,7 @@ export struct ArcListSideSlip { .borderRadius('65px') .width('90%') .justifyContent(FlexAlign.Start) + // [EndExclude bind_swipeAction_start] } .swipeAction({ end: { @@ -130,6 +136,7 @@ export struct ArcListSideSlip { }, } }) // 设置侧滑属性. + // [End bind_swipeAction_start] .borderRadius('65px') .width('400px') .height('130px') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListStyles.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListStyles.ets index d3452e6ba..2545e281b 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListStyles.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcListStyles.ets @@ -23,6 +23,7 @@ import { } from '@kit.ArkUI'; import { ComponentCard } from '../../common/Card'; +//[Start create_customHeader_start] @Builder function customHeader() { Column() { @@ -31,22 +32,26 @@ function customHeader() { .fontSize('19fp') } } - +//[End create_customHeader_start] @Entry @Component export struct ArcListStyles { + //[Start componentContent_start] context: UIContext = this.getUIContext(); arcListHeader: ComponentContent = new ComponentContent(this.context, wrapBuilder(customHeader)); + //[End componentContent_start] build() { NavDestination() { Column({ space: 12 }) { - List(){ - ListItem(){ + List() { + ListItem() { ComponentCard({ title: $r('app.string.ArcListStyles_head') }) { + //[Start arcListHeader_start] ArcList({ header: this.arcListHeader }) { ArcListItem() { + // [StartExclude arcListHeader_start] Row() { Image($r('app.media.wlan')).width('99px').height('99px') .borderRadius('50px').margin({ left: 7 }) @@ -58,13 +63,17 @@ export struct ArcListStyles { Image($r('app.media.ic_settings_arrow')).width('92px').height('92px') .borderRadius('50px') } + // [EndExclude arcListHeader_start] } + // [StartExclude arcListHeader_start] .borderRadius('65px') .width('414px') .height('129px') .backgroundColor('#26FFFFFF') + // [EndExclude arcListHeader_start] ArcListItem() { + // [StartExclude arcListHeader_start] Row() { Image($r('app.media.blueTooth')).width('99px').height('99px') .borderRadius('50px').margin({ left: 7 }) @@ -76,7 +85,9 @@ export struct ArcListStyles { Image($r('app.media.ic_settings_arrow')).width('92px').height('92px') .borderRadius('50px') } + // [EndExclude arcListHeader_start] } + // [StartExclude arcListHeader_start] .borderRadius('65px') .width('414px') .height('129px') @@ -132,7 +143,9 @@ export struct ArcListStyles { .width('414px') .height('129px') .backgroundColor('#26FFFFFF') + // [EndExclude arcListHeader_start] } + //[End arcListHeader_start] .width('466px') .height('466px') .space(LengthMetrics.px(10)) @@ -141,9 +154,11 @@ export struct ArcListStyles { } } - ListItem(){ + ListItem() { ComponentCard({ title: $r('app.string.ArcListStyles_titleSpacing') }) { + // [Start arcListSpace_start] ArcList({ initialIndex: 2 }) { + // [StartExclude arcListSpace_start] ArcListItem() { Row() { Image($r('app.media.wlan')).width('99px').height('99px') @@ -230,17 +245,18 @@ export struct ArcListStyles { .width('414px') .height('129px') .backgroundColor('#26FFFFFF') + // [EndExclude arcListSpace_start] } + .space(LengthMetrics.px(30)) + // [End arcListSpace_start] .width('466px') .height('466px') - .space(LengthMetrics.px(30)) .borderRadius('233px') .backgroundColor(Color.Black) - } } - ListItem(){ + ListItem() { ComponentCard({ title: $r('app.string.ArcListStyles_titleScale') }) { ArcList({ initialIndex: 2 }) { ArcListItem() { @@ -278,8 +294,9 @@ export struct ArcListStyles { .width('414px') .height('129px') .backgroundColor('#26FFFFFF') - + // [Start arcListScale_start] ArcListItem() { + // [StartExclude arcListScale_start] Row() { Image($r('app.media.mobileData')).width('99px').height('99px') .borderRadius('50px').margin({ left: 7 }) @@ -290,12 +307,14 @@ export struct ArcListStyles { Image($r('app.media.ic_settings_arrow')).width('92px').height('92px') .borderRadius('50px') } + // [EndExclude arcListScale_start] } + .autoScale(false) + // [End arcListScale_start] .borderRadius('65px') .width('414px') .height('129px') .backgroundColor('#26FFFFFF') - .autoScale(false) ArcListItem() { Row() { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcLongList.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcLongList.ets index 6ddd21ef9..72677d37f 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcLongList.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/ArcLongList.ets @@ -122,7 +122,9 @@ export struct ArcLongList { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcLongList_title') }) { + // [Start arcLongList_start] ArcList() { + // [StartExclude arcLongList_start] LazyForEach(this.data, (item: StringData, index: number) => { ArcListItem() { Text(item.message).fontSize(30).fontColor(Color.White) @@ -131,7 +133,9 @@ export struct ArcLongList { item.message += '0'; }) }, (item: StringData, index: number) => JSON.stringify(item) + index.toString()) + // [EndExclude arcLongList_start] }.cachedCount(3) + // [End arcLongList_start] .space(LengthMetrics.px(10)) .scrollBar(BarState.Auto) .width('466px') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/arcListBuiltInScrollerBar.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/arcListBuiltInScrollerBar.ets index f38604db4..99148c2f4 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/arcListBuiltInScrollerBar.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/arcListBuiltInScrollerBar.ets @@ -13,18 +13,39 @@ * limitations under the License. */ -import { ArcList, ArcListItem, ArcListAttribute, ArcListItemAttribute, LengthMetrics, ColorMetrics } from '@kit.ArkUI'; +import { + ArcList, + ArcListItem, + ArcListAttribute, + ArcListItemAttribute, + LengthMetrics, + ColorMetrics, + ComponentContent +} from '@kit.ArkUI'; import { ComponentCard } from '../../common/Card'; +@Builder +function customHeader() { + Column() { + Text($r('app.string.ArcListCrown_set')) + .fontColor('#FFFFFFFF') + .fontSize('19fp') + } +} + @Entry @Component export struct arcListBuiltInScrollerBar { + context: UIContext = this.getUIContext(); + arcListHeader: ComponentContent = new ComponentContent(this.context, wrapBuilder(customHeader)); build() { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.arcListBuiltInScrollerBar_title') }) { - ArcList() { + // [Start arcListBuiltInScrollBar_start] + ArcList({ header: this.arcListHeader }) { + // [StartExclude arcListBuiltInScrollBar_start] ArcListItem() { Row() { Image($r('app.media.wlan')).width('99px').height('99px') @@ -111,7 +132,12 @@ export struct arcListBuiltInScrollerBar { .width('414px') .height('129px') .backgroundColor('#26FFFFFF') + // [EndExclude arcListBuiltInScrollBar_start] } + .scrollBar(BarState.Auto) + .scrollBarWidth(LengthMetrics.px(10)) + .scrollBarColor(ColorMetrics.resourceColor(Color.White)) + // [End arcListBuiltInScrollBar_start] .width('466px') .height('466px') .space(LengthMetrics.px(10)) diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/index.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/index.ets index b2b874b86..6c85cf8aa 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/index.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcList/index.ets @@ -24,6 +24,7 @@ import { ArcListShow } from './ArcListShow'; import { ArcListSideSlip } from './ArcListSideSlip'; import { ArcListStyles } from './ArcListStyles'; import { ArcLongList } from './ArcLongList'; +import { ArcListCreate } from './ArcListCreate'; import resource from '../../common/resource'; @@ -74,6 +75,11 @@ const routes: Route[] = [ name: `${ARCLIST_ROUTE_PREFIX}/ArcListCrown`, title: resource.resourceToString($r('app.string.ArcListCrown_title')), description: $r('app.string.ArcListCrown_description') + }, + { + name: `${ARCLIST_ROUTE_PREFIX}/ArcListCreate`, + title: resource.resourceToString($r('app.string.ArcListCreate_title')), + description: $r('app.string.ArcListCreate_description') } ]; @@ -99,6 +105,8 @@ export function arcListDestination(name: string) { ArcLongList(); } else if (name === routes[8].name) { ArcListCrown(); + } else if (name === routes[9].name) { + ArcListCreate(); } } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperAction.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperAction.ets index d7f1f0af9..eeba1df07 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperAction.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperAction.ets @@ -13,12 +13,18 @@ * limitations under the License. */ +// [Start action] import { Decimal } from '@kit.ArkTS'; import { ArcSwiper, - ArcSwiperAttribute, + ArcSwiperAttribute, // ArcSwiper的属性依赖ArcSwiperAttribute对象导入,不建议删除该对象的引入。 + ArcDotIndicator, + ArcDirection, + ArcSwiperController } from '@kit.ArkUI'; +// [StartExclude action] import { ComponentCard } from '../../common/Card'; +// [EndExclude action] @Entry @Component @@ -36,9 +42,13 @@ export struct ArcSwiperAction { } build() { + // [StartExclude action] NavDestination() { + // [EndExclude action] Column({ space: 12 }) { + // [StartExclude action] ComponentCard({ title: $r('app.string.ArcSwiperAction_title') }) { + // [EndExclude action] ArcSwiper() { ForEach(this.backgroundColors, (backgroundColor: Color, index: number) => { Text(index.toString()) @@ -66,13 +76,18 @@ export struct ArcSwiperAction { } } }) + // [StartExclude action] } + // [EndExclude action] } .width('100%') + // [StartExclude action] .height('100%') .padding({ left: 12, right: 12 }) } .backgroundColor('#f1f2f3') .title($r('app.string.ArcSwiperAction_title')) + // [EndExclude action] } -} \ No newline at end of file +} +// [End action] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperHorizontal.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperHorizontal.ets index 47d538edc..cee0ecf81 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperHorizontal.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperHorizontal.ets @@ -28,7 +28,9 @@ export struct ArcSwiperHorizontal { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcSwiperHorizontal_title') }) { + // [Start horizontal] ArcSwiper() { + // [StartExclude horizontal] Text('0') .width(233) .height(233) @@ -49,9 +51,11 @@ export struct ArcSwiperHorizontal { .backgroundColor(Color.Pink) .textAlign(TextAlign.Center) .fontSize(30) + // [EndExclude horizontal] } .indicator(true) .vertical(false) + // [End horizontal] } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperSideSlip.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperSideSlip.ets index af64879ae..34829e3a0 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperSideSlip.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperSideSlip.ets @@ -13,14 +13,17 @@ * limitations under the License. */ +// [Start side_slip] import { ArcSwiper, - ArcSwiperAttribute, + ArcSwiperAttribute, // ArcSwiper的属性依赖ArcSwiperAttribute对象导入,不建议删除该对象的引入。 ArcDotIndicator, ArcDirection, ArcSwiperController } from '@kit.ArkUI'; +// [StartExclude side_slip] import { ComponentCard } from '../../common/Card'; +// [EndExclude side_slip] @Entry @Component @@ -29,9 +32,13 @@ export struct ArcSwiperSideSlip { innerSelectedIndex: number = 0; build() { + // [StartExclude side_slip] NavDestination() { + // [EndExclude side_slip] Column({ space: 12 }) { + // [StartExclude side_slip] ComponentCard({ title: $r('app.string.ArcSwiperSideSlip_title') }) { + // [EndExclude side_slip] ArcSwiper() { ForEach(this.backgroundColors, (backgroundColor: Color, index: number) => { Text(index.toString()) @@ -62,13 +69,18 @@ export struct ArcSwiperSideSlip { } return GestureJudgeResult.CONTINUE; }) + // [StartExclude side_slip] } + // [EndExclude side_slip] } .width('100%') + // [StartExclude side_slip] .height('100%') .padding({ left: 12, right: 12 }) } .backgroundColor('#f1f2f3') .title($r('app.string.ArcSwiperSideSlip_title')) + // [EndExclude side_slip] } -} \ No newline at end of file +} +// [End side_slip] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperStyles.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperStyles.ets index 11bf5dd57..6c9a14480 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperStyles.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperStyles.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +// [Start import] import { ArcSwiper, ArcSwiperAttribute, @@ -20,6 +21,7 @@ import { ArcDirection, ArcSwiperController } from '@kit.ArkUI'; +// [End import] import { ComponentCard } from '../../common/Card'; @Entry @@ -31,6 +33,7 @@ export struct ArcSwiperStyles { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcSwiperStyles_titleDefault') }) { + // [Start styles_default] ArcSwiper() { Text('0') .width(233) @@ -53,10 +56,13 @@ export struct ArcSwiperStyles { .textAlign(TextAlign.Center) .fontSize(30) } + // [End styles_default] } ComponentCard({ title: $r('app.string.ArcSwiperStyles_titleCustomize') }) { + // [Start styles_customize] ArcSwiper() { + // [StartExclude styles_customize] Text('0') .width(233) .height(233) @@ -77,6 +83,7 @@ export struct ArcSwiperStyles { .backgroundColor(Color.Pink) .textAlign(TextAlign.Center) .fontSize(30) + // [EndExclude styles_customize] } .indicator( new ArcDotIndicator() @@ -84,6 +91,7 @@ export struct ArcSwiperStyles { .itemColor(Color.Red) // 设置导航点颜色为红色 .selectedItemColor(Color.Blue) // 设置选中导航点颜色为蓝色 ) + // [End styles_customize] } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperToggle.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperToggle.ets index 143dab03e..03ba3e0a7 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperToggle.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperToggle.ets @@ -13,6 +13,8 @@ * limitations under the License. */ +// [Start toggle] +// 导入ArcButton和ArcSwiper模块 import { ArcButton, ArcButtonOptions, @@ -20,24 +22,42 @@ import { ArcButtonStyleMode, ArcButtonPosition, ArcSwiper, - ArcSwiperAttribute, - ArcDotIndicator, + ArcSwiperAttribute, // ArcSwiper的属性依赖ArcSwiperAttribute对象导入,不建议删除该对象的引入。 + ArcSwiperController, + // [StartExclude toggle] ArcDirection, - ArcSwiperController + ArcDotIndicator + // [EndExclude toggle] } from '@kit.ArkUI'; +// [StartExclude toggle] import { ComponentCard } from '../../common/Card'; - +// [EndExclude toggle] @Entry @Component export struct ArcSwiperToggle { private wearableSwiperController: ArcSwiperController = new ArcSwiperController(); build() { + // [StartExclude toggle] NavDestination() { + // [EndExclude toggle] Column({ space: 12 }) { + // [StartExclude toggle] ComponentCard({ title: $r('app.string.ArcSwiperToggle_title') }) { + // [EndExclude toggle] Stack() { - ArcSwiper(this.wearableSwiperController) { + // [Start toggle_sensitivity] + // [Start toggle_focus] + ArcSwiper( + // [StartExclude toggle_focus] + // [StartExclude toggle_sensitivity] + this.wearableSwiperController + // [EndExclude toggle_sensitivity] + // [EndExclude toggle_focus] + ) { + // [StartExclude toggle] + // [StartExclude toggle_focus] + // [StartExclude toggle_sensitivity] Text('0') .width(233) .height(233) @@ -58,9 +78,27 @@ export struct ArcSwiperToggle { .backgroundColor(Color.Pink) .textAlign(TextAlign.Center) .fontSize(30) + // [EndExclude toggle_sensitivity] + // [EndExclude toggle_focus] + // [EndExclude toggle] } + // [StartExclude toggle_sensitivity] + // [StartExclude toggle_focus] .vertical(true) .indicator(false) + // [EndExclude toggle_focus] + + // [StartExclude toggle] + .focusable(true) + .focusOnTouch(true) + .defaultFocus(true) + // [EndExclude toggle_sensitivity] + // [End toggle_focus] + + .digitalCrownSensitivity(CrownSensitivity.MEDIUM) + // [EndExclude toggle] + // [End toggle_sensitivity] + Column() { ArcButton({ @@ -88,13 +126,18 @@ export struct ArcSwiperToggle { }) }.width('100%').height('100%') } + // [StartExclude toggle] } + // [EndExclude toggle] } + // [StartExclude toggle] .width('100%') .height('100%') .padding({ left: 12, right: 12 }) } .backgroundColor('#f1f2f3') .title($r('app.string.ArcSwiperToggle_title')) + // [EndExclude toggle] } -} \ No newline at end of file +} +// [End toggle] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperVertical.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperVertical.ets index 4e27070ed..c0834d9e3 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperVertical.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/arcSwiper/ArcSwiperVertical.ets @@ -31,7 +31,9 @@ export struct ArcSwiperVertical { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.ArcSwiperVertical_title') }) { + // [Start vertical] ArcSwiper() { + // [StartExclude vertical] Text('0') .width(233) .height(233) @@ -52,10 +54,12 @@ export struct ArcSwiperVertical { .backgroundColor(Color.Pink) .textAlign(TextAlign.Center) .fontSize(30) + // [EndExclude vertical] } .indicator(new ArcDotIndicator() .arcDirection(ArcDirection.THREE_CLOCK_DIRECTION)) .vertical(true) + // [End vertical] } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/DataInGrid.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/DataInGrid.ets index 998e35a9c..4b33c1a7f 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/DataInGrid.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/DataInGrid.ets @@ -14,13 +14,23 @@ */ import { ComponentCard } from '../../common/Card'; - // [Start build_a_office_services_grid_of_foreach] +import common from '@ohos.app.ability.common'; @Entry @Component export struct DataInGrid { - @State services: Array = ['Meeting', 'Voting', 'Check-in', 'Printing']; - + @State services: Array = []; + aboutToAppear(): void { + const context = this.getUIContext().getHostContext() as common.UIAbilityContext; + const meeting = context.resourceManager.getStringByNameSync('Meeting') + this.services.push(meeting) + const check = context.resourceManager.getStringByNameSync('Check_in') + this.services.push(check) + const voting = context.resourceManager.getStringByNameSync('Voting') + this.services.push(voting) + const printing = context.resourceManager.getStringByNameSync('Printing') + this.services.push(printing) + } build() { // [StartExclude build_a_office_services_grid_of_foreach] NavDestination() { @@ -29,39 +39,55 @@ export struct DataInGrid { // [StartExclude build_a_office_services_grid_of_foreach] ComponentCard({ title: $r('app.string.DataInGrid_titleOfficeServices') }) { // [EndExclude build_a_office_services_grid_of_foreach] + // $r('app.string.build_a_office_services_grid')需要替换为开发者所需的字符串资源 // [Start build_a_office_services_grid] + // [Start build_a_office_services_meeting] Grid() { GridItem() { - Text('Meeting') + // $r('app.string.Meeting')需要替换为开发者所需的资源文件 + Text($r('app.string.Meeting')) + // [StartExclude build_a_office_services_meeting] .fontSize(24) - }.backgroundColor('#FFF1F3F5') + // [EndExclude build_a_office_services_meeting] + } GridItem() { - Text('Check-in') + // $r('app.string.Check_in')需要替换为开发者所需的资源文件 + Text($r('app.string.Check_in')) + // [StartExclude build_a_office_services_meeting] .fontSize(24) - }.backgroundColor('#FFF1F3F5') + // [EndExclude build_a_office_services_meeting] + } GridItem() { - Text('Voting') + // $r('app.string.Voting')需要替换为开发者所需的资源文件 + Text($r('app.string.Voting')) + // [StartExclude build_a_office_services_meeting] .fontSize(24) - }.backgroundColor('#FFF1F3F5') + // [EndExclude build_a_office_services_meeting] + } GridItem() { - Text('Printing') + // $r('app.string.Printing')需要替换为开发者所需的资源文件 + Text($r('app.string.Printing')) .fontSize(24) - }.backgroundColor('#FFF1F3F5') + } } + // [StartExclude build_a_office_services_meeting] // [StartExclude build_a_office_services_grid] .height(200) // [EndExclude build_a_office_services_grid] .columnsGap(6) .rowsGap(6) + // [EndExclude build_a_office_services_meeting] .rowsTemplate('1fr 1fr') .columnsTemplate('1fr 1fr') + // [End build_a_office_services_meeting] // [End build_a_office_services_grid] } // [StartExclude build_a_office_services_grid_of_foreach] + // $r('app.string.DataInGrid_titleForEach')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.DataInGrid_titleForEach') }) { // [EndExclude build_a_office_services_grid_of_foreach] Grid() { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridCalculator.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridCalculator.ets index bb1fe49ef..b44c0e5b1 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridCalculator.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridCalculator.ets @@ -21,6 +21,7 @@ export struct GridCalculator { private buttonArray: string[] = ['CE', 'C', '/', 'X', '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '=', '0', '.']; @State res: string = '0'; + //[Start Set_numberrows_columns] layoutOptions: GridLayoutOptions = { regularSize: [1, 1], onGetRectByIndex: (index: number) => { @@ -64,12 +65,14 @@ export struct GridCalculator { return [0, 0, 2, 4]; } } - + // [StartExclude Set_numberrows_columns] build() { NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.GridCalculator_title') }) { + // [EndExclude Set_numberrows_columns] Grid(undefined, this.layoutOptions) { + // [StartExclude Set_numberrows_columns] ForEach(this.buttonArray, (item: string) => { GridItem() { Button(item) @@ -87,13 +90,17 @@ export struct GridCalculator { GridItem() { Text(this.res).width('100%').height('100%').textAlign(TextAlign.End).fontSize(30) }.backgroundColor(0x55555555).borderRadius(10) + // [EndExclude Set_numberrows_columns] } .columnsTemplate('1fr 1fr 1fr 1fr') .rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr') + // [StartExclude Set_numberrows_columns] .rowsGap(8) .columnsGap(5) .width('100%') .height('80%') + // [EndExclude Set_numberrows_columns] + // [End Set_numberrows_columns] } } } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridScrollbar.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridScrollbar.ets index 74443ede7..46a91a719 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridScrollbar.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridScrollbar.ets @@ -20,7 +20,9 @@ import { ComponentCard } from '../../common/Card'; @Component export struct GridScrollbar { numbers: GridDataSource = new GridDataSource([]); + // [Start Add_external_scrollbar] scroller: Scroller = new Scroller(); + // [StartExclude Add_external_scrollbar] @State gridPosition: number = 0; //0代表滚动到grid顶部,1代表中间值,2代表滚动到grid底部。 aboutToAppear() { @@ -32,13 +34,17 @@ export struct GridScrollbar { } this.numbers = new GridDataSource(list); } - + // [EndExclude Add_external_scrollbar] build() { + // [StartExclude Add_external_scrollbar] NavDestination() { Column({ space: 12 }) { + // $r('app.string.GridScrollbar_title')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.GridScrollbar_title') }) { Row({ space: 5 }) { + // [EndExclude Add_external_scrollbar] Grid(this.scroller) { + // [StartExclude Add_external_scrollbar] LazyForEach(this.numbers, (day: string) => { GridItem() { Text() @@ -49,7 +55,9 @@ export struct GridScrollbar { .textAlign(TextAlign.Center) } }, (index: number) => index.toString()) + // [EndExclude Add_external_scrollbar] } + // [StartExclude Add_external_scrollbar] .columnsTemplate('1fr 1fr 1fr 1fr 1fr') .columnsGap(10) .rowsGap(10) @@ -57,7 +65,7 @@ export struct GridScrollbar { .enableScrollInteraction(true) .supportAnimation(false) .multiSelectable(false) - .edgeEffect(EdgeEffect.Spring) + .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true, effectEdge: EffectEdge.START }) .scrollBar(BarState.Off) .scrollBarColor(Color.Grey) .scrollBarWidth(4) @@ -65,8 +73,10 @@ export struct GridScrollbar { .backgroundColor(0xFAEEE0) .height(300) .margin({left:10}) + // [EndExclude Add_external_scrollbar] ScrollBar({ scroller: this.scroller }).height(300) - + // [End Add_external_scrollbar] + // [StartExclude Add_external_scrollbar] }.width('100%').margin({ top: 5 }) } } @@ -74,6 +84,7 @@ export struct GridScrollbar { .height('100%') .padding({ left: 12, right: 12 }) } + // [EndExclude Add_external_scrollbar] .backgroundColor('#f1f2f3') .title($r('app.string.GridScrollbar_title')) } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridSideToSide.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridSideToSide.ets index fd30401da..0b8f7016c 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridSideToSide.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/GridSideToSide.ets @@ -41,9 +41,12 @@ export struct GridSideToSide { build() { NavDestination() { Column({ space: 12 }) { + // $r('app.string.GridSideToSide_title')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.GridSideToSide_title') }) { + // [Start Control_scrolling_position] Column(){ Grid(this.scroller) { + // [StartExclude Control_scrolling_position] LazyForEach(this.numbers, (day: string) => { GridItem() { Text(day) @@ -54,23 +57,25 @@ export struct GridSideToSide { .textAlign(TextAlign.Center) } }, (index: number) => index.toString()) + // [EndExclude Control_scrolling_position] } .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr') + // [StartExclude Control_scrolling_position] .columnsGap(10) .rowsGap(10) .width('90%') .height(300) .scrollBar(BarState.Off) - + // [EndExclude Control_scrolling_position] Row({ space: 20 }) { - Button('上一页') + Button($r('app.string.Previous_Page')) .onClick(() => { this.scroller.scrollPage({ next: false }); }) - Button('下一页') + Button($r('app.string.Next_page')) .onClick(() => { this.scroller.scrollPage({ next: true @@ -78,6 +83,7 @@ export struct GridSideToSide { }) } } + // [End Control_scrolling_position] } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/LongGrid.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/LongGrid.ets index 073655c3e..ac5c3b462 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/LongGrid.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/LongGrid.ets @@ -35,20 +35,29 @@ export struct LongGrid { build() { NavDestination() { Column({ space: 12 }) { + // $r('app.string.LongGrid_title')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.LongGrid_title') }) { Column({ space: 5 }) { + // [Start long_list] Grid(this.scroller) { LazyForEach(this.numbers, (day: string) => { GridItem() { + // [StartExclude long_list] Text(day) .fontSize(16) .backgroundColor(0xF9CF93) .width('100%') .height(80) .textAlign(TextAlign.Center) + // [EndExclude long_list] } - }, (index: number) => index.toString()) + } + // [StartExclude long_list] + , (index: number) => index.toString()) + // [EndExclude long_list] } + .cachedCount(3) + // [End long_list] .columnsTemplate('1fr 1fr 1fr 1fr 1fr') .columnsGap(10) .rowsGap(20) diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollPositionGrid.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollPositionGrid.ets index da773f1c3..06e537606 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollPositionGrid.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollPositionGrid.ets @@ -28,6 +28,7 @@ export struct ScrollPosition { build() { NavDestination() { Column({ space: 12 }) { + // $r('app.string.ScrollPosition_titleExample')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.ScrollPosition_titleExample') }) { // [Start control_the_grid_scroll] Column({ space: 12 }) { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollableGrid.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollableGrid.ets index 288ed7206..f15991d1e 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollableGrid.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/grid/ScrollableGrid.ets @@ -14,18 +14,43 @@ */ import { ComponentCard } from '../../common/Card'; - // [Start build_scrollable_horizontally_grid_layouts] +import common from '@ohos.app.ability.common'; @Entry @Component export struct ScrollableGrid { - @State services: Array = ['Live Streaming', 'Imported', 'Categories', 'Recharge', - 'Membership', 'Claim Coupon', 'Lottery', 'Favorites', 'Points', 'More']; - + @State services: Array = []; + aboutToAppear(): void { + const context = this.getUIContext().getHostContext() as common.UIAbilityContext; + const streaming = context.resourceManager.getStringByNameSync('Live_Streaming') + this.services.push(streaming) + const imported = context.resourceManager.getStringByNameSync('Imported') + this.services.push(imported) + const categories = context.resourceManager.getStringByNameSync('Categories') + this.services.push(categories) + const recharge = context.resourceManager.getStringByNameSync('Recharge') + this.services.push(recharge) + const membership = context.resourceManager.getStringByNameSync('Membership') + this.services.push(membership) + const claim = context.resourceManager.getStringByNameSync('Claim_Coupon') + this.services.push(claim) + const lottery = context.resourceManager.getStringByNameSync('Lottery') + this.services.push(lottery) + const favorites = context.resourceManager.getStringByNameSync('Favorites') + this.services.push(favorites) + const points = context.resourceManager.getStringByNameSync('Points') + this.services.push(points) + const more = context.resourceManager.getStringByNameSync('More') + this.services.push(more) + } build() { + // [StartExclude build_scrollable_horizontally_grid_layouts] NavDestination() { + // [EndExclude build_scrollable_horizontally_grid_layouts] Column({ space: 12 }) { + // [StartExclude build_scrollable_horizontally_grid_layouts] ComponentCard({ title: $r('app.string.ScrollableGrid_titleHorizontal') }) { + // [EndExclude build_scrollable_horizontally_grid_layouts] Grid() { ForEach(this.services, (service: string) => { GridItem() { @@ -39,14 +64,18 @@ export struct ScrollableGrid { // [EndExclude build_scrollable_horizontally_grid_layouts] .rowsGap(15) .rowsTemplate('1fr 1fr') // 只设置rowsTemplate属性,当内容超出Grid区域时,可水平滚动。 + // [StartExclude build_scrollable_horizontally_grid_layouts] } + // [EndExclude build_scrollable_horizontally_grid_layouts] } - // [End build_scrollable_horizontally_grid_layouts] .width('100%') .height('100%') .padding({ left: 12, right: 12 }) + // [StartExclude build_scrollable_horizontally_grid_layouts] } .backgroundColor('#f1f2f3') .title($r('app.string.ScrollableGrid_title')) + // [EndExclude build_scrollable_horizontally_grid_layouts] } -} \ No newline at end of file +} +// [End build_scrollable_horizontally_grid_layouts] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/AddListItem.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/AddListItem.ets index befa4ca23..4257e0d86 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/AddListItem.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/AddListItem.ets @@ -16,8 +16,12 @@ import { ComponentCard } from '../../common/Card'; // [Start define_the_data_to_be_done] import { util } from '@kit.ArkTS'; +import { UIContext } from '@kit.ArkUI'; +// [Start build_list_layouts_and_list_items] +import common from '@ohos.app.ability.common'; - +// [StartExclude build_list_layouts_and_list_items] +// [Start build_the_overall_list_layout_and_list_items] export class ToDo { public key: string = util.generateRandomUUID(true); public name: string; @@ -28,7 +32,6 @@ export class ToDo { } // [End define_the_data_to_be_done] -// [Start build_the_overall_list_layout_and_list_items] @Component export struct ToDoListItem { @Link isEditMode: boolean; @@ -54,16 +57,16 @@ export struct ToDoListItem { // [StartExclude build_the_overall_list_layout_and_list_items] GestureGroup(GestureMode.Exclusive, LongPressGesture() - // [EndExclude build_the_overall_list_layout_and_list_items] + // [EndExclude build_the_overall_list_layout_and_list_items] .onAction(() => { }) ) ) } } -// [End build_the_overall_list_layout_and_list_items] -// [Start build_list_layouts_and_list_items] +// [End build_the_overall_list_layout_and_list_items] +// [EndExclude build_list_layouts_and_list_items] @Entry @Component export struct AddListItem { @@ -75,7 +78,23 @@ export struct AddListItem { // [EndExclude build_list_layouts_and_list_items] @Watch('onEditModeChange') @State isEditMode: boolean = false @State selectedItems: ToDo[] = [] - private availableThings: string[] = ['Reading', 'Exercise', 'Travel', 'Listening Music', 'Watching Films', 'Singing']; + private availableThings: string [] = []; + + aboutToAppear(): void { + const context = this.getUIContext().getHostContext() as common.UIAbilityContext; + const reading = context.resourceManager.getStringByNameSync('Reading') + this.availableThings.push(reading) + const exercise = context.resourceManager.getStringByNameSync('Exercise') + this.availableThings.push(exercise) + const travel = context.resourceManager.getStringByNameSync('Travel') + this.availableThings.push(travel) + const listening = context.resourceManager.getStringByNameSync('Listening_Music') + this.availableThings.push(listening) + const watching = context.resourceManager.getStringByNameSync('Watching_Films') + this.availableThings.push(watching) + const singing = context.resourceManager.getStringByNameSync('Singing') + this.availableThings.push(singing) + } onEditModeChange() { if (!this.isEditMode) { @@ -89,6 +108,7 @@ export struct AddListItem { // [EndExclude build_list_layouts_and_list_items] Column({ space: 12 }) { // [StartExclude build_list_layouts_and_list_items] + // $r('app.string.AddListItem_titleExample')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.AddListItem_titleExample') }) { // [EndExclude build_list_layouts_and_list_items] Column({ space: 12 }) { @@ -101,6 +121,7 @@ export struct AddListItem { }) .margin({ left: 20, right: 20 }) } else { + // $r('app.string.TodoItem')需要替换为开发者所需的资源文件 Text($r('app.string.TodoItem')) .fontSize(30) .margin({ left: 20 }) @@ -126,6 +147,7 @@ export struct AddListItem { .backgroundColor('#FFF1F3F5') .borderRadius(12) .height(45) + // [EndExclude build_list_layouts_and_list_items] List({ space: 12 }) { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/CollapseAndExpand.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/CollapseAndExpand.ets index 52fd69387..f78b76ec5 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/CollapseAndExpand.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/CollapseAndExpand.ets @@ -13,9 +13,12 @@ * limitations under the License. */ +//[Start List_item_data_structures] import { curves } from '@kit.ArkUI'; +//[StartExclude List_item_data_structures] import { ComponentCard } from '../../common/Card'; +// [EndExclude List_item_data_structures] interface ItemInfo { index: number, name: string, @@ -27,43 +30,45 @@ interface ItemGroupInfo extends ItemInfo { children: ItemInfo[] } +//[End List_item_data_structures] @Entry @Component export struct CollapseAndExpand { + //[Start List_item_data_structure] @State routes: ItemGroupInfo[] = [ { index: 0, name: 'basicInfo', - label: '个人基本资料', + label: 'Personal_Basic_Information', children: [ { index: 0, - name: '昵称', + name: 'nick_name', label: 'xxxx', type: 'Text' }, { index: 1, - name: '头像', + name: 'avatar', label: $r('sys.media.ohos_user_auth_icon_face'), type: 'Image' }, { index: 2, - name: '年龄', + name: 'age', label: 'xxxx', type: 'Text' }, { index: 3, - name: '生日', + name: 'birthday', label: 'xxxxxxxxx', type: 'Text' }, { index: 4, - name: '性别', + name: 'gender', label: 'xxxxxxxx', type: 'Text' }, @@ -72,38 +77,38 @@ export struct CollapseAndExpand { { index: 1, name: 'equipInfo', - label: '设备信息', + label: 'Device_Information', children: [] }, { index: 2, name: 'appInfo', - label: '应用使用信息', + label: 'Application_usage_information', children: [] }, { index: 3, name: 'uploadInfo', - label: '您主动上传的数据', + label: 'data_you_voluntarily_uploaded', children: [] }, { index: 4, name: 'tradeInfo', - label: '交易与资产信息', + label: 'Trading_and_asset_information', children: [] }, { index: 5, name: 'otherInfo', - label: '其他资料', + label: 'Other_materials', children: [] }, ]; - @State expandedItems: boolean[] = Array(this.routes.length).fill(false); @State selection: string | null = null; + //[Start List_item_data_ItemGroupInfo] @Builder ListItemGroupHeader(itemGroup: ItemGroupInfo) { Row() { @@ -127,10 +132,15 @@ export struct CollapseAndExpand { } }) } + + //[End List_item_data_ItemGroupInfo] build() { + //[StartExclude List_item_data_structure] NavDestination() { Column({ space: 12 }) { + // $r('app.string.CollapseAndExpand_title')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.CollapseAndExpand_title') }) { + // [EndExclude List_item_data_structure] Column() { List({ space: 10 }) { ForEach(this.routes, (itemGroup: ItemGroupInfo) => { @@ -151,7 +161,9 @@ export struct CollapseAndExpand { } else { Text(item.label) } + // $r('app.string.ohos_ic_public_arrow_right')需要替换为开发者所需的资源文件 Image($r('sys.media.ohos_ic_public_arrow_right')) + // $r('app.string.ohos_id_color_fourth')需要替换为开发者所需的资源文件 .fillColor($r('sys.color.ohos_id_color_fourth')) .height(30) .width(30) @@ -170,15 +182,19 @@ export struct CollapseAndExpand { .width('100%') .height('100%') .justifyContent(FlexAlign.Start) + // $r('app.string.ohos_id_color_sub_background')需要替换为开发者所需的资源文件 .backgroundColor($r('sys.color.ohos_id_color_sub_background')) } + + //[End List_item_data_structure] } + //[StartExclude List_item_data_structure] .width('100%') .height('100%') .padding({ left: 12, right: 12 }) } + // [EndExclude List_item_data_structure] .backgroundColor('#f1f2f3') .title($r('app.string.CollapseAndExpand_title')) } - } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ControlledScrollPositionList.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ControlledScrollPositionList.ets index fe9700cfd..68f3cdf1e 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ControlledScrollPositionList.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ControlledScrollPositionList.ets @@ -61,9 +61,10 @@ export struct ControlledScrollPositionList { .onClick(() => { // 点击按钮时,指定跳转位置,返回列表顶部 this.listScroller.scrollToIndex(0); - // [End control_scrolling] }) - }.height('90%') + } + // [End control_scrolling] + .height('90%') } } .width('100%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/DeleteListItem.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/DeleteListItem.ets index 6948f3a13..18bba2445 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/DeleteListItem.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/DeleteListItem.ets @@ -12,10 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start structural_references] import { util } from '@kit.ArkTS'; +import { UIContext } from '@kit.ArkUI'; +import common from '@ohos.app.ability.common'; -// [Start structural_references] export class ToDo { public key: string = util.generateRandomUUID(true); public name: string; @@ -24,6 +25,7 @@ export class ToDo { this.name = name; } } + // [End structural_references] @Component @@ -40,15 +42,23 @@ export struct ToDoListItem { .fontSize(16) .width('80%') .margin({ left: 20 }) + // [StartExclude enter_edit_mode] + // [Start is_EditMode] if (this.isEditMode) { Checkbox() - .onChange((value: boolean) => { - if (value) { - this.selectedItems.push(new ToDo(this.toDoItem.name)); - this.isEditMode = true; + .onChange((isSelected) => { + if (isSelected) { + this.selectedItems.push(new ToDo(this.toDoItem.name)); // this.selectedItems为勾选时,记录选中的列表项,可根据实际场景构造 + } else { + let index = this.selectedItems.indexOf(new ToDo(this.toDoItem.name)); + if (index !== -1) { + this.selectedItems.splice(index, 1); // 取消勾选时,则将此项从selectedItems中删除 + } } }) } + // [End is_EditMode] + // [EndExclude enter_edit_mode] } .backgroundColor('#FFF1F3F5') .width('100%') @@ -65,6 +75,7 @@ export struct ToDoListItem { ) } } + // [End enter_edit_mode] @Entry @@ -73,13 +84,29 @@ export struct DeleteListItem { @State arr: number[] = [0, 1, 2, 3]; @State toDoData: ToDo[] = []; @Watch('onEditModeChange') @State isEditMode: boolean = false; - @State selectedItems: ToDo[] = []; - private availableThings: string[] = ['Reading', 'Exercise', 'Travel', 'Listening Music', 'Watching Films', 'Singing']; + @State selectedItems: ToDo[] = [] + private availableThings: string [] = []; public deleteToDoData() { this.toDoData = []; } + aboutToAppear(): void { + const context = this.getUIContext().getHostContext() as common.UIAbilityContext; + const reading = context.resourceManager.getStringByNameSync('Reading') + this.availableThings.push(reading) + const exercise = context.resourceManager.getStringByNameSync('Exercise') + this.availableThings.push(exercise) + const travel = context.resourceManager.getStringByNameSync('Travel') + this.availableThings.push(travel) + const listening = context.resourceManager.getStringByNameSync('Listening_Music') + this.availableThings.push(listening) + const watching = context.resourceManager.getStringByNameSync('Watching_Films') + this.availableThings.push(watching) + const singing = context.resourceManager.getStringByNameSync('Singing') + this.availableThings.push(singing) + } + onEditModeChange() { if (!this.isEditMode) { this.selectedItems = []; @@ -90,6 +117,7 @@ export struct DeleteListItem { NavDestination() { Column({ space: 12 }) { Column({ space: 8 }) { + // $r('app.string.DeleteListItem_titleExample')需要替换为开发者所需的资源文件 Text($r('app.string.DeleteListItem_titleExample')) .fontSize(14) .fontColor('#666') @@ -103,6 +131,7 @@ export struct DeleteListItem { }) .margin({ left: 20, right: 20 }) } else { + // $r('app.string.TodoItem')需要替换为开发者所需的资源文件 Text($r('app.string.TodoItem')) .fontSize(30) .margin({ left: 20 }) @@ -127,8 +156,9 @@ export struct DeleteListItem { .backgroundColor('#FFF1F3F5') .borderRadius(12) .height(45) - + // [Start implement_cachedCount] List({ space: 12 }) { + // [StartExclude implement_cachedCount] ForEach(this.toDoData, (toDoItem: ToDo) => { ListItem() { // 将toDoData的每个数据放入到以model的形式放进ListItem里 @@ -139,7 +169,9 @@ export struct DeleteListItem { }) } }, (toDoItem: ToDo) => toDoItem.name.toString()) - } + // [EndExclude implement_cachedCount] + }.cachedCount(3) + // [End implement_cachedCount] } } .alignItems(HorizontalAlign.Start) diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/Index.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/Index.ets index fbc9b904b..4e6c40782 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/Index.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/Index.ets @@ -30,6 +30,7 @@ import { TaggedListItems } from './TaggedListItems'; import { CollapseAndExpand } from './CollapseAndExpand'; import { LongList } from './LongList'; import { ListChatRoom } from './ListChatRoom'; +import { SupportSlidingHand } from './SupportSlidingHand'; import resource from '../../common/resource'; export const List_ROUTE_PREFIX: string = 'list'; @@ -109,6 +110,11 @@ const routes: Route[] = [ name: `${List_ROUTE_PREFIX}/ListChatRoom`, title: resource.resourceToString($r('app.string.ListChatRoom_title')), description: $r('app.string.ListChatRoom_description') + }, + { + name: `${List_ROUTE_PREFIX}/SupportSlidingHand`, + title: resource.resourceToString($r('app.string.Support_Sliding_Hand_Event')), + description: $r('app.string.Sliding_Hand_Event') } ]; @@ -146,6 +152,8 @@ export function listDestination(name: string) { CollapseAndExpand(); } else if (name === routes[14].name) { ListChatRoom(); + } else if (name === routes[15].name) { + SupportSlidingHand() } } @@ -164,6 +172,7 @@ struct ListExample { .width('100%') .onClick(() => { this.pathStack.pushPath({ name: route.name }); + console.log(route.name +'点击滑动离手事件') }) }) } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListChatRoom.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListChatRoom.ets index f71e5b69e..fe9cce884 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListChatRoom.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListChatRoom.ets @@ -14,13 +14,14 @@ */ import { ComponentCard } from '../../common/Card' +// [Start Listitem_data_structure] // 消息类型定义 interface Message { id: number content: string sender: string } - +// [End Listitem_data_structure] @Entry @Component export struct ListChatRoom { @@ -32,7 +33,7 @@ export struct ListChatRoom { .fontSize(16) .textAlign(TextAlign.Start) .padding(10) - .backgroundColor(message.sender === '系统' ? '#F0F0F0' : '#E6F3FF') + .backgroundColor(message.sender === 'system' ? '#F0F0F0' : '#E6F3FF') .borderRadius(8) } .width('100%') @@ -46,24 +47,28 @@ export struct ListChatRoom { this.messages = [...this.messages, { id: Date.now(), content: this.inputText, - sender: '观众' + sender: 'audience' }] this.inputText = '' } } + // [Start Construct_list_structure] // 消息列表数据 @State messages: Message[] = [ - { id: 1, content: '欢迎来到直播间!', sender: '系统' }, - { id: 2, content: '大家好啊~', sender: '主播' } + { id: 1, content: 'Welcome to the live streaming room!', sender: 'system' }, + { id: 2, content: 'Hello everyone!~', sender: 'system' } ] // 输入框内容 @State inputText: string = '' build() { + // [StartExclude Construct_list_structure] NavDestination() { Column({ space: 12 }) { + // $r('app.string.ListChatRoom_title')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.ListChatRoom_title') }) { + // [EndExclude Construct_list_structure] Column() { // 聊天消息区域 List({ space: 10 }) { @@ -78,7 +83,7 @@ export struct ListChatRoom { // 输入区域 Row({ space: 10 }) { - TextInput({ text: this.inputText, placeholder: '说点什么...' }) + TextInput({ text: this.inputText, placeholder: 'Say something...' }) .layoutWeight(1) .onChange((value: string) => { this.inputText = value @@ -87,7 +92,7 @@ export struct ListChatRoom { this.sendMessage() }) - Button('发送', { type: ButtonType.Capsule }) + Button($r('app.string.message'), { type: ButtonType.Capsule }) .backgroundColor('#007AFF') .onClick(() => { this.sendMessage() @@ -98,6 +103,7 @@ export struct ListChatRoom { } .width('100%') .height('100%') + // [StartExclude Construct_list_structure] } } .width('100%') @@ -106,5 +112,7 @@ export struct ListChatRoom { } .backgroundColor('#f1f2f3') .title($r('app.string.ListChatRoom_title')) + // [EndExclude Construct_list_structure] } + // [End Construct_list_structure] } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListLayout.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListLayout.ets index 742098ded..852da2f03 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListLayout.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ListLayout.ets @@ -14,15 +14,18 @@ */ import { ComponentCard } from '../../common/Card'; - +// [Start egLanes_add] @Entry @Component export struct ListLayout { @State egLanes: LengthConstrain = { minLength: 200, maxLength: 300 }; build() { + // [StartExclude egLanes_add] NavDestination() { Column({ space: 12 }) { + // [EndExclude egLanes_add] + // [StartExclude egLanes_add] ComponentCard({ title: $r('app.string.ListLayout_titleMainAxis') }) { // [Start build_a_horizontal_scrolling_list] List({ space: 8 }) { @@ -40,8 +43,9 @@ export struct ListLayout { // [End build_a_horizontal_scrolling_list] .height(30) } - + // [EndExclude egLanes_add] ComponentCard({ title: $r('app.string.ListLayout_titleCrossAxisLanes') }) { + // [EndExclude egLanes_add] // [Start build_list_by_size] List({ space: 8 }) { ListItem() { @@ -62,9 +66,10 @@ export struct ListLayout { .lanes(this.egLanes) // [End build_list_by_size] } - + // [StartExclude egLanes_add] ComponentCard({ title: $r('app.string.ListLayout_titleCrossAxisAlignment') }) { // [Start build_list_with_align_horizontally_in_the_center] + // [End lanes_add] List({ space: 8 }) { // [StartExclude build_list_with_align_horizontally_in_the_center] ListItem() { @@ -79,11 +84,14 @@ export struct ListLayout { Text('ListItem tree') } // [EndExclude build_list_with_align_horizontally_in_the_center] - } + }.lanes(2) + // [End lanes_add] // 此处alignListItem设置水平方向对齐 .alignListItem(ListItemAlign.Center) // [End build_list_with_align_horizontally_in_the_center] } + // [StartExclude egLanes_add] + // [StartExclude egLanes_add] } .width('100%') .height('100%') @@ -91,5 +99,7 @@ export struct ListLayout { } .backgroundColor('#f1f2f3') .title($r('app.string.ListLayout_title')) + // [EndExclude egLanes_add] } + // [End egLanes_add] } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/LongList.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/LongList.ets index 6c5fd86c5..e03850938 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/LongList.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/LongList.ets @@ -38,7 +38,7 @@ export struct LongList { .scrollBar(BarState.Off) .friction(0.6) .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线 - .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring + .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true, effectEdge: EffectEdge.START }) .onScrollIndex((firstIndex: number, lastIndex: number, centerIndex: number) => { console.info('first' + firstIndex); console.info('last' + lastIndex); diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ResponsiveScrollPositionList.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ResponsiveScrollPositionList.ets index 06c536cdb..7f02abd9f 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ResponsiveScrollPositionList.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/ResponsiveScrollPositionList.ets @@ -12,11 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start respond_to_scroll_position] import { util } from '@kit.ArkTS'; import { ComponentCard } from '../../common/Card'; -// [Start respond_to_scroll_position] const alphabets = ['#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; @@ -42,6 +41,7 @@ export let contactsGroups: object[] = [ { title: 'A', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_A_one'), $r('sys.media.clone_app_badge_1')), new Contact($r('app.string.contacts_A_two'), $r('sys.media.clone_app_badge_2')) ], @@ -50,6 +50,7 @@ export let contactsGroups: object[] = [ { title: 'B', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_B_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_B_two'), $r('sys.media.clone_app_badge_4')), new Contact($r('app.string.contacts_B_three'), $r('sys.media.clone_app_badge_5')) @@ -59,6 +60,7 @@ export let contactsGroups: object[] = [ { title: 'D', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_D_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_D_two'), $r('sys.media.clone_app_badge_4')), new Contact($r('app.string.contacts_D_three'), $r('sys.media.clone_app_badge_5')) @@ -68,6 +70,7 @@ export let contactsGroups: object[] = [ { title: 'F', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_F_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_F_two'), $r('sys.media.clone_app_badge_4')) ], @@ -76,6 +79,7 @@ export let contactsGroups: object[] = [ { title: 'G', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_G_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_G_two'), $r('sys.media.clone_app_badge_4')) ], @@ -84,6 +88,7 @@ export let contactsGroups: object[] = [ { title: 'H', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_H_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_H_two'), $r('sys.media.clone_app_badge_4')), new Contact($r('app.string.contacts_H_three'), $r('sys.media.clone_app_badge_5')) @@ -93,6 +98,7 @@ export let contactsGroups: object[] = [ { title: 'X', contacts: [ + // $r('app.string.xxx')需要替换为开发者所需的资源文件 new Contact($r('app.string.contacts_X_one'), $r('sys.media.clone_app_badge_3')), new Contact($r('app.string.contacts_X_two'), $r('sys.media.clone_app_badge_4')), new Contact($r('app.string.contacts_X_three'), $r('sys.media.clone_app_badge_5')) @@ -100,6 +106,7 @@ export let contactsGroups: object[] = [ key: util.generateRandomUUID(true) } as ContactsGroup ]; + // [EndExclude respond_to_scroll_position] @Entry @@ -119,18 +126,22 @@ export struct ResponsiveScrollPositionList { .width('100%') .padding(5) } + // [EndExclude respond_to_scroll_position] build() { // [StartExclude respond_to_scroll_position] NavDestination() { Column({ space: 12 }) { + // $r('app.string.ResponsiveScrollPositionList_titleExample')需要替换为开发者所需的资源文件 ComponentCard({ title: $r('app.string.ResponsiveScrollPositionList_titleExample') }) { // [EndExclude use_stack] Stack({ alignContent: Alignment.End }) { // 此为响应滚动位置示例List容器 + // [Start respond_tolistScroller] List({ scroller: this.listScroller }) { // [StartExclude use_foreach] + // [StartExclude respond_tolistScroller] ForEach(contactsGroups, (itemGroup: ContactsGroup) => { ListItemGroup({ header: this.itemHead(itemGroup.title) }) { // 循环渲染ListItem @@ -141,14 +152,18 @@ export struct ResponsiveScrollPositionList { Image(item.icon).width(40).height(40).margin(10) Text(item.name).fontSize(20) }.width('100%').justifyContent(FlexAlign.Start) + // [EndExclude respond_to_scroll_position] } + // [StartExclude respond_to_scroll_position] }, (item: Contact) => JSON.stringify(item)) } } }, (itemGroup: ContactsGroup) => JSON.stringify(itemGroup)) + // [EndExclude respond_tolistScroller] } + // [End respond_tolistScroller] // [EndExclude respond_to_scroll_position] .onScrollIndex((firstIndex: number) => { // [StartExclude respond_to_scroll_position] @@ -162,6 +177,9 @@ export struct ResponsiveScrollPositionList { // 字母表索引组件 AlphabetIndexer({ arrayValue: alphabets, selected: 0 }) .selected(this.selectedIndex) + .onSelect((index: number) => { + this.listScroller.scrollToIndex(index); + }) // [End respond_to_scroll_position] }.height('90%') } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/SupportSlidingHand.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/SupportSlidingHand.ets new file mode 100644 index 000000000..6bfc67f2c --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/list/SupportSlidingHand.ets @@ -0,0 +1,171 @@ +/* +* Copyright (c) 2025 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. +*/ +// [Start class_News] +import { LengthMetrics } from '@kit.ArkUI'; +import { ComponentCard } from '../../common/Card'; +// [Start class_News_content] +class News { + public id: string; + public title: string; + public content: string; + public type: string; + + constructor(id: string, title: string, content: string, type: string) { + this.id = id; + this.title = title; + this.content = content; + this.type = type; + } +} +// [End class_News_content] +const FRICTION_SCALE: number = 4.2; +const DEFAULT_FRICTION: number = 1; + +// [End class_News] +@Entry +@Component +export struct SupportSlidingHand { + // [Start NewsData] + @State newsData: Array = [ + new News('1', 'News Title', 'This is a short news with limited content, quickly swipe to switch between them', + 'short'), + new News('2', 'News Title', 'This is a short news with limited content, quickly swipe to switch between them', + 'short'), + new News('3', 'News Title', 'This is a short news with limited content, quickly swipe to switch between them', + 'long'), + new News('4', 'News Title', 'This is a short news with limited content, quickly swipe to switch between them', + 'short'), + new News('5', 'News Title', 'This is a short news with limited content, quickly swipe to switch between them', + 'long'), + ]; + // [End NewsData] + // 当前显示的新闻的索引 + @State currentIndex: number = 0; + private scrollerForList: Scroller = new Scroller(); + @State listHeight: number = 500; + + // 判断当前是否为短新闻 + IsShortNews(currentIndex: number): boolean { + return this.newsData[currentIndex].type === 'short' + } + + build() { + NavDestination() { + Column({ space: 10 }) { + // 顶部导航栏 + this.topBar() + // 新闻列表 + List({ scroller: this.scrollerForList, space: 10 }) { + ForEach(this.newsData, (item: News, index) => { + ListItem() { + Column({ space: 10 }) { + Text(item.title) + .fontSize(18) + .fontColor(Color.Black) + .fontWeight(index === this.currentIndex ? 700 : 400) + .backgroundColor(index === this.currentIndex ? '#FF9800' : '#FFFFFF') + .padding({ top: 10, bottom: 5 }) + + Text(item.content) + .fontSize(14) + .fontColor('#666666') + } + .width('100%') + .height(item.type === 'short' ? '70%' : '200%') + .backgroundColor(index === this.currentIndex ? '#FFFFFF' : '#F5F5F5') + .borderRadius(8) + .shadow(index === this.currentIndex ? { fill: true, color: '#9E9E9E', radius: 5 } : + { radius: 5, fill: false }) + } + }, (item: News) => item.id) + } + .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true }) + .width('100%') + .height('80%') + .onScrollIndex((startIndex: number) => { + this.currentIndex = startIndex + }) + .id('scrollToIndex') + // 实现参考 + // [Start scrollToIndex_scrollerForList] + .onWillStopDragging((velocity: number) => { + // 短新闻处理 + if (this.IsShortNews(this.currentIndex)) { + // [Start scrollToIndex] + if (velocity > 30) { + this.scrollerForList.scrollToIndex(this.currentIndex, true, ScrollAlign.START) + } else if (velocity < -30) { + this.scrollerForList.scrollToIndex(this.currentIndex + 1, true, ScrollAlign.START) + } + // [End scrollToIndex] + return; + } + // [Start scrollerForList] + // 长新闻处理 + // [Start scrollerForList_rect] + let rect = this.scrollerForList.getItemRect(this.currentIndex); + // [End scrollerForList_rect] + if (velocity < -1000) { + if (rect) { + // 当前节点在页面内的剩余显示范围 + let leftRect = rect.y + rect.height; + // 终点位置 + let mainPosition = -velocity * DEFAULT_FRICTION / FRICTION_SCALE; + if (leftRect + mainPosition > 0.75 * this.listHeight) { + this.scrollerForList.scrollToIndex(this.currentIndex + 1, true, ScrollAlign.START); + return; + } else if (leftRect + mainPosition < 0.25 * this.listHeight) { + this.scrollerForList.scrollToIndex(this.currentIndex, true, ScrollAlign.END, + { extraOffset: LengthMetrics.vp(this.listHeight * 0.3) }) + return; + } + } + } else if (velocity > 1000) { + let leftRect = rect?.y + rect?.height; + let mainPosition = velocity * DEFAULT_FRICTION / FRICTION_SCALE; + if (leftRect + mainPosition > 0.75 * this.listHeight) { + this.scrollerForList.scrollToIndex(this.currentIndex, true, ScrollAlign.START); + return; + } + } + // [End scrollerForList] + }) + // [End scrollToIndex_scrollerForList] + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + .height(this.listHeight) + .backgroundColor(Color.White) + .padding({ top: 20 }) + }.backgroundColor('#f1f2f3') + .title($r('app.string.Support_Sliding_Hand_Event')) + + } + + @Builder + topBar() { + Column() { + Column() { + // $r('app.string.Today_Hot_News')需要替换为开发者所需的资源文件 + Text($r('app.string.Today_Hot_News')) + .fontSize(20) + .fontColor(Color.Black) + .fontWeight(700) + .margin({ bottom: 10 }) + } + } + } +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperAndTabsLinkage.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperAndTabsLinkage.ets index 4b6320ccd..114da8cf7 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperAndTabsLinkage.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperAndTabsLinkage.ets @@ -15,6 +15,7 @@ import { ComponentCard } from "../../common/Card"; +// [Start swiper_tabs_linkage] // xxx.ets class MyDataSource implements IDataSource { private list: number[] = []; @@ -72,9 +73,11 @@ export struct SwiperAndTabsLinkage { } build() { + // [StartExclude swiper_tabs_linkage] NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.SwiperAndTabsLinkage_title') }) { + // [EndExclude swiper_tabs_linkage] Column() { Tabs({ barPosition: BarPosition.Start, controller: this.tabsController }) { ForEach(this.list, (index: number) =>{ @@ -113,6 +116,7 @@ export struct SwiperAndTabsLinkage { this.tabsController.changeIndex(index); }) } + // [StartExclude swiper_tabs_linkage] } } .width('100%') @@ -121,5 +125,7 @@ export struct SwiperAndTabsLinkage { } .backgroundColor('#f1f2f3') .title($r('app.string.SwiperAndTabsLinkage_title')) + // [EndExclude swiper_tabs_linkage] } -} \ No newline at end of file +} +// [End swiper_tabs_linkage] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperCustomAnimation.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperCustomAnimation.ets index 43bab941c..b06b58b31 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperCustomAnimation.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperCustomAnimation.ets @@ -58,7 +58,7 @@ export struct SwiperCustomAnimation { .zIndex(this.zIndexList[index]) }) } - .height(200) + .height(300) .indicator(false) .displayCount(this.DISPLAY_COUNT, true) .customContentTransition({ @@ -90,14 +90,18 @@ export struct SwiperCustomAnimation { } } }) + // [StartExclude customize_transition_animations] } + // [EndExclude customize_transition_animations] } .width('100%') - // [End customize_transition_animations] + // [StartExclude customize_transition_animations] .height('100%') .padding({ left: 12, right: 12 }) } .backgroundColor('#f1f2f3') .title($r('app.string.SwiperCustomAnimation_title')) + // [EndExclude customize_transition_animations] } -} \ No newline at end of file +} +// [End customize_transition_animations] diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDigitIndicatorIgnoreComponentSize.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDigitIndicatorIgnoreComponentSize.ets new file mode 100644 index 000000000..050a44bd4 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDigitIndicatorIgnoreComponentSize.ets @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2025 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 { LengthMetrics } from '@kit.ArkUI'; +import { ComponentCard } from '../../common/Card'; + +class MyDataSource implements IDataSource { + private list: number[] = []; + + constructor(list: number[]) { + this.list = list; + } + + totalCount(): number { + return this.list.length; + } + + getData(index: number): number { + return this.list[index]; + } + + registerDataChangeListener(listener: DataChangeListener): void { + } + + unregisterDataChangeListener() { + } +} + +@Entry +@Component +export struct SwiperDigitIndicatorIgnoreComponentSize { + private swiperController1: SwiperController = new SwiperController(); + private data1: MyDataSource = new MyDataSource([]); + + aboutToAppear(): void { + let list1: number[] = []; + for (let i = 1; i <= 10; i++) { + list1.push(i); + } + this.data1 = new MyDataSource(list1); + } + + build() { + NavDestination() { + Column({ space: 12 }) { + // $r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title')需要替换为开发者所需的字符串资源文件 + ComponentCard({ title: $r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title') }) { + Scroll() { + Column({ space: 20 }) { + // [Start digit_indicator] + Swiper( + // [StartExclude digit_indicator] + this.swiperController1 + // [EndExclude digit_indicator] + ) { + // [StartExclude digit_indicator] + LazyForEach(this.data1, (item: string) => { + Text(item.toString()) + .width('90%') + .height(120) + .backgroundColor(0xAFEEEE) + .textAlign(TextAlign.Center) + .fontSize(30) + }, (item: string) => item) + // [EndExclude digit_indicator] + } + .indicator(new DigitIndicator() + .bottom(LengthMetrics.vp(0), true) + ) + + // [End digit_indicator] + }.width('100%') + } + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + // $r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title')需要替换为开发者所需的字符串资源文件 + .title($r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title')) + } +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDirection.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDirection.ets index e8c8e2d9c..6d8a1bf84 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDirection.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperDirection.ets @@ -27,7 +27,11 @@ export struct SwiperDirection { ComponentCard({ title: $r('app.string.SwiperPageSwitchMethod_titleHorizontal') }) { Column({ space: 8 }) { // [Start rotate_horizontally] - Swiper(this.swiperHorizontalController) { + Swiper( + // [StartExclude rotate_horizontally] + this.swiperHorizontalController + // [EndExclude rotate_horizontally] + ) { // [StartExclude rotate_horizontally] Text('0') .width('90%') @@ -74,7 +78,11 @@ export struct SwiperDirection { ComponentCard({ title: $r('app.string.SwiperPageSwitchMethod_titleVertical') }) { Column({ space: 8 }) { // [Start rotate_vertically] - Swiper(this.swiperVerticalController) { + Swiper( + // [StartExclude rotate_vertically] + this.swiperVerticalController + // [EndExclude rotate_vertically] + ) { // [StartExclude rotate_vertically] Text('0') .width('90%') diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIgnoreComponentSize.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIgnoreComponentSize.ets index 420343eb5..b45b29626 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIgnoreComponentSize.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIgnoreComponentSize.ets @@ -13,8 +13,11 @@ * limitations under the License. */ +// [Start dot_indicator] import { LengthMetrics } from '@kit.ArkUI'; +// [StartExclude dot_indicator] import { ComponentCard } from '../../common/Card'; +// [EndExclude dot_indicator] class MyDataSource implements IDataSource { @@ -63,12 +66,24 @@ export struct SwiperIgnoreComponentSize { } build() { + // [StartExclude dot_indicator] NavDestination() { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.SwiperIgnoreComponentSize_title') }) { + // [EndExclude dot_indicator] Scroll() { Column({ space: 20 }) { - Swiper(this.swiperController1) { + // [Start dot_indicator_space] + // [Start dot_indicator_bottom] + Swiper( + // [StartExclude dot_indicator_space] + // [StartExclude dot_indicator_bottom] + this.swiperController1 + // [EndExclude dot_indicator_bottom] + // [EndExclude dot_indicator_space] + ) { + // [StartExclude dot_indicator_space] + // [StartExclude dot_indicator_bottom] LazyForEach(this.data1, (item: string) => { Text(item.toString()) .width('90%') @@ -77,16 +92,27 @@ export struct SwiperIgnoreComponentSize { .textAlign(TextAlign.Center) .fontSize(30) }, (item: string) => item) + // [EndExclude dot_indicator_bottom] + // [EndExclude dot_indicator_space] } .indicator(new DotIndicator() + // [StartExclude dot_indicator_bottom] .space(this.space) - .bottom(LengthMetrics.vp(0), this.ignoreSize) + // [EndExclude dot_indicator_bottom] + // [StartExclude dot_indicator_space] + .bottom(LengthMetrics.vp(0), this.ignoreSize) // true + // [StartExclude dot_indicator_bottom] .itemWidth(15) .itemHeight(15) .selectedItemWidth(15) .selectedItemHeight(15) .color(Color.Gray) - .selectedColor(Color.Blue)) + .selectedColor(Color.Blue) + // [EndExclude dot_indicator_space] + // [EndExclude dot_indicator_bottom] + ) + // [End dot_indicator_bottom] + // [End dot_indicator_space] .displayArrow({ showBackground: true, isSidebarMiddle: true, @@ -109,6 +135,7 @@ export struct SwiperIgnoreComponentSize { }.margin(2) }.width('100%') } + // [StartExclude dot_indicator] } } .width('100%') @@ -117,5 +144,7 @@ export struct SwiperIgnoreComponentSize { } .backgroundColor('#f1f2f3') .title($r('app.string.SwiperIgnoreComponentSize_title')) + // [EndExclude dot_indicator] } -} \ No newline at end of file +} +// [End dot_indicator] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIndicatorStyle.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIndicatorStyle.ets index b38d27d16..a195a44a9 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIndicatorStyle.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperIndicatorStyle.ets @@ -76,7 +76,9 @@ export struct SwiperIndicatorStyle { .fontSize(30) // [EndExclude customize_navigation_point_styles] } + // [StartExclude customize_navigation_point_styles] .height(100) + // [EndExclude customize_navigation_point_styles] .indicator( Indicator.dot() .left(0) @@ -87,8 +89,8 @@ export struct SwiperIndicatorStyle { .color(Color.Red) .selectedColor(Color.Blue) ) + // [End customize_navigation_point_styles] } - // [End customize_navigation_point_styles] ComponentCard({ title: $r('app.string.SwiperIndicatorStyle_titleDefaultArrows') }) { // [Start default_arrow_style] diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperMultiPage.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperMultiPage.ets index e534dd9f1..82b6babf3 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperMultiPage.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperMultiPage.ets @@ -25,26 +25,26 @@ export struct SwiperMultiPage { // [Start each_page_displays_multiple_subpages] Swiper() { Text('0') - .width('90%') - .height('100%') + .width(250) + .height(250) .backgroundColor(Color.Gray) .textAlign(TextAlign.Center) .fontSize(30) Text('1') - .width('90%') - .height('100%') + .width(250) + .height(250) .backgroundColor(Color.Green) .textAlign(TextAlign.Center) .fontSize(30) Text('2') - .width('90%') - .height('100%') + .width(250) + .height(250) .backgroundColor(Color.Pink) .textAlign(TextAlign.Center) .fontSize(30) Text('3') - .width('90%') - .height('100%') + .width(250) + .height(250) .backgroundColor(Color.Yellow) .textAlign(TextAlign.Center) .fontSize(30) diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperPageSwitchMethod.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperPageSwitchMethod.ets index 64ae9a299..9705d57f5 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperPageSwitchMethod.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperPageSwitchMethod.ets @@ -19,7 +19,19 @@ import { ComponentCard } from '../../common/Card'; @Entry @Component export struct SwiperPageSwitchMethod { + private swiperBackgroundColors: Color[] = [Color.Blue, Color.Brown, Color.Gray, Color.Green, Color.Orange, + Color.Pink, Color.Red, Color.Yellow]; + private swiperAnimationMode: (SwiperAnimationMode | boolean | undefined)[] = [undefined, true, false, + SwiperAnimationMode.NO_ANIMATION, SwiperAnimationMode.DEFAULT_ANIMATION, SwiperAnimationMode.FAST_ANIMATION]; private swiperController: SwiperController = new SwiperController(); + private animationModeIndex: number = 0; + private animationMode: (SwiperAnimationMode | boolean | undefined) = undefined; + @State animationModeStr: string = 'undefined'; + @State targetIndex: number = 0; + + aboutToAppear(): void { + this.toSwiperAnimationModeStr(); + } build() { // [StartExclude switch_pages] @@ -27,26 +39,16 @@ export struct SwiperPageSwitchMethod { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.SwiperPageSwitchMethod_title') }) { // [EndExclude switch_pages] - Column({ space: 8 }) { + Column({ space: 5 }) { Swiper(this.swiperController) { - Text('0') - .width('90%') - .height('100%') - .backgroundColor(Color.Gray) - .textAlign(TextAlign.Center) - .fontSize(30) - Text('1') - .width('90%') - .height('100%') - .backgroundColor(Color.Green) - .textAlign(TextAlign.Center) - .fontSize(30) - Text('2') - .width('90%') - .height('100%') - .backgroundColor(Color.Pink) - .textAlign(TextAlign.Center) - .fontSize(30) + ForEach(this.swiperBackgroundColors, (backgroundColor: Color, index: number) => { + Text(index.toString()) + .width(250) + .height(250) + .backgroundColor(backgroundColor) + .textAlign(TextAlign.Center) + .fontSize(30) + }) } // [StartExclude switch_pages] .height(200) @@ -63,15 +65,53 @@ export struct SwiperPageSwitchMethod { this.swiperController.showPrevious(); // 通过controller切换到前一页 }) }.margin(5) + + Row({ space: 12 }) { + Text('Index:') + Button(this.targetIndex.toString()) + .onClick(() => { + this.targetIndex = (this.targetIndex + 1) % this.swiperBackgroundColors.length; + }) + }.margin(5) + Row({ space: 12 }) { + Text('AnimationMode:') + Button(this.animationModeStr) + .onClick(() => { + this.animationModeIndex = (this.animationModeIndex + 1) % this.swiperAnimationMode.length; + this.toSwiperAnimationModeStr(); + }) + }.margin(5) + + Row({ space: 12 }) { + Button('changeIndex(' + this.targetIndex + ', ' + this.animationModeStr + ')') + .onClick(() => { + this.swiperController.changeIndex(this.targetIndex, this.animationMode); // 通过controller切换到指定页 + }) + }.margin(5) } + // [StartExclude switch_pages] } } - // [End switch_pages] .width('100%') .height('100%') .padding({ left: 12, right: 12 }) } .backgroundColor('#f1f2f3') .title($r('app.string.SwiperPageSwitchMethod_title')) + // [EndExclude switch_pages] + } + + private toSwiperAnimationModeStr() { + this.animationMode = this.swiperAnimationMode[this.animationModeIndex]; + if ((this.animationMode === true) || (this.animationMode === false)) { + this.animationModeStr = '' + this.animationMode; + } else if ((this.animationMode === SwiperAnimationMode.NO_ANIMATION) || + (this.animationMode === SwiperAnimationMode.DEFAULT_ANIMATION) || + (this.animationMode === SwiperAnimationMode.FAST_ANIMATION)) { + this.animationModeStr = SwiperAnimationMode[this.animationMode]; + } else { + this.animationModeStr = 'undefined'; + } } -} \ No newline at end of file +} +// [End switch_pages] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperVisibleContentPosition.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperVisibleContentPosition.ets new file mode 100644 index 000000000..23bb4fe09 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/SwiperVisibleContentPosition.ets @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2025 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 { ComponentCard } from '../../common/Card'; +import { hilog } from '@kit.PerformanceAnalysisKit'; + +const DOMAIN = 0x0000; + +// [Start visible_content_position] +// xxx.ets +class MyDataSource implements IDataSource { + private listeners: DataChangeListener[] = []; + private dataArray: string[] = ['0', '1', '2', '3', '4', '5', '6']; + + public totalCount(): number { + return this.dataArray.length; + } + + public getData(index: number): string | undefined { + return this.dataArray[index]; + } + + public addData(index: number, data: string): void { + this.dataArray.splice(index, 0, data); + this.listeners.forEach(listener => { + listener.onDataAdd(index); + }) + } + + public deleteData(index: number): void { + this.dataArray.splice(index, 1); + this.listeners.forEach(listener => { + listener.onDataDelete(index); + }) + } + + registerDataChangeListener(listener: DataChangeListener): void { + if (this.listeners.indexOf(listener) < 0) { + hilog.info(DOMAIN, 'testTag', 'add listener'); + this.listeners.push(listener); + } + } + + unregisterDataChangeListener(listener: DataChangeListener): void { + const pos = this.listeners.indexOf(listener); + if (pos >= 0) { + hilog.info(DOMAIN, 'testTag', 'remove listener'); + this.listeners.splice(pos, 1); + } + } +} + +@Entry +@Component +export struct SwiperVisibleContentPosition { + private data: MyDataSource = new MyDataSource(); + @State index: number = 3; + + build() { + // [StartExclude visible_content_position] + NavDestination() { + // [EndExclude visible_content_position] + Column({ space: 12 }) { + // [StartExclude visible_content_position] + // $r('app.string.SwiperVisibleContentPosition_title')需要替换为开发者所需的字符串资源文件 + ComponentCard({ title: $r('app.string.SwiperVisibleContentPosition_title') }) { + Column({ space: 20 }) { + // [EndExclude visible_content_position] + Swiper() { + LazyForEach(this.data, (item: string) => { + Text(item.toString()) + .width('90%') + .height(160) + .backgroundColor(0xAFEEEE) + .textAlign(TextAlign.Center) + .fontSize(30) + }) + } + .onChange((index) => { + this.index = index; + }) + .index(3) + .maintainVisibleContentPosition(true) + // [StartExclude visible_content_position] + .displayArrow({ + showBackground: true, + isSidebarMiddle: true, + backgroundSize: 24, + backgroundColor: Color.White, + arrowSize: 18, + arrowColor: Color.Blue + }, false) + // [EndExclude visible_content_position] + + Column({ space: 12 }) { + Text('index:' + this.index).fontSize(20) + Row() { + // 在LazyForEach索引为0的位置添加数据 + Button('header data add').height(30).onClick(() => { + this.data.addData(0, 'header Data'); + }) + // 删除LazyForEach索引为0的位置数据 + Button('header data delete').height(30).onClick(() => { + this.data.deleteData(0); + }) + } + }.margin(5) + // [StartExclude visible_content_position] + }.width('100%') + } + // [EndExclude visible_content_position] + }.width('100%') + .margin({ top: 5 }) + // [StartExclude visible_content_position] + } + .backgroundColor('#f1f2f3') + // $r('app.string.SwiperVisibleContentPosition_title')需要替换为开发者所需的字符串资源文件 + .title($r('app.string.SwiperVisibleContentPosition_title')) + // [EndExclude visible_content_position] + } +} +// [End visible_content_position] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/index.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/index.ets index 37aa2ea07..8ab8d2fbe 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/index.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/swiper/index.ets @@ -23,6 +23,9 @@ import { SwiperLoop } from './SwiperLoop'; import { SwiperMultiPage } from './SwiperMultiPage'; import { SwiperPageSwitchMethod } from './SwiperPageSwitchMethod'; import { SwiperAndTabsLinkage } from './SwiperAndTabsLinkage'; +import { SwiperIgnoreComponentSize } from './SwiperIgnoreComponentSize'; +import { SwiperDigitIndicatorIgnoreComponentSize } from './SwiperDigitIndicatorIgnoreComponentSize'; +import { SwiperVisibleContentPosition } from './SwiperVisibleContentPosition'; import resource from '../../common/resource'; export const SWIPER_ROUTE_PREFIX: string = 'swiper'; @@ -67,6 +70,21 @@ const routes: Route[] = [ name: `${SWIPER_ROUTE_PREFIX}/SwiperAndTabsLinkage`, title: resource.resourceToString($r('app.string.SwiperAndTabsLinkage_title')), description: $r('app.string.SwiperAndTabsLinkage_description') + }, + { + name: `${SWIPER_ROUTE_PREFIX}/SwiperIgnoreComponentSize`, + title: resource.resourceToString($r('app.string.SwiperIgnoreComponentSize_title')), + description: $r('app.string.SwiperIgnoreComponentSize_description') + }, + { + name: `${SWIPER_ROUTE_PREFIX}/SwiperDigitIndicatorIgnoreComponentSize`, + title: resource.resourceToString($r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title')), + description: $r('app.string.SwiperDigitIndicatorIgnoreComponentSize_description') + }, + { + name: `${SWIPER_ROUTE_PREFIX}/SwiperVisibleContentPosition`, + title: resource.resourceToString($r('app.string.SwiperVisibleContentPosition_title')), + description: $r('app.string.SwiperVisibleContentPosition_description') } ]; @@ -90,6 +108,12 @@ export function swiperDestination(name: string) { SwiperCustomAnimation(); } else if (name === routes[7].name) { SwiperAndTabsLinkage(); + } else if (name === routes[8].name) { + SwiperIgnoreComponentSize(); + } else if (name === routes[9].name) { + SwiperDigitIndicatorIgnoreComponentSize(); + } else if (name === routes[10].name) { + SwiperVisibleContentPosition(); } } @@ -113,6 +137,7 @@ struct SwiperExample { } .contentStartOffset(56) .padding({ left: 16, right: 16 }) + .id('list_') } .backgroundColor('#f1f3f5') .title('Swiper', { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/ContentPageNoAndTabLinkage.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/ContentPageNoAndTabLinkage.ets new file mode 100644 index 000000000..e245593b3 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/ContentPageNoAndTabLinkage.ets @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start ContentPageNoAndTabLinkage] +import { ComponentCard } from '../../common/Card'; +@Entry +@Component +export struct ContentPageNoAndTabLinkage { + + @State selectIndex: number = 0; + @Builder tabBuilder(title: Resource, targetIndex: number) { + Column() { + Text(title) + .fontColor(this.selectIndex === targetIndex ? '#1698CE' : '#6B6B6B') + } + } + build() { + NavDestination() { + Column({ space: 12 }) { + // $r('app.string.ContentWillChange_titleContentOnAndTabSync')需要替换为开发者所需的字符串(图像、数字等)资源文件 + ComponentCard({ title: $r('app.string.ContentWillChange_titleContentOnAndTabSync') }) { + // [Start bottom_navigation] + Tabs({ barPosition: BarPosition.End }) { + TabContent() { + Text($r('app.string.homepage_content')).width('100%').height('100%').backgroundColor('rgb(213,213,213)') + .fontSize(40).fontColor(Color.Black).textAlign(TextAlign.Center) + }.tabBar(this.tabBuilder($r('app.string.homepage'), 0)) + + TabContent() { + Text($r('app.string.discover_content')).width('100%').height('100%').backgroundColor('rgb(112,112,112)') + .fontSize(40).fontColor(Color.Black).textAlign(TextAlign.Center) + }.tabBar(this.tabBuilder($r('app.string.discover'), 1)) + + TabContent() { + Text($r('app.string.recommend')).width('100%').height('100%').backgroundColor('rgb(39,135,217)') + .fontSize(40).fontColor(Color.Black).textAlign(TextAlign.Center) + }.tabBar(this.tabBuilder($r('app.string.recommend_content'), 2)) + + TabContent() { + Text($r('app.string.mine_content')).width('100%').height('100%').backgroundColor('rgb(0,74,175)') + .fontSize(40).fontColor(Color.Black).textAlign(TextAlign.Center) + }.tabBar(this.tabBuilder($r('app.string.mine'), 3)) + } + .animationDuration(0) + .backgroundColor('#F1F3F5') + .onSelected((index: number) => { + this.selectIndex = index; + }) + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.ContentWillChange_titleContentOnAndTabSync')) + } +} +// [End ContentPageNoAndTabLinkage] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/NumberOfCachesTabBar.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/NumberOfCachesTabBar.ets new file mode 100644 index 000000000..5a5007244 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/NumberOfCachesTabBar.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2025 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. + */ +// [Start NumberOfCachesTabBar] +import { ComponentCard } from '../../common/Card'; +@Entry +@Component +export struct NumberOfCachesTabBar { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.Cache_count') }) { + // [Start top_navigation] + Tabs({ barPosition: BarPosition.Start }) { + // [StartExclude top_navigation] + TabContent() { + MyComponent({ color: '#00CB87' }) + }.tabBar(SubTabBarStyle.of('green')) + + TabContent() { + MyComponent({ color: '#007DFF' }) + }.tabBar(SubTabBarStyle.of('blue')) + + TabContent() { + MyComponent({ color: '#FFBF00' }) + }.tabBar(SubTabBarStyle.of('yellow')) + + TabContent() { + MyComponent({ color: '#E67C92' }) + }.tabBar(SubTabBarStyle.of('pink')) + + TabContent() { + MyComponent({ color: '#FF0000' }) + }.tabBar(SubTabBarStyle.of('red')) + } + .width(360) + .height(296) + .backgroundColor('#F1F3F5') + .cachedMaxCount(1, TabsCacheMode.CACHE_BOTH_SIDE) + // [EndExclude top_navigation] + } + // [End top_navigation] + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Cache_count')) + } +} + +@Component +struct MyComponent { + private color: string = ''; + + aboutToAppear(): void { + console.info('aboutToAppear backgroundColor:' + this.color); + } + + aboutToDisappear(): void { + console.info('aboutToDisappear backgroundColor:' + this.color); + } + + build() { + Column() + .width('100%') + .height('100%') + .backgroundColor(this.color) + } +} +// [End NumberOfCachesTabBar] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/index.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/index.ets index b601f6080..bf4c73fe2 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/index.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/tabs/index.ets @@ -12,9 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { AgeFriendlyTabs } from './AgeFriendlyTabs'; import { BottomTabBar } from './BottomTabBar'; +import { AgeFriendlyTabs } from './AgeFriendlyTabs'; import { CompletedRoutableCard } from '../../common/Card'; import { ContentWillChange } from './ContentWillChange'; import { CustomTabBar } from './CustomTabBar'; @@ -26,6 +25,8 @@ import { SwipeLockedTabBar } from './SwipeLockedTabBar'; import { TabsLayout } from './TabsLayout'; import { TopTabBar } from './TopTabBar'; import resource from '../../common/resource'; +import { NumberOfCachesTabBar } from './NumberOfCachesTabBar'; +import { ContentPageNoAndTabLinkage } from './ContentPageNoAndTabLinkage'; export const TABS_ROUTE_PREFIX: string = 'tabs'; @@ -79,6 +80,16 @@ const routes: Route[] = [ name: `${TABS_ROUTE_PREFIX}/AgeFriendlyTabs`, title: resource.resourceToString($r('app.string.AgeFriendlyTabs_title')), description: $r('app.string.AgeFriendlyTabs_description') + }, + { + name: `${TABS_ROUTE_PREFIX}/NumberOfCachesTabBar`, + title: resource.resourceToString($r('app.string.Cache_count')), + description: $r('app.string.ContentWillChange_description') + }, + { + name: `${TABS_ROUTE_PREFIX}/ContentPageAndTabLinkage`, + title: resource.resourceToString($r('app.string.ContentWillChange_titleContentOnAndTabSync')), + description: $r('app.string.Content_titleContentOnAndTabSync') } ]; @@ -106,6 +117,10 @@ export function tabsDestination(name: string) { ContentWillChange(); } else if (name === routes[9].name) { AgeFriendlyTabs(); + } else if (name === routes[10].name) { + NumberOfCachesTabBar(); + } else if (name === routes[11].name) { + ContentPageNoAndTabLinkage(); } } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDataSource.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDataSource.ets index 3dfc468da..d89c169b4 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDataSource.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDataSource.ets @@ -95,13 +95,14 @@ export class WaterFlowDataSource implements IDataSource { this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length); this.notifyDataAdd(this.dataArray.length - 1); } - + // [Start addNewItems_start] public addNewItems(count: number): void { for (let i = 0; i < count; i++) { this.dataArray.push(this.dataArray.length); this.notifyDataAdd(this.dataArray.length - 1); } } + // [End addNewItems_start] // 在指定索引位置增加一个元素 public addItem(index: number): void { diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDynamicSwitchover.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDynamicSwitchover.ets index 6c7ccb83c..9c17fa72c 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDynamicSwitchover.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowDynamicSwitchover.ets @@ -37,7 +37,7 @@ struct ReusableFlowItem { } } } - +// [Start waterFlowDynamicSwitchover_start] @Reusable @Component struct ReusableListItem { @@ -61,13 +61,16 @@ struct ReusableListItem { @Entry @Component export struct WaterFlowDynamicSwitchover { + // 通过状态变量设置列数,可以按需修改触发布局更新 + @State columns: number = 2; + + // [StartExclude waterFlowDynamicSwitchover_start] minSize: number = 80; maxSize: number = 180; colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]; dataSource: WaterFlowDataSource = new WaterFlowDataSource(100); private itemWidthArray: number[] = []; private itemHeightArray: number[] = []; - @State columns: number = 2; @State waterflowScale: number = 1; @State imageScale: number = 1; @State waterFlowOpacity: number = 1; @@ -127,7 +130,7 @@ export struct WaterFlowDynamicSwitchover { .margin({ top: 2 }) }.width('100%').justifyContent(FlexAlign.Center) } - + // [EndExclude waterFlowDynamicSwitchover_start] build() { NavDestination() { Column({ space: 12 }) { @@ -167,6 +170,9 @@ export struct WaterFlowDynamicSwitchover { }, 1000); } }) + // [StartExclude waterFlowDynamicSwitchover_start] + .id('test') + // [EndExclude waterFlowDynamicSwitchover_start] } } } @@ -177,3 +183,4 @@ export struct WaterFlowDynamicSwitchover { .title($r('app.string.WaterFlowDynamicSwitchover_title')) } } +// [End waterFlowDynamicSwitchover_start] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowGroupingMixing.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowGroupingMixing.ets index 0f5fcc388..b7bc28e7e 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowGroupingMixing.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowGroupingMixing.ets @@ -37,7 +37,7 @@ struct ReusableFlowItem { } } } - +// [Start waterFlowGroupingMixing_start] @Entry @Component export struct WaterFlowGroupingMixing { @@ -47,15 +47,30 @@ export struct WaterFlowGroupingMixing { dataSource: WaterFlowDataSource = new WaterFlowDataSource(100); private itemWidthArray: number[] = []; private itemHeightArray: number[] = []; - @State columns: number = 2; - @State waterflowScale: number = 1; - @State imageScale: number = 1; - @State waterFlowOpacity: number = 1; - @State waterflowSnapshot: image.PixelMap | undefined = undefined; - private columnChanged: boolean = false; - private oldColumn: number = this.columns; - private pinchTime: number = 0; private gridItems: number[] = []; + @State sections: WaterFlowSections = new WaterFlowSections(); + sectionMargin: Margin = { + top: 10, + left: 5, + bottom: 10, + right: 5 + }; + oneColumnSection: SectionOptions = { + itemsCount: 1, + crossCount: 1, + columnsGap: 5, + rowsGap: 10, + margin: this.sectionMargin, + }; + twoColumnSection: SectionOptions = { + itemsCount: 98, + crossCount: 2, + }; + // 使用分组瀑布流时无法通过footer设置尾部组件,可以保留一个固定的分组作为footer + lastSection: SectionOptions = { + itemsCount: 1, + crossCount: 1, + }; // 计算FlowItem宽/高 getSize() { @@ -72,59 +87,26 @@ export struct WaterFlowGroupingMixing { } aboutToAppear() { - // 读取上次最后切换到到列数 - let lastCount = AppStorage.get('columnsCount'); - if (typeof lastCount != 'undefined') { - this.columns = lastCount; - } this.setItemSizeArray(); for (let i = 0; i < 15; ++i) { this.gridItems.push(i); } - } - - // 根据缩放阈值改变列数,触发WaterFlow重新布局 - changeColumns(scale: number) { - if (scale > (this.columns / (this.columns - 0.5)) && this.columns > 1) { - this.columns--; - this.columnChanged = true; - } else if (scale < 1 && this.columns < 4) { - this.columns++; - this.columnChanged = true; - } - } - - @Builder - itemFoot() { - Row() { - LoadingProgress() - .color(Color.Blue).height(50).aspectRatio(1).width('20%') - Text(`正在加载`) - .fontSize(20) - .width('30%') - .height(50) - .align(Alignment.Center) - .margin({ top: 2 }) - }.width('100%').justifyContent(FlexAlign.Center) + // 所有分组的itemCount之和需要和WaterFlow下数据源的子节点总数相等,否则无法正常布局 + let sectionOptions: SectionOptions[] = [this.oneColumnSection, this.twoColumnSection, this.lastSection]; + this.sections.splice(0, 0, sectionOptions); } build() { NavDestination() { - Column({ space: 12 }) { - ComponentCard({ title: $r('app.string.WaterFlowGroupingMixing_title') }) { - List({ space: 10 }) { - ListItem() { - Text('List').fontSize(14).height(16).margin(3) - } - - ListItem() { - Column() { - Text('Grid in ListItem').fontSize(12).height(16).margin(3) - + ComponentCard({ title: $r('app.string.WaterFlowGroupingMixing_title') }) { + WaterFlow({ layoutMode: WaterFlowLayoutMode.SLIDING_WINDOW, sections: this.sections }) { + LazyForEach(this.dataSource, (item: number) => { + FlowItem() { + if (item === 0) { Grid() { ForEach(this.gridItems, (day: number) => { GridItem() { - Text('GridItem').fontSize(10).height(16) + Text('GridItem').fontSize(14).height(16) }.backgroundColor(0xFFC0CB) }, (day: number) => day.toString()) } @@ -133,48 +115,32 @@ export struct WaterFlowGroupingMixing { .columnsGap(5) .columnsTemplate('1fr '.repeat(5)) .rowsTemplate('1fr '.repeat(3)) - .width('95%') - }.borderWidth(3) + } else { + ReusableFlowItem({ item: item }) + } } - - ListItem() { - Column() { - Text('WaterFlow in ListItem').fontSize(14).height(16).margin(3) - WaterFlow({ layoutMode: WaterFlowLayoutMode.SLIDING_WINDOW }) { - LazyForEach(this.dataSource, (item: number) => { - FlowItem() { - ReusableFlowItem({ item: item }) - } - .width('100%') - .aspectRatio(this.columns === 2 ? this.itemHeightArray[item % 100] / this.itemWidthArray[item % 100] : 0) - .backgroundColor(this.colors[item % 5]) - }, (item: string) => item) - } - .columnsTemplate('1fr '.repeat(this.columns)) - .backgroundColor(0xFAEEE0) - .height('100%') - .layoutWeight(1) - // 即将触底时提前增加数据 - .onScrollIndex((first: number, last: number) => { - if (last + 20 >= this.dataSource.totalCount()) { - setTimeout(() => { - this.dataSource.addNewItems(100); - }, 1000) - } - }) - .width('95%') - }.borderWidth(3) - } - }.borderWidth(3) - .width('98%') - .alignListItem(ListItemAlign.Center).scrollBar(BarState.Off) + .width('100%') + .aspectRatio(item != 0 ? this.itemHeightArray[item % 100] / this.itemWidthArray[item % 100] : 0) + .backgroundColor(item != 0 ? this.colors[item % 5] : Color.White) + }, (item: string) => item) } + .backgroundColor(0xFAEEE0) + .height('100%') + // 即将触底时提前增加数据 + .onScrollIndex((first: number, last: number) => { + if (last + 20 >= this.dataSource.totalCount()) { + setTimeout(() => { + this.dataSource.addNewItems(100); + // 增加数据后同步调整对应分组的itemCount + this.twoColumnSection.itemsCount += 100; + this.sections.update(1, this.twoColumnSection); + }, 1000); + } + }) + .margin(10) } - .width('100%') - .height('100%') - .padding({ left: 12, right: 12 }) - } - .backgroundColor('#f1f2f3') + }.backgroundColor('#f1f2f3') .title($r('app.string.WaterFlowGroupingMixing_title')) } } +// [End waterFlowGroupingMixing_start] \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrolling.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrolling.ets index 090bdf39b..36b1f523b 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrolling.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrolling.ets @@ -93,7 +93,7 @@ export struct WaterFlowInfiniteScrolling { this.columnChanged = true; } } - + // [Start WaterFlowInfiniteScrolling_start] @Builder itemFoot() { Row() { @@ -130,9 +130,7 @@ export struct WaterFlowInfiniteScrolling { // 触底加载数据 .onReachEnd(() => { setTimeout(() => { - for (let i = 0; i < 100; i++) { - this.dataSource.addLastItem(); - } + this.dataSource.addNewItems(100); }, 1000) }) } @@ -144,4 +142,5 @@ export struct WaterFlowInfiniteScrolling { .backgroundColor('#f1f2f3') .title($r('app.string.WaterFlowInfiniteScrolling_title')) } + // [End WaterFlowInfiniteScrolling_start] } diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrollingEarly.ets b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrollingEarly.ets index 162cb8e75..cea2bfa44 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrollingEarly.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/main/ets/pages/waterFlow/WaterFlowInfiniteScrollingEarly.ets @@ -107,7 +107,7 @@ export struct WaterFlowInfiniteScrollingEarly { .margin({ top: 2 }) }.width('100%').justifyContent(FlexAlign.Center) } - + // [Start waterFlowInfiniteScrollingEarly_start] build() { NavDestination() { Column({ space: 12 }) { @@ -144,4 +144,5 @@ export struct WaterFlowInfiniteScrollingEarly { .backgroundColor('#f1f2f3') .title($r('app.string.WaterFlowInfiniteScrollingEarly_title')) } + // [End waterFlowInfiniteScrollingEarly_start] } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/element/string.json b/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/element/string.json index f5f2e04b9..48d77556c 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/element/string.json +++ b/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/element/string.json @@ -308,6 +308,10 @@ "name": "ScrollableTabBar_titleExample", "value": "滚动导航栏示例" }, + { + "name": "Cache_count", + "value": "缓存数" + }, { "name": "FocusOn_content", "value": "关注的内容" @@ -336,6 +340,18 @@ "name": "humanities_content", "value": "人文的内容" }, + { + "name": "art_content", + "value": "艺术的内容" + }, + { + "name": "nature_content", + "value": "自然的内容" + }, + { + "name": "military_content", + "value": "军事的内容" + }, { "name": "FocusOn", "value": "关注" @@ -364,6 +380,18 @@ "name": "humanities", "value": "人文" }, + { + "name": "art", + "value": "艺术" + }, + { + "name": "nature", + "value": "自然" + }, + { + "name": "military", + "value": "军事" + }, { "name": "ScrollableTabBar_description", "value": "示例展示内容分类较多,屏幕宽度无法容纳所有分类页签的情况下,需要使用可滚动的导航栏的情景。" @@ -420,6 +448,10 @@ "name": "ContentWillChange_titleContentAndTabSync", "value": "内容页和页签联动示例" }, + { + "name": "ContentWillChange_titleContentOnAndTabSync", + "value": "内容页和页签不联动示例" + }, { "name": "ContentWillChange_titleSpecifiedTab", "value": "切换指定页签示例" @@ -436,6 +468,10 @@ "name": "ContentWillChange_description", "value": "示例展示使用了自定义导航栏后,自行实现页签切换逻辑。" }, + { + "name": "Content_titleContentOnAndTabSync", + "value": "示例展示使用了自定义导航栏后,内容和标签联动" + }, { "name": "AgeFriendlyTabs_title", "value": "支持适老化" @@ -576,6 +612,18 @@ "name": "ResponsiveScrollPositionList_title", "value": "响应滚动位置" }, + { + "name": "Sliding_Hand_Event", + "value": "滑动离手事件" + }, + { + "name": "Support_Sliding_Hand_Event", + "value": "支持滑动离手事件" + }, + { + "name": "Today_Hot_News", + "value": "今日热点新闻" + }, { "name": "ResponsiveScrollPositionList_titleExample", "value": "响应滚动位置示例" @@ -856,6 +904,14 @@ "name": "ArcListCrown_description", "value": "手表设备上弧形列表在获焦的情况下可对旋转表冠做出响应,用户可通过旋转表冠的操作滑动列表,浏览列表项数据。" }, + { + "name": "ArcListCreate_title", + "value": "创建弧形列表" + }, + { + "name": "ArcListCreate_description", + "value": "ArcList可通过调用以下接口来创建。" + }, { "name": "ArcListShow_title", "value": "在弧形列表中显示数据" @@ -880,6 +936,14 @@ "name": "ArcListStyles_title", "value": "自定义弧形列表样式" }, + { + "name": "SwiperDigitIndicatorIgnoreComponentSize_title", + "value": "设置数字导航点忽略导航点组件大小" + }, + { + "name": "SwiperDigitIndicatorIgnoreComponentSize_description", + "value": "针对数字导航点,当导航点的bottom设为0之后,导航点的底部与Swiper的底部还会有一定间距。如果希望消除该间距,可通过调用bottom(bottom, ignoreSize)属性来进行设置。" + }, { "name": "ArcListStyles_titleSpacing", "value": "自定义弧形列表项间距" @@ -888,6 +952,14 @@ "name": "ArcListStyles_titleScale", "value": "列表项关闭自动缩放" }, + { + "name": "SwiperVisibleContentPosition_title", + "value": "保持可见内容位置不变" + }, + { + "name": "SwiperVisibleContentPosition_description", + "value": "Swiper通过设置maintainVisibleContentPosition属性,可在使用LazyForEach懒加载数据时(如通过onDataAdd新增数据),保持当前可见内容位置不变,避免因数据增删导致的视图跳动。" + }, { "name": "ArcListStyles_description", "value": "以下示例展示自定义弧形列表样式的方法。" @@ -940,6 +1012,10 @@ "name": "ListChatRoom_description", "value": "部分业务场景需要列表底部插入数据时,自动向上滚动,把新插入的节点展示出来。" }, + { + "name": "SupportSlidingHand_title", + "value": "支持滑动离手事件" + }, { "name": "LongGrid_title", "value": "性能优化" @@ -983,6 +1059,114 @@ { "name": "ArcListStyles_light", "value": "显示和亮度" + }, + { + "name": "Reading", + "value": "读书" + }, + { + "name": "Exercise", + "value": "旅游" + }, + { + "name": "Travel", + "value": "旅游" + }, + { + "name": "Listening_Music", + "value": "听音乐" + }, + { + "name": "Watching_Films", + "value": "看电影" + }, + { + "name": "Singing", + "value": "唱歌" + }, + { + "name": "Meeting", + "value": "会议" + }, + { + "name": "Voting", + "value": "投票" + }, + { + "name": "Check_in", + "value": "签到" + }, + { + "name": "Printing", + "value": "打印" + }, + { + "name": "Live_Streaming", + "value": "直播" + }, + { + "name": "Imported", + "value": "进口" + }, + { + "name": "Categories", + "value": "分类" + }, + { + "name": "Recharge", + "value": "充值" + }, + { + "name": "Membership", + "value": "领卷" + }, + { + "name": "Claim_Coupon", + "value": "抽奖" + }, + { + "name": "Lottery", + "value": "会员" + }, + { + "name": "Favorites", + "value": "收藏" + }, + { + "name": "Points", + "value": "积分" + }, + { + "name": "More", + "value": "更多" + }, + { + "name": "Previous_Page", + "value": "上一页" + }, + { + "name": "Next_page", + "value": "下一页" + }, + { + "name": "message", + "value": "发送" + }, + { + "name": "contacts", + "value": "联系人" + }, + { + "name": "First_subassembly", + "value": "第一个子组件" + }, + { + "name": "Second_subassembly", + "value": "第二个子组件" + }, + { + "name": "Third_subassembly", + "value": "第三个子组件" } ] } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/media/ic_public_delete_filled.svg b/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/media/ic_public_delete_filled.svg new file mode 100644 index 000000000..8f8348613 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/resources/base/media/ic_public_delete_filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/main/syscap.json b/ArkUIKit/ScrollableComponent/entry/src/main/syscap.json new file mode 100644 index 000000000..f6d8139cd --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/main/syscap.json @@ -0,0 +1,18 @@ +{ + "devices": { + "general": [ + "default", + "tablet" + ], + "custom": [ + { + "xts": [ + "SystemCapability.ArkUI.ArkUI.Full", + "SystemCapability.ArkUI.ArkUI.Circle", + "SystemCapability.Security.DeviceSecurityLevel", + "SystemCapability.UserIAM.UserAuth.PinAuth" + ] + } + ] + } +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/List.test.ets b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/List.test.ets index 7c16bc08c..23a58c846 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/List.test.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/List.test.ets @@ -15,8 +15,12 @@ import abilityTest from './Ability.test'; import IndexTest from './index.test'; +import indexAdd from './indexAdd.test'; +import Index1Test from './index1.test'; export default function testsuite() { abilityTest(); IndexTest(); + indexAdd() + Index1Test(); } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index.test.ets b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index.test.ets index 30b111830..02b0c35fb 100644 --- a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index.test.ets +++ b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index.test.ets @@ -14,12 +14,14 @@ */ import { describe, it, expect, beforeAll } from '@ohos/hypium'; + // 导入测试依赖kit -import { abilityDelegatorRegistry, Driver, ON, MouseButton,MatchPattern, UiDirection } from '@kit.TestKit'; +import { abilityDelegatorRegistry, Driver, ON, MouseButton, MatchPattern, UiDirection, Component } from '@kit.TestKit'; import { UIAbility, Want } from '@kit.AbilityKit'; import { Point } from '@ohos.UiTest'; +import { hilog } from '@kit.PerformanceAnalysisKit'; - +const DOMAIN = 0x0000; const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); @@ -45,7 +47,6 @@ export default function IndexTest() { console.info('get top ability'); expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); }) - /** * @tc.number UiTest_001 * @tc.name testControlledScrollPositionList @@ -160,8 +161,8 @@ export default function IndexTest() { let componentButton = await driver.findComponent(ON.text('List', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,17); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 17); let str = await getResourceString($r('app.string.AddListItem_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); @@ -170,7 +171,7 @@ export default function IndexTest() { let addButton = await driver.findComponent(ON.text('+', MatchPattern.CONTAINS)); expect(addButton === null).assertFalse(); await addButton.click(); - await driver.mouseClick({x: 580, y: 770}, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); + await driver.mouseClick({ x: 580, y: 770 }, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testAddListItem end'); @@ -188,8 +189,8 @@ export default function IndexTest() { let componentButton = await driver.findComponent(ON.text('List', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,17); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 17); let str = await getResourceString($r('app.string.DeleteListItem_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); @@ -198,7 +199,7 @@ export default function IndexTest() { let addButton = await driver.findComponent(ON.text('+', MatchPattern.CONTAINS)); expect(addButton === null).assertFalse(); await addButton.click(); - await driver.mouseClick({x: 580, y: 770}, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); + await driver.mouseClick({ x: 580, y: 770 }, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); let listContent = await driver.findComponent(ON.text('Reading', MatchPattern.CONTAINS)); expect(listContent === null).assertFalse(); await listContent.longClick(); @@ -306,8 +307,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwiperAutoPlay end'); @@ -332,10 +333,10 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - let scrollPoint2:Point = {x:400,y:800}; - await driver.mouseScroll(scrollPoint,true,2); - await driver.mouseScroll(scrollPoint2,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + let scrollPoint2: Point = { x: 400, y: 800 }; + await driver.mouseScroll(scrollPoint, true, 2); + await driver.mouseScroll(scrollPoint2, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwiperCustomAnimation end'); @@ -360,8 +361,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwiperMultiPage end'); @@ -386,8 +387,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwiperCustomAnimation end'); @@ -440,8 +441,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testTabsLayout end'); @@ -466,8 +467,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testBottomTabBar end'); @@ -492,8 +493,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testBottomTabBar end'); @@ -518,8 +519,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,4); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 4); await driver.pressBack(); await driver.pressBack(); console.info('uitest: tesSideTabBar end'); @@ -544,8 +545,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,4); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 4); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwipeLockedTabBar end'); @@ -570,8 +571,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,4); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 4); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testFixedTabBar end'); @@ -596,8 +597,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,12); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 12); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testScrollableTabBar end'); @@ -622,8 +623,8 @@ export default function IndexTest() { let tabs = await driver.findComponent(ON.type('Tabs')); expect(tabs === null).assertFalse(); - let scrollPoint:Point = {x:400,y:400}; - await driver.mouseScroll(scrollPoint,true,4); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 4); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testCustomTabBar end'); @@ -648,8 +649,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:300,y:300}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 300, y: 300 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testArcSwiperAction end'); @@ -674,8 +675,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:300,y:300}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 300, y: 300 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testArcSwiperVertical end'); @@ -700,8 +701,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:300,y:300}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 300, y: 300 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testArcSwiperHorizontal end'); @@ -726,9 +727,9 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:300,y:300}; - await driver.mouseScroll(scrollPoint,true,2); - await driver.mouseScroll(scrollPoint,false,2); + let scrollPoint: Point = { x: 300, y: 300 }; + await driver.mouseScroll(scrollPoint, true, 2); + await driver.mouseScroll(scrollPoint, false, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testArcSwiperSideSlip end'); @@ -781,10 +782,10 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:300,y:300}; - let scrollPoint2:Point = {x:300,y:600}; - await driver.mouseScroll(scrollPoint,true,2); - await driver.mouseScroll(scrollPoint2,true,2); + let scrollPoint: Point = { x: 300, y: 300 }; + let scrollPoint2: Point = { x: 300, y: 600 }; + await driver.mouseScroll(scrollPoint, true, 2); + await driver.mouseScroll(scrollPoint2, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testArcSwiperStyles end'); @@ -809,8 +810,8 @@ export default function IndexTest() { let swiper = await driver.findComponent(ON.type('Swiper')); expect(swiper === null).assertFalse(); - let scrollPoint:Point = {x:400,y:500}; - await driver.mouseScroll(scrollPoint,true,2); + let scrollPoint: Point = { x: 400, y: 500 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testSwiperAndTabsLinkage end'); @@ -957,368 +958,237 @@ export default function IndexTest() { }) /** - * @tc.number UiTest_035 - * @tc.name testArcLongList - * @tc.desc 测试弧形长列表示例 + * @tc.number UiTest_034 + * @tc.name testListChatRoom + * @tc.desc 测试列表切换布局方向示例 */ - it('ArcLongList', 0, async (done: Function) => { - console.info('uitest: testArcLongList begin'); + it('ListChatRoom', 0, async (done: Function) => { + console.info('uitest: testListChatRoom begin'); let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('List', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.ArcLongList_title')); + let list = await driver.findComponent(ON.type('List')); + expect(list === null).assertFalse(); + await list.scrollToBottom(1000); + let str = await getResourceString($r('app.string.ListChatRoom_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(15000); + let textInput = await driver.findComponent(ON.type('TextInput')); + expect(textInput === null).assertFalse(); + await textInput.inputText("message test") + let testButton = await driver.findComponent(ON.text('发送', MatchPattern.CONTAINS)); + expect(testButton === null).assertFalse(); + await testButton.click(); + await driver.mouseClick({ x: 670, y: 700 }, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); + let nameText = await driver.findComponent(ON.text('message test', MatchPattern.CONTAINS)); + expect(nameText === null).assertFalse(); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testArcLongList end'); + console.info('uitest: testListChatRoom end'); done(); }) /** - * @tc.number UiTest_036 - * @tc.name testArcListAcrScrollBar - * @tc.desc 测试弧形列表外置滚动条示例 + * @tc.number UiTest_047 + * @tc.name testSwiperIgnoreComponentSize + * @tc.desc 测试设置圆点导航点间距和忽略导航点组件大小 */ - it('ArcListAcrScrollBar', 0, async (done: Function) => { - console.info('uitest: testArcListAcrScrollBar begin'); + it('SwiperIgnoreComponentSize', 0, async (done: Function) => { + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperIgnoreComponentSize begin'); let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Swiper', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListAcrScrollBar_title')); + let str = await getResourceString($r('app.string.SwiperIgnoreComponentSize_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testArcListAcrScrollBar end'); - done(); - }) + let spaceIndexButton = await driver.findComponent(ON.text('spaceIndex:', MatchPattern.CONTAINS)); + expect(spaceIndexButton === null).assertFalse(); + await spaceIndexButton.click(); + await spaceIndexButton.click(); + await spaceIndexButton.click(); - /** - * @tc.number UiTest_037 - * @tc.name testArcListBuiltInScrollerBar - * @tc.desc 测试弧形列表内置滚动条示例 - */ - it('arcListBuiltInScrollerBar', 0, async (done: Function) => { - console.info('uitest: testArcListBuiltInScrollerBar begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.arcListBuiltInScrollerBar_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); + let ignoreSizeIndexButton = await driver.findComponent(ON.text('ignoreSizeIndex:', MatchPattern.CONTAINS)); + expect(ignoreSizeIndexButton === null).assertFalse(); + await ignoreSizeIndexButton.click(); + await ignoreSizeIndexButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(); + let swiper = await driver.findComponent(ON.type('Swiper')); + expect(swiper === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 500 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testArcListBuiltInScrollerBar end'); + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperIgnoreComponentSize end'); done(); }) /** - * @tc.number UiTest_038 - * @tc.name testArcListContents - * @tc.desc 测试弧形列表内置滚动条示例 + * @tc.number UiTest_048 + * @tc.name testSwiperDigitIndicatorIgnoreComponentSize + * @tc.desc 测试设置数字导航点忽略导航点组件大小 */ - it('ArcListContents', 0, async (done: Function) => { - console.info('uitest: testArcListContents begin'); + it('SwiperDigitIndicatorIgnoreComponentSize', 0, async (done: Function) => { + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperDigitIndicatorIgnoreComponentSize begin'); let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Swiper', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListContents_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testArcListContents end'); - done(); - }) + let listComponent: Component = await driver.waitForComponent(ON.id('list_'), 1000); + let listCenter = await listComponent.getBoundsCenter(); + await driver.swipe(listCenter.x, listCenter.y + 400, listCenter.x, listCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); - /** - * @tc.number UiTest_039 - * @tc.name testArcListShow - * @tc.desc 测试弧形列表展示数据示例 - */ - it('ArcListShow', 0, async (done: Function) => { - console.info('uitest: testArcListShow begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListShow_title')); + let str = await getResourceString($r('app.string.SwiperDigitIndicatorIgnoreComponentSize_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(); + let swiper = await driver.findComponent(ON.type('Swiper')); + expect(swiper === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 500 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testArcListShow end'); + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperDigitIndicatorIgnoreComponentSize end'); done(); }) /** - * @tc.number UiTest_040 - * @tc.name testArcListStyles - * @tc.desc 测试弧形列表设置样式示例 + * @tc.number UiTest_049 + * @tc.name testSwiperPageSwitchMethod + * @tc.desc 测试页面的切换方式。 */ - it('ArcListStyles', 0, async (done: Function) => { - console.info('uitest: testArcListStyles begin'); + it('SwiperPageSwitchMethod', 0, async (done: Function) => { + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperPageSwitchMethod begin'); let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Swiper', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListStyles_title')); + let str = await getResourceString($r('app.string.SwiperPageSwitchMethod_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('List')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testArcListStyles end'); - done(); - }) - - /** - * @tc.number UiTest_041 - * @tc.name testArcListArcIndexerBar - * @tc.desc 测试弧形列表联动indexer示例 - */ - it('ArcListArcIndexerBar', 0, async (done: Function) => { - console.info('uitest: testArcListArcIndexerBar begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListArcIndexerBar_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); + let showNextButton = await driver.findComponent(ON.text('showNext', MatchPattern.CONTAINS)); + expect(showNextButton === null).assertFalse(); + await showNextButton.click(); - let button = await driver.findComponent(ON.type('Button')); - expect(button === null).assertFalse(); - await button.click(); - let testText = await driver.findComponent(ON.text('F', MatchPattern.CONTAINS)); - expect(testText === null).assertFalse(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - await arclist.scrollToBottom(5000); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testArcListArcIndexerBar end'); - done(); - }) + let showPreviousButton = await driver.findComponent(ON.text('showPrevious', MatchPattern.CONTAINS)); + expect(showPreviousButton === null).assertFalse(); + await showPreviousButton.click(); + await showPreviousButton.click(); - /** - * @tc.number UiTest_042 - * @tc.name testArcListSideSlip - * @tc.desc 测试弧形列表侧滑示例 - */ - it('ArcListSideSlip', 0, async (done: Function) => { - console.info('uitest: testArcListSideSlip begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.ArcListSideSlip_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); + let undefinedButton = await driver.findComponent(ON.text('undefined', MatchPattern.CONTAINS)); + expect(undefinedButton === null).assertFalse(); + await undefinedButton.click(); - let arclist = await driver.findComponent(ON.type('ArcList')); - expect(arclist === null).assertFalse(); - let scrollPoint:Point = {x:200,y:500}; - let scrollPoint2:Point = {x:500,y:500}; + let changeButton = await driver.findComponent(ON.text('changeIndex(', MatchPattern.CONTAINS)); + expect(changeButton === null).assertFalse(); + await changeButton.click(); - await driver.fling(scrollPoint2,scrollPoint,1,600); - let button = await driver.findComponent(ON.type('Button')); - expect(button === null).assertFalse(); - await button.click(); - let testText = await driver.findComponent(ON.text('Alice', MatchPattern.CONTAINS)); - expect(testText === null).assertTrue(); - await arclist.scrollToBottom(5000); + let swiper = await driver.findComponent(ON.type('Swiper')); + expect(swiper === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 500 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testArcListSideSlip end'); + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperPageSwitchMethod end'); done(); }) /** - * @tc.number UiTest_043 - * @tc.name testWaterFlowDynamicSwitchover - * @tc.desc 测试瀑布流动态切换列数示例 + * @tc.number UiTest_050 + * @tc.name testSwiperVisibleContentPosition + * @tc.desc 测试保存可见位置不变。 */ - it('WaterFlowDynamicSwitchover', 0, async (done: Function) => { - console.info('uitest: testWaterFlowDynamicSwitchover begin'); + it('SwiperVisibleContentPosition', 0, async (done: Function) => { + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperVisibleContentPosition begin'); let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Swiper', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.WaterFlowDynamicSwitchover_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('WaterFlow')); - expect(arclist === null).assertFalse(); - let flowItemText = await driver.findComponent(ON.text('FlowItem0', MatchPattern.CONTAINS)); - expect(flowItemText === null).assertFalse(); - let scrollPoint:Point = {x:350,y:1100}; - let scrollPoint2:Point = {x:350,y:550}; - await driver.fling(scrollPoint,scrollPoint2,1,1200); - let button = await driver.findComponent(ON.type('Button')); - expect(button === null).assertFalse(); - await button.click(); - let testText = await driver.findComponent(ON.text('N9', MatchPattern.CONTAINS)); - expect(testText === null).assertFalse(); - await driver.fling(scrollPoint,scrollPoint2,1,1200); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testWaterFlowDynamicSwitchover end'); - done(); - }) + let listComponent: Component = await driver.waitForComponent(ON.id('list_'), 1000); + let listCenter = await listComponent.getBoundsCenter(); + await driver.swipe(listCenter.x, listCenter.y + 400, listCenter.x, listCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); - /** - * @tc.number UiTest_044 - * @tc.name testWaterFlowGroupingMixing - * @tc.desc 测试瀑布流混合布局示例 - */ - it('WaterFlowGroupingMixing', 0, async (done: Function) => { - console.info('uitest: testWaterFlowGroupingMixing begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.WaterFlowGroupingMixing_title')); + let str = await getResourceString($r('app.string.SwiperVisibleContentPosition_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('WaterFlow')); - expect(arclist === null).assertFalse(); - let scrollPoint:Point = {x:350,y:1100}; - let scrollPoint2:Point = {x:350,y:550}; - await driver.fling(scrollPoint,scrollPoint2,1,1200); - await driver.pressBack(); - await driver.pressBack(); - console.info('uitest: testWaterFlowGroupingMixing end'); - done(); - }) + let addButton = await driver.findComponent(ON.text('header data add', MatchPattern.CONTAINS)); + expect(addButton === null).assertFalse(); + await addButton.click(); - /** - * @tc.number UiTest_045 - * @tc.name testWaterFlowInfiniteScrolling - * @tc.desc 测试瀑布流无限滑动触底增加示例 - */ - it('WaterFlowInfiniteScrolling', 0, async (done: Function) => { - console.info('uitest: testWaterFlowInfiniteScrolling begin'); - let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); - expect(componentButton === null).assertFalse(); - await componentButton.click(); - let str = await getResourceString($r('app.string.WaterFlowInfiniteScrolling_title')); - let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); - expect(sampleButton === null).assertFalse(); - await sampleButton.click(); + let deleteButton = await driver.findComponent(ON.text('header data delete', MatchPattern.CONTAINS)); + expect(deleteButton === null).assertFalse(); + await deleteButton.click(); - let arclist = await driver.findComponent(ON.type('WaterFlow')); - expect(arclist === null).assertFalse(); - let scrollPoint:Point = {x:350,y:1100}; - let scrollPoint2:Point = {x:350,y:550}; - await driver.fling(scrollPoint,scrollPoint2,1,1200); + let swiper = await driver.findComponent(ON.type('Swiper')); + expect(swiper === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 500 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testWaterFlowInfiniteScrolling end'); + hilog.info(DOMAIN, 'testTag', 'uitest: testSwiperVisibleContentPosition end'); done(); }) /** - * @tc.number UiTest_046 - * @tc.name testWaterFlowInfiniteScrollingEarly - * @tc.desc 测试瀑布流无限滑动提前增加示例 + * @tc.number UiTest_51 + * @tc.name testBottomTabBar + * @tc.desc 内容标签不同步 */ - it('WaterFlowInfiniteScrollingEarly', 0, async (done: Function) => { - console.info('uitest: testWaterFlowInfiniteScrollingEarly begin'); + it('testBottomTabBar', 0, async (done: Function) => { let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Tabs', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let str = await getResourceString($r('app.string.WaterFlowInfiniteScrollingEarly_title')); + let str = await getResourceString($r('app.string.ContentWillChange_titleContentOnAndTabSync')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let arclist = await driver.findComponent(ON.type('WaterFlow')); - expect(arclist === null).assertFalse(); - let scrollPoint:Point = {x:350,y:1100}; - let scrollPoint2:Point = {x:350,y:550}; - await driver.fling(scrollPoint,scrollPoint2,1,1200); + let tabs = await driver.findComponent(ON.type('Tabs')); + expect(tabs === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testWaterFlowInfiniteScrollingEarly end'); done(); }) /** - * @tc.number UiTest_034 - * @tc.name testListChatRoom - * @tc.desc 测试列表切换布局方向示例 + * @tc.number UiTest_51 + * @tc.name testBottomTabBar + * @tc.desc 缓存数 */ - it('ListChatRoom', 0, async (done: Function) => { - console.info('uitest: testListChatRoom begin'); + it('testBottomTabBar', 0, async (done: Function) => { let driver = Driver.create(); - let componentButton = await driver.findComponent(ON.text('List', MatchPattern.CONTAINS)); + let componentButton = await driver.findComponent(ON.text('Tabs', MatchPattern.CONTAINS)); expect(componentButton === null).assertFalse(); await componentButton.click(); - let list = await driver.findComponent(ON.type('List')); - expect(list === null).assertFalse(); - await list.scrollToBottom(1000); - let str = await getResourceString($r('app.string.ListChatRoom_title')); + let str = await getResourceString($r('app.string.Cache_count')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let textInput = await driver.findComponent(ON.type('TextInput')); - expect(textInput === null).assertFalse(); - await textInput.inputText("message test") - let testButton = await driver.findComponent(ON.text('发送', MatchPattern.CONTAINS)); - expect(testButton === null).assertFalse(); - await testButton.click(); - await driver.mouseClick({x: 670, y: 700}, MouseButton.MOUSE_BUTTON_LEFT, 0, 0); - let nameText = await driver.findComponent(ON.text('message test', MatchPattern.CONTAINS)); - expect(nameText === null).assertFalse(); + let tabs = await driver.findComponent(ON.type('Tabs')); + expect(tabs === null).assertFalse(); + let scrollPoint: Point = { x: 400, y: 400 }; + await driver.mouseScroll(scrollPoint, true, 2); await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testListChatRoom end'); done(); }) - }) } \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index1.test.ets b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index1.test.ets new file mode 100644 index 000000000..1f6af14be --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/index1.test.ets @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2025 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 { describe, it, expect, beforeAll } from '@ohos/hypium'; + +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON, MouseButton, MatchPattern, UiDirection, Component } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; +import { Point } from '@ohos.UiTest'; +import { hilog } from '@kit.PerformanceAnalysisKit'; + +const DOMAIN = 0x0000; +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +let want: Want; + +async function getResourceString(resource: Resource): Promise { + let manage = abilityDelegator.getAppContext().resourceManager; + let textString: string = await manage.getStringValue(resource); + return textString; +} + +export default function Index1Test() { + describe('Index1Test', () => { + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + let driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * @tc.number UiTest_041 + * @tc.name testArcListArcIndexerBar + * @tc.desc 测试弧形列表联动indexer示例 + */ + it('ArcListArcIndexerBar', 0, async (done: Function) => { + console.info('uitest: testArcListArcIndexerBar begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListArcIndexerBar_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let button = await driver.findComponent(ON.type('Button')); + expect(button === null).assertFalse(); + await button.click(); + let testText = await driver.findComponent(ON.text('F', MatchPattern.CONTAINS)); + expect(testText === null).assertFalse(); + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(5000); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListArcIndexerBar end'); + done(); + }) + + /** + * @tc.number UiTest_035 + * @tc.name testArcLongList + * @tc.desc 测试弧形长列表示例 + */ + it('ArcLongList', 0, async (done: Function) => { + console.info('uitest: testArcLongList begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let list = await driver.findComponent(ON.type('List')); + expect(list === null).assertFalse(); + await list.scrollToBottom(2400); + let str = await getResourceString($r('app.string.ArcLongList_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(30000); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcLongList end'); + done(); + }) + + /** + * @tc.number UiTest_036 + * @tc.name testArcListAcrScrollBar + * @tc.desc 测试弧形列表外置滚动条示例 + */ + it('ArcListAcrScrollBar', 0, async (done: Function) => { + console.info('uitest: testArcListAcrScrollBar begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListAcrScrollBar_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListAcrScrollBar end'); + done(); + }) + + /** + * @tc.number UiTest_037 + * @tc.name testArcListBuiltInScrollerBar + * @tc.desc 测试弧形列表内置滚动条示例 + */ + it('arcListBuiltInScrollerBar', 0, async (done: Function) => { + console.info('uitest: testArcListBuiltInScrollerBar begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.arcListBuiltInScrollerBar_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListBuiltInScrollerBar end'); + done(); + }) + + /** + * @tc.number UiTest_038 + * @tc.name testArcListContents + * @tc.desc 测试弧形列表迭代弧形列表内容示例 + */ + it('ArcListContents', 0, async (done: Function) => { + console.info('uitest: testArcListContents begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListContents_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListContents end'); + done(); + }) + + /** + * @tc.number UiTest_039 + * @tc.name testArcListShow + * @tc.desc 测试弧形列表展示数据示例 + */ + it('ArcListShow', 0, async (done: Function) => { + console.info('uitest: testArcListShow begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListShow_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListShow end'); + done(); + }) + + /** + * @tc.number UiTest_040 + * @tc.name testArcListStyles + * @tc.desc 测试弧形列表设置样式示例 + */ + it('ArcListStyles', 0, async (done: Function) => { + console.info('uitest: testArcListStyles begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListStyles_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('List')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListStyles end'); + done(); + }) + + /** + * @tc.number UiTest_042 + * @tc.name testArcListSideSlip + * @tc.desc 测试弧形列表侧滑示例 + */ + it('ArcListSideSlip', 0, async (done: Function) => { + console.info('uitest: testArcListSideSlip begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.ArcListSideSlip_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let testText = await driver.findComponent(ON.text('Alice', MatchPattern.CONTAINS)); + expect(testText === null).assertFalse(); + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(5000); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testArcListSideSlip end'); + done(); + }) + + /** + * @tc.number UiTest_047 + * @tc.name testArcListCrown + * @tc.desc 测试弧形列表响应旋转表冠示例 + */ + it('ArcListCrown', 0, async (done: Function) => { + console.info('=====>uitest: testArcListCrown begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + await driver.swipe(100, 1000, 500, 400); + let str = await getResourceString($r('app.string.ArcListCrown_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('=====>uitest: testArcListCrown end'); + done(); + }) + + /** + * @tc.number UiTest_048 + * @tc.name testArcListCreate + * @tc.desc 测试弧形列表创建弧形列表示例 + */ + it('ArcListCreate', 0, async (done: Function) => { + console.info('=====>uitest: testArcListCreate begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('ArcList', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let list = await driver.findComponent(ON.type('List')); + expect(list === null).assertFalse(); + await list.scrollToBottom(1000); + let str = await getResourceString($r('app.string.ArcListCreate_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let arclist = await driver.findComponent(ON.type('ArcList')); + expect(arclist === null).assertFalse(); + await arclist.scrollToBottom(); + await driver.pressBack(); + await driver.pressBack(); + console.info('=====>uitest: testArcListCreate end'); + done(); + }) + + /** + * @tc.number UiTest_043 + * @tc.name testWaterFlowDynamicSwitchover + * @tc.desc 测试瀑布流动态切换列数示例 + */ + it('WaterFlowDynamicSwitchover', 0, async (done: Function) => { + console.info('uitest: testWaterFlowDynamicSwitchover begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.WaterFlowDynamicSwitchover_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('WaterFlow')); + if (arclist === null) { + console.log("=====> arclist is null"); + } + expect(arclist === null).assertFalse(); + let flowItemText = await driver.findComponent(ON.text('FlowItem0', MatchPattern.CONTAINS)); + if (flowItemText === null) { + console.log("=====> flowItemText is null"); + } + expect(flowItemText === null).assertFalse(); + let scrollPoint: Point = { x: 350, y: 1100 }; + let scrollPoint2: Point = { x: 350, y: 550 }; + await driver.fling(scrollPoint, scrollPoint2, 1, 2000); + let button = await driver.findComponent(ON.type('Button')); + if (button === null) { + console.log("=====> button is null"); + } + expect(button === null).assertFalse(); + await button.click(); + + let testText = await driver.findComponent(ON.text('N9', MatchPattern.CONTAINS)); + if (testText === null) { + console.log("=====> testText is null"); + } + expect(testText === null).assertFalse(); + await driver.fling(scrollPoint, scrollPoint2, 1, 1200); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testWaterFlowDynamicSwitchover end'); + done(); + }) + + /** + * @tc.number UiTest_044 + * @tc.name testWaterFlowGroupingMixing + * @tc.desc 测试瀑布流混合布局示例 + */ + it('WaterFlowGroupingMixing', 0, async (done: Function) => { + console.info('uitest: testWaterFlowGroupingMixing begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.WaterFlowGroupingMixing_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('WaterFlow')); + expect(arclist === null).assertFalse(); + let scrollPoint: Point = { x: 350, y: 1100 }; + let scrollPoint2: Point = { x: 350, y: 550 }; + await driver.fling(scrollPoint, scrollPoint2, 1, 1200); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testWaterFlowGroupingMixing end'); + done(); + }) + + /** + * @tc.number UiTest_045 + * @tc.name testWaterFlowInfiniteScrolling + * @tc.desc 测试瀑布流无限滑动触底增加示例 + */ + it('WaterFlowInfiniteScrolling', 0, async (done: Function) => { + console.info('uitest: testWaterFlowInfiniteScrolling begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.WaterFlowInfiniteScrolling_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('WaterFlow')); + expect(arclist === null).assertFalse(); + let scrollPoint: Point = { x: 350, y: 1100 }; + let scrollPoint2: Point = { x: 350, y: 550 }; + await driver.fling(scrollPoint, scrollPoint2, 1, 1200); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testWaterFlowInfiniteScrolling end'); + done(); + }) + + /** + * @tc.number UiTest_046 + * @tc.name testWaterFlowInfiniteScrollingEarly + * @tc.desc 测试瀑布流无限滑动提前增加示例 + */ + it('WaterFlowInfiniteScrollingEarly', 0, async (done: Function) => { + console.info('uitest: testWaterFlowInfiniteScrollingEarly begin'); + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('WaterFlow', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let str = await getResourceString($r('app.string.WaterFlowInfiniteScrollingEarly_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let arclist = await driver.findComponent(ON.type('WaterFlow')); + expect(arclist === null).assertFalse(); + let scrollPoint: Point = { x: 350, y: 1100 }; + let scrollPoint2: Point = { x: 350, y: 550 }; + await driver.fling(scrollPoint, scrollPoint2, 1, 1200); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testWaterFlowInfiniteScrollingEarly end'); + done(); + }) + }) +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/indexAdd.test.ets b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/indexAdd.test.ets new file mode 100644 index 000000000..25ce98c88 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/ets/test/indexAdd.test.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 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 { describe, it, expect, beforeAll, Level } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON, MouseButton,MatchPattern, UiDirection } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; +import { Point } from '@ohos.UiTest'; + + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +let want: Want; + +async function getResourceString(resource: Resource): Promise { + let manage = abilityDelegator.getAppContext().resourceManager; + let textString: string = await manage.getStringValue(resource); + return textString; +} + +export default function IndexTest() { + describe('IndexTestAdd', () => { + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + let driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + /** + * @tc.number UiTest_001 + * @tc.name SlidingHandEvent + * @tc.desc 支持滑动离手事件 + */ + it('SlidingHandEvent', Level.LEVEL1, async (done: Function) => { + let driver = Driver.create(); + let componentButton = await driver.findComponent(ON.text('List', MatchPattern.CONTAINS)); + expect(componentButton === null).assertFalse(); + await componentButton.click(); + let list = await driver.findComponent(ON.type('List')); + expect(list === null).assertFalse(); + await list.scrollToBottom(1000); + let str = await getResourceString($r('app.string.Sliding_Hand_Event')); + let openModel = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + await openModel.click() + await driver.delayMs(1000) + await driver.pressBack(); + await driver.pressBack(); + done(); + }) + }) +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/entry/src/ohosTest/syscap.json b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/syscap.json new file mode 100644 index 000000000..f6d8139cd --- /dev/null +++ b/ArkUIKit/ScrollableComponent/entry/src/ohosTest/syscap.json @@ -0,0 +1,18 @@ +{ + "devices": { + "general": [ + "default", + "tablet" + ], + "custom": [ + { + "xts": [ + "SystemCapability.ArkUI.ArkUI.Full", + "SystemCapability.ArkUI.ArkUI.Circle", + "SystemCapability.Security.DeviceSecurityLevel", + "SystemCapability.UserIAM.UserAuth.PinAuth" + ] + } + ] + } +} \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/ohosTest.md b/ArkUIKit/ScrollableComponent/ohosTest.md new file mode 100644 index 000000000..5d1a0f1f5 --- /dev/null +++ b/ArkUIKit/ScrollableComponent/ohosTest.md @@ -0,0 +1,27 @@ +# Navigation 测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +|-----------------------| -------------- |-------------------------------------------|-----------------------| :------- | -------- | +| 测试弧形列表联动indexer示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形长列表示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表外置滚动条示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表内置滚动条示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表迭代弧形列表内容示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表展示数据示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表设置样式示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表侧滑示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表响应旋转表冠示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试弧形列表创建弧形列表示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试瀑布流动态切换列数示例 | 设备正常运行 | 进入各个示例页面,push页面,点击切换列数按钮,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试瀑布流混合布局示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉到页面底部,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试瀑布流无限滑动触底增加示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉页面,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试瀑布流无限滑动提前增加示例 | 设备正常运行 | 进入各个示例页面,push页面,下拉页面,然后返回 | 页面跳转,滑动页面正常 | 是 | Pass | +| 测试设置圆点导航点间距和忽略导航点组件大小 | 设备正常运行 | 进入swiper页面,再进入 设置圆点导航点间距,点击按钮设置不同的间距,然后返回 | 页面上swiper组件的导航点间距发生变化 | 是 | Pass | +| 测试设置数字导航点忽略导航点组件大小 | 设备正常运行 | 进入swiper页面,再进入 设置数字导航点忽略导航点组件大小,然后返回 | 页面上swiper组件的数字导航显示正常 | 是 | Pass | +| 测试页面的切换方式 | 设备正常运行 | 进入swiper页面,再进入 页面切换方式,点击不同的按钮,然后返回 | 页面上swiper组件的页面切换正常 | 是 | Pass | +| 测试保存可见位置不变 | 设备正常运行 | 进入swiper页面,再进入 保持可见位置不变 点击添加和删除页面的按钮,然后返回 | 页面上swiper组件的页面显示不变,正常 | 是 | Pass | +| 测试保存可见位置不变 | 设备正常运行 | 进入swiper页面,再进入 保持可见位置不变 点击添加和删除页面的按钮,然后返回 | 页面上swiper组件的页面显示不变,正常 | 是 | Pass | +| 测试打开缓存数页面 | 设备正常运行 | 进入示例页面,点击各个tab,然后返回 | 页面上tab标签切换正常 | 是 | Pass | +| 测试打开标签与内容不联动页面 | 设备正常运行 | 进入示例页面,点击各个tab,然后返回 | 页面上tab标签切换正常 | 是 | Pass | \ No newline at end of file diff --git a/ArkUIKit/ScrollableComponent/screenshots/device/image4.jpeg b/ArkUIKit/ScrollableComponent/screenshots/device/image4.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..dcbf54041e1e36458bc42990c428724fdbc77d02 GIT binary patch literal 28002 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 literal 0 HcmV?d00001 diff --git a/ArkUIKit/ScrollableComponent/screenshots/device/image5.jpeg b/ArkUIKit/ScrollableComponent/screenshots/device/image5.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6ff28be287aeed036425811bb627b49a09d3ed22 GIT binary patch literal 36505 zcmeFa2UJu|mo9wBQ4q-)0R@SYa}vptlpIAsLJNq1WSSsBqJV(poRlC)lQT$EK(b_- z3<6DVpy~eG_e*nU&CH$o?>BSbyB5u=a~9pz=hUuKwd>h?KeZb*jamY3sw=B00~i

kIVlAr9WxUn9RmXkJ0AxND-Rn3 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 PWySy1_