 应用 waPC (rust) 做软件测试工具第三届中国 Rust 开发者大会 应用 waPC (rust) 做软件测试工具 Alan poon 潘泳权 大家好! @rustropy_gaming ruito_89 PhoTto / image / chart Webassembly Procedures Call waPC 协议标准化了本机代码调用 WebAssembly 和 WebAssembly 调用本机代码的通信 (messaging) Microservices • Multiple backend product line with complex upstream • Common testing platform 大公司抓包工具的需求 软件测试工具 • 模拟数据规则 • 自动化测试 • Supports http/https/tcp/websocket(MITM) • Can use rust to construct own wasm API • Support websocket stand in for wasm API 抓包 - Wasm Mock Server wasm 工具 does not invent the wheel 软件测试工具 • 模拟数据规则 • 自动化测试 ModifyRequest(req *http.Request) error{ … req_,err:=wasm.Invoke(ctx0 码力 | 30 页 | 2.50 MB | 1 年前3 应用 waPC (rust) 做软件测试工具第三届中国 Rust 开发者大会 应用 waPC (rust) 做软件测试工具 Alan poon 潘泳权 大家好! @rustropy_gaming ruito_89 PhoTto / image / chart Webassembly Procedures Call waPC 协议标准化了本机代码调用 WebAssembly 和 WebAssembly 调用本机代码的通信 (messaging) Microservices • Multiple backend product line with complex upstream • Common testing platform 大公司抓包工具的需求 软件测试工具 • 模拟数据规则 • 自动化测试 • Supports http/https/tcp/websocket(MITM) • Can use rust to construct own wasm API • Support websocket stand in for wasm API 抓包 - Wasm Mock Server wasm 工具 does not invent the wheel 软件测试工具 • 模拟数据规则 • 自动化测试 ModifyRequest(req *http.Request) error{ … req_,err:=wasm.Invoke(ctx0 码力 | 30 页 | 2.50 MB | 1 年前3
 基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺Flight 的物联网和时序数据传输及 转换工具 霍琳贺 涛思数据 Rust China Conf 2023 CONTENTS 自 我 介 绍 T D e n g i n e t a o s X R u s t 使 用 TDengine Rust • OOXML - Excel 解析库 • xlsx2csv - Excel 转 CSV 工具 • Unqlite - 单文件非关系型数据库 Multi-address DSN(Data Source Name) parser. TDengine 应用开发组 • Python/Rust/Go 连接器 • 数据可视化 • 数据库运维工具 • 第三方数据源接入 • BI 系统接入 https://taosdata.com/ https://github.com/zitsen CONTENTS 自 我 介 绍 T D e n g i n e t a o s X R u s t 使 用 Why Rust ? • 安全性 • 高性能 • 跨平台兼容 • 强大的类型系统和抽象表达能力 • 优秀的 Rust 生态和开发工具链 • C FFI 互操作能力 • async/await 异步编程 Rust - Crates Used in taosX • Async runtime: https://crates.io/crates/tokio0 码力 | 29 页 | 2.26 MB | 1 年前3 基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺Flight 的物联网和时序数据传输及 转换工具 霍琳贺 涛思数据 Rust China Conf 2023 CONTENTS 自 我 介 绍 T D e n g i n e t a o s X R u s t 使 用 TDengine Rust • OOXML - Excel 解析库 • xlsx2csv - Excel 转 CSV 工具 • Unqlite - 单文件非关系型数据库 Multi-address DSN(Data Source Name) parser. TDengine 应用开发组 • Python/Rust/Go 连接器 • 数据可视化 • 数据库运维工具 • 第三方数据源接入 • BI 系统接入 https://taosdata.com/ https://github.com/zitsen CONTENTS 自 我 介 绍 T D e n g i n e t a o s X R u s t 使 用 Why Rust ? • 安全性 • 高性能 • 跨平台兼容 • 强大的类型系统和抽象表达能力 • 优秀的 Rust 生态和开发工具链 • C FFI 互操作能力 • async/await 异步编程 Rust - Crates Used in taosX • Async runtime: https://crates.io/crates/tokio0 码力 | 29 页 | 2.26 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 22.4. D - 实用开发工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 团队协作而言,非常高效的 工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测 试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒 绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间 集中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: • Cargo 是内0 码力 | 562 页 | 3.23 MB | 25 天前3 Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 22.4. D - 实用开发工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 团队协作而言,非常高效的 工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测 试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒 绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间 集中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: • Cargo 是内0 码力 | 562 页 | 3.23 MB | 25 天前3
 Rust 程序设计语言简体中文版................................................................................ 590 21.4. D - 实用开发工具 .................................................................................................. 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 也为系统编程世界带来了现代化的开发工具: • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 • Rustfmt 格式化工具确保开发者遵循一致的代码风格。 • Rust Language Server 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功 能。 通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版................................................................................ 590 21.4. D - 实用开发工具 .................................................................................................. 昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了伴你一路同行的友好、精良的工具。想 要 “深入” 底层控制的程序员可以使用 Rust,无需时刻担心出现崩溃或安全漏洞,也无需因为 工具链不靠谱而被迫去了解其中的细节。更妙的是,语言设计本身会自然而然地引导你编写出 可靠的代码,并且运行速度和内存使用上都十分高效。 已经在从事编写底层代码的程序员可以使用 也为系统编程世界带来了现代化的开发工具: • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 • Rustfmt 格式化工具确保开发者遵循一致的代码风格。 • Rust Language Server 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功 能。 通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。0 码力 | 600 页 | 12.99 MB | 1 年前3
 Comprehensive Rust(简体中文) 202412332 64.1 加入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 64.2 选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 65 关于 async/await 帮助你全面理解 Rust 的语法和语言。 • 让你可以用 Rust 修改现有程序和编写新程序。 • 为你展示常见的 Rust 习惯用法。 我们将前四天的课程称为“Rust 基础”。 在此基础上,你可以选择深入研究一个或多个专门的主题: • Android:为期半天的课程,介绍如何在 Android 平台开发中使用 Rust(AOSP)。课程内容包括 与 C、C++ 和 Java 的互操作性。 • @johnathan79717。 • Korean by @keispace, @jiyongp, @jooyunghan, and @namhyung. • 西班牙语版本译者:@deavid。 使用右上角的语言选择器切换语言。 未完成的翻译 还有很多语言版本仍在翻译中。以下是最近更新的翻译版本的链接: • 孟加拉语版本译者:@raselmandol。 • 法语版本译者:@KookaS 和@vcaen。0 码力 | 359 页 | 1.33 MB | 10 月前3 Comprehensive Rust(简体中文) 202412332 64.1 加入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 64.2 选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 65 关于 async/await 帮助你全面理解 Rust 的语法和语言。 • 让你可以用 Rust 修改现有程序和编写新程序。 • 为你展示常见的 Rust 习惯用法。 我们将前四天的课程称为“Rust 基础”。 在此基础上,你可以选择深入研究一个或多个专门的主题: • Android:为期半天的课程,介绍如何在 Android 平台开发中使用 Rust(AOSP)。课程内容包括 与 C、C++ 和 Java 的互操作性。 • @johnathan79717。 • Korean by @keispace, @jiyongp, @jooyunghan, and @namhyung. • 西班牙语版本译者:@deavid。 使用右上角的语言选择器切换语言。 未完成的翻译 还有很多语言版本仍在翻译中。以下是最近更新的翻译版本的链接: • 孟加拉语版本译者:@raselmandol。 • 法语版本译者:@KookaS 和@vcaen。0 码力 | 359 页 | 1.33 MB | 10 月前3
 Rust 语言学习笔记.................................................................................7 第一章 包管理系统与版本管理工具................................................................9 1.1 Crate ..................... 8 pub restricted ..................................................................... 15 1.3 版本管理工具 .............................................................................. 15 1.4 rust 编译运行 阱。即使谨慎的实 践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍,其消除了旧的陷阱并提供了伴你一路同行的友好、精良 的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需冒着常见的崩 溃或安全漏洞的风险,也无需学习时常改变的工具链的最新知识。其语言本身 更是被设计为自然而然的引导你编写出在运行速度和内存使用上都十分高效的 可靠代码。 参考: https://rustcc0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记.................................................................................7 第一章 包管理系统与版本管理工具................................................................9 1.1 Crate ..................... 8 pub restricted ..................................................................... 15 1.3 版本管理工具 .............................................................................. 15 1.4 rust 编译运行 阱。即使谨慎的实 践者,亦唯恐代码出现漏洞、崩溃或损坏。 Rust 破除了这些障碍,其消除了旧的陷阱并提供了伴你一路同行的友好、精良 的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需冒着常见的崩 溃或安全漏洞的风险,也无需学习时常改变的工具链的最新知识。其语言本身 更是被设计为自然而然的引导你编写出在运行速度和内存使用上都十分高效的 可靠代码。 参考: https://rustcc0 码力 | 117 页 | 2.24 MB | 1 年前3
 Hello 算法 1.1.0 Rust版AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图0 码力 | 388 页 | 18.50 MB | 1 年前3 Hello 算法 1.1.0 Rust版AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图0 码力 | 388 页 | 18.50 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图0 码力 | 387 页 | 18.51 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Rust 版AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 代的计数方法和工具制作步骤等。随着文明的进步,算法逐渐变得更加精细和复杂。从巧夺天工的匠人技艺、 到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 对数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图0 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.0.0 Rust版11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 � 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 章 前言 hello‑algo.com 9 图 0‑8 算法学习路线 0.3 小结 ‧ 本书的主要受众是算法初学者。如果你已有一定基础,本书能帮助你系统回顾算法知识,书中源代码也 可作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构和算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书至关重要,可以少走许多弯路。 ‧ 书中的动画图解通常用于0 码力 | 383 页 | 17.61 MB | 1 年前3 Hello 算法 1.0.0 Rust版11.1 排序算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 11.2 选择排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 11.3 冒泡排序 . 数据结构与算法有模糊的认识,在会与 不会之间反复横跳,那么本书正是为你量身定制的! 如果你已经积累一定的刷题量,熟悉大部分题型,那么本书可助你回顾与梳理算法知识体系,仓库源代码可 以当作“刷题工具库”或“算法字典”来使用。 若你是算法“大神”,我们期待收到你的宝贵建议,或者一起参与创作。 � 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 章 前言 hello‑algo.com 9 图 0‑8 算法学习路线 0.3 小结 ‧ 本书的主要受众是算法初学者。如果你已有一定基础,本书能帮助你系统回顾算法知识,书中源代码也 可作为“刷题工具库”使用。 ‧ 书中内容主要包括复杂度分析、数据结构和算法三部分,涵盖了该领域的大部分主题。 ‧ 对于算法新手,在初学阶段阅读一本入门书至关重要,可以少走许多弯路。 ‧ 书中的动画图解通常用于0 码力 | 383 页 | 17.61 MB | 1 年前3
 KCL: Rust 在编译器领域的实践与探索利用Kubernetes和云的混合能力,通过端到端的交付工作 流程,真正实现集中定义、随处交付。 KusionStack 架构 • KCL:面向应用研发者的 配置策略专用高级编程语 言,及其协议组,工具链及 IDE 插件 • Kusion:运维引擎、工具 链、服务层,IDE 工作空间 及社区技术集成套件 • Konfig:应用配置及基础 模型共享仓库,及面向 GitOps 工作流程(如 GitHub Actions)的自定义 性能问题 无法满足自动化系统需求 稳定性问题 None 空对象,属性不存在等运行时错误 我们遇到了哪些问题? 1. Go, Python, Rust 性能对比 为什么选择 Rust? > https://github.com/Peefy/StackMachine CPython RustPython GPython VM(go) VM(Rust) VM(Python) 177s 0.739s 0.304s 0.282s 0.283s 13.32s N/A 2. 越来越多的基础设施选择 Rust 3. 更好的性能和稳定性 4. 通过 FFI 暴露 C API 供多语言使用和扩展、方便集成 5. WASM 支持友好 6. 智能合约语言? 为什么选择 Rust? 03 重写的收益 稳定性和性能提升 IDE:用户体验提升 源于 Rust 强大的编译检查和错误0 码力 | 25 页 | 3.50 MB | 1 年前3 KCL: Rust 在编译器领域的实践与探索利用Kubernetes和云的混合能力,通过端到端的交付工作 流程,真正实现集中定义、随处交付。 KusionStack 架构 • KCL:面向应用研发者的 配置策略专用高级编程语 言,及其协议组,工具链及 IDE 插件 • Kusion:运维引擎、工具 链、服务层,IDE 工作空间 及社区技术集成套件 • Konfig:应用配置及基础 模型共享仓库,及面向 GitOps 工作流程(如 GitHub Actions)的自定义 性能问题 无法满足自动化系统需求 稳定性问题 None 空对象,属性不存在等运行时错误 我们遇到了哪些问题? 1. Go, Python, Rust 性能对比 为什么选择 Rust? > https://github.com/Peefy/StackMachine CPython RustPython GPython VM(go) VM(Rust) VM(Python) 177s 0.739s 0.304s 0.282s 0.283s 13.32s N/A 2. 越来越多的基础设施选择 Rust 3. 更好的性能和稳定性 4. 通过 FFI 暴露 C API 供多语言使用和扩展、方便集成 5. WASM 支持友好 6. 智能合约语言? 为什么选择 Rust? 03 重写的收益 稳定性和性能提升 IDE:用户体验提升 源于 Rust 强大的编译检查和错误0 码力 | 25 页 | 3.50 MB | 1 年前3
共 34 条
- 1
- 2
- 3
- 4













