M2LOrder情感分析服务快速体验:WebUI与API调用详解
1. 引言:让机器读懂你的心情
你有没有想过,机器能理解你的喜怒哀乐吗?当你在社交媒体上发了一句“今天真是糟糕透了”,系统能不能判断出你此刻的心情是悲伤还是愤怒?这就是情感分析技术正在做的事情。
M2LOrder就是一个专门做这件事的工具。它不是一个复杂的算法框架,而是一个开箱即用的服务。你不需要懂深度学习,也不需要自己训练模型,只需要把它部署起来,就能通过简单的Web界面或者几行代码,让机器帮你分析文本中的情感。
这篇文章会带你从零开始,快速上手M2LOrder。我会用最直白的方式,告诉你这个服务能做什么、怎么用、效果怎么样。无论你是开发者想集成情感分析功能,还是产品经理想了解技术可行性,都能在这里找到答案。
2. 快速部署:三种方式任你选
M2LOrder的部署非常简单,提供了三种启动方式,你可以根据自己的习惯选择。
2.1 方式一:一键脚本启动(推荐新手)
如果你不想折腾,就用这个方法。只需要一条命令:
cd /root/m2lorder ./start.sh这个脚本会自动帮你启动所有服务。启动后,你会看到类似这样的输出,说明服务已经正常运行了:
Starting M2LOrder services... API server started on http://0.0.0.0:8001 WebUI started on http://0.0.0.0:78612.2 方式二:Supervisor管理(推荐生产环境)
如果你希望服务能自动重启、方便管理,可以用Supervisor。Supervisor就像个管家,会帮你看着服务,如果服务意外停止了,它会自动重新启动。
cd /root/m2lorder # 启动Supervisor管理服务 supervisord -c supervisor/supervisord.conf # 查看服务状态 supervisorctl -c supervisor/supervisord.conf status查看状态时,你会看到类似这样的信息:
m2lorder-api RUNNING pid 1234, uptime 0:00:30 m2lorder-webui RUNNING pid 1235, uptime 0:00:302.3 方式三:手动启动(适合调试)
如果你想了解服务启动的细节,或者需要调试,可以手动启动:
cd /root/m2lorder source /opt/miniconda3/etc/profile.d/conda.sh conda activate torch28 # 启动API服务(在第一个终端) python -m uvicorn app.api.main:app --host 0.0.0.0 --port 8001 # 启动WebUI服务(在第二个终端) python app.webui.main.py手动启动的好处是你能看到实时的日志输出,方便排查问题。
3. 访问服务:两个入口都能用
服务启动后,你有两种方式可以使用它:
| 服务类型 | 访问地址 | 适合人群 |
|---|---|---|
| WebUI界面 | http://你的服务器IP:7861 | 非技术人员、快速测试 |
| API接口 | http://你的服务器IP:8001 | 开发者、系统集成 |
| API文档 | http://你的服务器IP:8001/docs | 查看接口详情 |
如果你在本地部署,IP就是127.0.0.1或localhost。如果在云服务器上,需要换成服务器的公网IP。
打开WebUI界面,你会看到一个简洁的页面,左边是模型选择,中间是输入框,右边是结果展示区域。界面设计得很直观,一看就知道怎么用。
4. WebUI使用:点点鼠标就能分析情感
WebUI界面让情感分析变得像填表格一样简单。我来带你一步步操作。
4.1 第一步:选择模型
在页面左侧,你会看到一个“模型列表”下拉框。点击它,会看到很多模型选项,比如A001、A002等等。
这些模型有什么区别呢?简单来说:
- 小模型(3-8MB):速度快,适合实时分析
- 大模型(600MB+):精度高,适合对准确度要求高的场景
如果你是第一次用,建议选A001或A002,这些都是轻量级模型,响应很快。
4.2 第二步:输入文本分析
在“输入文本”框中,输入你想分析的句子。比如:
- “今天天气真好,心情特别愉快!”
- “这个产品太难用了,让我很生气。”
- “明天要考试了,有点紧张。”
然后点击“ 开始分析”按钮。几秒钟后,右边就会显示分析结果。
结果会告诉你:
- 情感类型:比如
happy(开心)、sad(悲伤)、angry(生气)等 - 置信度:一个0到1之间的数字,表示模型对这个判断的把握有多大
- 颜色标记:不同情感会用不同颜色高亮显示
4.3 第三步:批量分析多段文本
如果你有很多文本需要分析,不用一个个输入。在“批量输入”框中,每行输入一段文本,然后点击“ 批量分析”按钮。
比如输入:
今天收到了礼物,很开心 工作压力太大了 期待周末的旅行系统会一次性分析所有文本,并以表格形式展示结果,非常方便。
4.4 情感类型说明
M2LOrder能识别6种基本情感,每种都有对应的颜色:
| 情感类型 | 英文 | 颜色 | 示例 |
|---|---|---|---|
| 开心 | happy | 绿色 | “今天真高兴!” |
| 悲伤 | sad | 蓝色 | “我感到很难过” |
| 生气 | angry | 红色 | “这太让人生气了!” |
| 平静 | neutral | 灰色 | “今天没什么特别的事” |
| 兴奋 | excited | 橙色 | “太棒了!等不及了!” |
| 焦虑 | anxious | 紫色 | “我有点担心明天的会议” |
5. API调用:让程序也能理解情感
如果你想把情感分析功能集成到自己的程序里,API接口就是最好的选择。M2LOrder提供了完整的RESTful API,支持各种编程语言调用。
5.1 基础准备:检查服务状态
在调用API前,先确认服务是否正常:
curl http://你的服务器IP:8001/health如果返回这样的JSON,说明服务正常:
{ "status": "healthy", "service": "m2lorder-api", "timestamp": "2026-01-31T10:29:09.870785", "task": "emotion-recognition" }5.2 查看可用模型
调用API前,你需要知道有哪些模型可用:
curl http://你的服务器IP:8001/models返回结果类似:
[ { "model_id": "A001", "filename": "SDGB_A001_20250601000001_0.opt", "size_mb": 3.0, "version": 0, "timestamp": "20250601000001" }, { "model_id": "A002", "filename": "SDGB_A002_20250601000002_0.opt", "size_mb": 3.1, "version": 0, "timestamp": "20250601000002" } ]5.3 单条文本情感分析
这是最常用的接口,分析一句话的情感:
import requests import json # API地址 api_url = "http://你的服务器IP:8001/predict" # 请求数据 data = { "model_id": "A001", # 模型ID "input_data": "I am so happy today!" # 要分析的文本 } # 发送请求 response = requests.post(api_url, json=data, headers={"Content-Type": "application/json"}) # 解析结果 result = response.json() print(f"情感: {result['emotion']}") print(f"置信度: {result['confidence']}") print(f"模型: {result['model_id']}")返回结果:
{ "model_id": "A001", "emotion": "happy", "confidence": 0.96, "timestamp": "20250601000001", "metadata": { "model_version": 0, "model_size_mb": 3.0 } }5.4 批量文本情感分析
如果你需要分析很多文本,用批量接口效率更高:
import requests api_url = "http://你的服务器IP:8001/predict/batch" data = { "model_id": "A001", "inputs": [ "今天天气真好,心情愉快!", "工作不顺利,有点沮丧", "明天要见客户,有点紧张" ] } response = requests.post(api_url, json=data) results = response.json() # 遍历所有结果 for item in results['predictions']: print(f"文本: {item['input']}") print(f"情感: {item['emotion']}") print(f"置信度: {item['confidence']}") print("---")5.5 不同编程语言的调用示例
除了Python,其他语言也能轻松调用:
JavaScript (Node.js):
const axios = require('axios'); async function analyzeEmotion(text) { const response = await axios.post('http://你的服务器IP:8001/predict', { model_id: 'A001', input_data: text }); return response.data; } // 使用示例 analyzeEmotion('I feel excited about the new project!') .then(result => console.log(result));Java:
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class EmotionAnalyzer { public static void main(String[] args) throws Exception { String json = "{\"model_id\":\"A001\",\"input_data\":\"This is amazing!\"}"; HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://你的服务器IP:8001/predict")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } }6. 模型选择指南:97个模型怎么选?
M2LOrder最特别的地方是它提供了97个不同的模型。你可能要问:这么多模型,我该用哪个?
6.1 模型分类速览
我把这些模型按大小分成了几类,你可以根据需求选择:
| 模型类型 | 大小范围 | 数量 | 特点 | 推荐场景 |
|---|---|---|---|---|
| 轻量级 | 3-8 MB | 17个 | 速度快,内存占用小 | 实时聊天分析、移动端应用 |
| 中等模型 | 15-113 MB | 11个 | 平衡速度和精度 | 一般业务场景 |
| 大型模型 | 114-771 MB | 5个 | 精度较高 | 对准确度要求高的分析 |
| 超大模型 | 619-716 MB | 61个 | 精度最高 | 专业情感分析、研究用途 |
| 巨型模型 | 1.9 GB | 1个 | 极致精度 | 特殊需求,一般不推荐 |
6.2 实际选择建议
根据你的具体需求,我给出一些实用建议:
场景一:实时聊天情感分析
- 需求:用户发消息后,立即分析情感并回复
- 推荐模型:
A001、A002、A003 - 理由:这些模型只有3MB左右,分析速度极快,适合实时场景
场景二:社交媒体内容分析
- 需求:分析微博、Twitter、朋友圈等文本
- 推荐模型:
A021、A022、A023 - 理由:7-8MB大小,在速度和精度之间取得平衡
场景三:专业情感分析报告
- 需求:生成详细的情感分析报告,准确度最重要
- 推荐模型:
A204、A205、A206(619MB系列) - 理由:大模型精度更高,能识别更细微的情感差异
场景四:特定角色/场景分析
- 需求:针对特定领域(如客服对话、产品评论)的分析
- 推荐模型:
A201-A271系列中的对应模型 - 理由:这61个619MB的模型可能是针对不同角色训练的,选择对应的可能效果更好
6.3 模型命名规律
了解模型命名规则,能帮你更好地选择:
SDGB_A001_20250601000001_0.opt ├── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ── ─