XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

AutoMiningScript

【SpaceEngineer】全自动挖矿脚本

公开
关注 0 Fork 0 Star 0
返回提交历史

SpaceEngineersModDev/AutoMiningScript

Fix docking window retries and preserve remaining return paths

a4803c3
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

8 个文件 +142 -7
Modified AutoMiningScript.Tests/BreadcrumbCompressionTests.cs +25 -0
@@ -86,6 +86,31 @@ namespace AutoMiningScript.Tests
86 86 Assert.Equal(3,Path(restored).Count);Assert.Equal(Vector3D.Right*1000,Path(restored)[1]);
87 87 }
88 88
89 [Theory]
90 [InlineData(P.FlightState.Returning,1,0,2)]
91 [InlineData(P.FlightState.Returning,-1,0,0)]
92 [InlineData(P.FlightState.Holding,-1,0,0)]
93 [InlineData(P.FlightState.DockAlign,-1,0,0)]
94 [InlineData(P.FlightState.DockApproach,-1,0,0)]
95 [InlineData(P.FlightState.DockRetreat,-1,2,0)]
96 [InlineData(P.FlightState.Fault,-1,3,0)]
97 [InlineData(P.FlightState.Transit,-1,1,3)]
98 [InlineData(P.FlightState.Drilling,-1,0,3)]
99 [InlineData(P.FlightState.Fault,-1,0,3)]
100 public void ReloadResumesOnlyUnfinishedReturnLegsAndRetainsOutboundPaths(P.FlightState state,int remaining,int failures,int expected)
101 {
102 var r=Rig();var points=new[]{Vector3D.Zero,Vector3D.Right*20,Vector3D.Right*20+Vector3D.Up*1000};
103 Path(r).AddRange(points);r.State(state);Write(r.Miner,"returnIndex",remaining);Write(r.Miner,"retry",failures);
104 var saved=new MyIni();r.Miner.Save(saved);
105 Assert.Equal(3,Path(r).Count);Assert.Equal(expected,saved.Get("miner","BreadcrumbCount").ToInt32());
106 var restored=Rig();restored.Connector.Set("Status",MyShipConnectorStatus.Unconnected);restored.Miner.Load(saved);
107 Assert.Equal(expected,Path(restored).Count);
108 for(int n=0;n<expected;n++)Assert.Equal(points[n],Path(restored)[n]);
109 restored.Miner.Command("return");
110 Assert.Equal(P.FlightState.Returning,restored.StateNow);Assert.Equal(expected-1,Read<int>(restored.Miner,"returnIndex"));
111 Assert.Null(Read<P.DockFrame>(restored.Miner,"dock"));
112 }
113
89 114 [Fact]
90 115 public void ReturningAlongACompressedSegmentStillRequiresFreshEnvelopeRays()
91 116 {
Added AutoMiningScript.Tests/DockMotionWindowTests.cs +36 -0
@@ -0,0 +1,36 @@
1 using System.Collections.Generic;
2 using System.Reflection;
3 using System.Runtime.Remoting;
4 using Sandbox.ModAPI.Ingame;
5 using VRageMath;
6 using Xunit;
7 using P=AutoMiningScript.Program;
8
9 namespace AutoMiningScript.Tests
10 {
11 public class DockMotionWindowTests
12 {
13 static T Field<T>(object value,string name)
14 {return (T)value.GetType().GetField(name,BindingFlags.Instance|BindingFlags.NonPublic).GetValue(value);}
15
16 [Fact]
17 public void ConnectorImpulseIsFilteredButSustainedAccelerationAndActualVelocityRemainVisible()
18 {
19 var r=new FleetStateTests.Rig(1,false);Vector3D velocity=Vector3D.Zero;
20 var controller=Field<IMyShipController>(r.Fleet,"controller");
21 ((Stub<IMyShipController>)RemotingServices.GetRealProxy(controller)).Method("GetShipVelocities",a=>new MyShipVelocities(velocity,Vector3D.Zero));
22 var frames=Field<Dictionary<long,P.DockFrame>>(r.Fleet,"frames");
23 r.Tick(2);Assert.True(frames[100].IsWindow(r.Program.Config,r.Program.Now));
24 velocity=Vector3D.Right*.015;r.Tick(1);
25 Assert.Equal(velocity,frames[100].PointVelocity(frames[100].Position));
26 Assert.InRange(frames[100].Acceleration.Length(),.02,.04);
27 Assert.True(frames[100].IsWindow(r.Program.Config,r.Program.Now));
28 for(int n=0;n<5;n++){velocity+=Vector3D.Right*.05;r.Tick(1);}
29 Assert.True(frames[100].Acceleration.Length()>.1);
30 Assert.False(frames[100].IsWindow(r.Program.Config,r.Program.Now));
31 velocity=Vector3D.Right*6;r.Tick(1);
32 Assert.Equal(6,frames[100].PointVelocity(frames[100].Position).Length());
33 Assert.False(frames[100].IsWindow(r.Program.Config,r.Program.Now));
34 }
35 }
36 }
Modified AutoMiningScript.Tests/DockingNavigationTests.cs +14 -0
@@ -585,6 +585,20 @@ namespace AutoMiningScript.Tests
585 585 Assert.Equal(failures,Read<int>(r.R.Miner,"retry"));Assert.Equal(P.FlightState.DockRetreat,r.R.StateNow);
586 586 }
587 587
588 [Theory]
589 [InlineData(false)] [InlineData(true)]
590 public void RepeatedDockMotionOrStaleTelemetryDoesNotBecomeThreeCaptureFailures(bool stale)
591 {
592 var r=new DockRig();
593 for(int n=0;n<4;n++)
594 {
595 r.R.Program.Now+=1;r.R.State(P.FlightState.DockApproach);
596 r.Dock.ReceivedAt=r.R.Program.Now-(stale?1:0);r.Dock.Acceleration=stale?Vector3D.Zero:Vector3D.Right*.12;
597 Call(r.R.Miner,"DockApproach",.05);
598 Assert.Equal(P.FlightState.DockRetreat,r.R.StateNow);Assert.Equal(0,Read<int>(r.R.Miner,"retry"));
599 }
600 }
601
588 602 [Fact]
589 603 public void ObstacleOnMotherStillBlocksUnverifiedEntryWithDetoursEnabled()
590 604 {
Modified AutoMiningScript/FleetController.cs +4 -2
@@ -206,11 +206,13 @@ namespace AutoMiningScript
206 206 Center = center,
207 207 Velocity = velocity,
208 208 AngularVelocity = angular,
209 Acceleration = known ? (pointVelocity - old) / Data.Max(dt, 0.001) : new Vector3D(100, 0, 0),
209 // Filter velocity over 0.4 s before differentiating. Connector
210 // capture impulses must not abort every other inbound miner.
211 Acceleration = known ? (pointVelocity - old) / (Data.Max(dt, 0.001)+.4) : new Vector3D(100, 0, 0),
210 212 ReceivedAt = P.Now,
211 213 Connected = dock.Status == MyShipConnectorStatus.Connected
212 214 };
213 frames[dock.EntityId] = frame; previousVelocity[dock.EntityId] = pointVelocity;
215 frames[dock.EntityId] = frame; previousVelocity[dock.EntityId] = known?old+frame.Acceleration*dt:pointVelocity;
214 216 foreach(var lane in lanes.Values)if(lane.Dock==dock.EntityId)lane.Position=frame.Position;
215 217 }
216 218 }
Modified AutoMiningScript/MinerController.cs +5 -2
@@ -717,7 +717,8 @@ namespace AutoMiningScript
717 717 {
718 718 if(Connected)return;
719 719 var outward=dock==null?ship.Controller.WorldMatrix.Backward:dock.Predicted(P.Now).Forward;
720 abortPoint=Position+outward*Data.Max(DockDistance,ship.Radius*3);abortVelocity=dock==null?Data.Zero:dock.PointVelocity(Position);abortAt=P.Now;if(state==FlightState.DockApproach)retry++;stableSince=-1;
720 // A stale/moving dock is a temporary window loss, not a failed capture.
721 abortPoint=Position+outward*Data.Max(DockDistance,ship.Radius*3);abortVelocity=dock==null?Data.Zero:dock.PointVelocity(Position);abortAt=P.Now;if(state==FlightState.DockApproach && (dock==null || dock.IsWindow(P.Config,P.Now)))retry++;stableSince=-1;
721 722 Set(FlightState.DockRetreat,why);
722 723 }
723 724 void DockRetreat(double dt)
@@ -945,7 +946,9 @@ namespace AutoMiningScript
945 946 i.Set("miner","InsideBore",insideBore);i.Set("miner","InvalidSample",invalidSample);
946 947 i.Set("miner","CancelledThrough",cancelledThrough);i.Set("miner","Canceling",canceling);
947 948 i.Set("miner","Continuing",continuing);if(nextReport!=null)i.Set("miner","NextReport",nextReport.ToIni().ToString());
948 if(job!=null)job.Write(i,"activeJob");i.Set("miner","BreadcrumbCount",breadcrumbs.Count);for(int n=0;n<breadcrumbs.Count;n++)i.Set("path",n.ToString(),Data.Vector(breadcrumbs[n]));
949 // Only the unfinished trail is needed after a return/recovery restart.
950 int count=ReturningToDock || (state==FlightState.Fault && retry>0)?returnIndex+1:breadcrumbs.Count;
951 if(job!=null)job.Write(i,"activeJob");i.Set("miner","BreadcrumbCount",count);for(int n=0;n<count;n++)i.Set("path",n.ToString(),Data.Vector(breadcrumbs[n]));
949 952 resources.Save(i);flight.Save(i);
950 953 }
951 954 public override void Load(MyIni i)
Modified docs/VALIDATION.md +4 -2
@@ -6,9 +6,11 @@
6 6
7 7 ### 2026-10-10 十二台舰队实机复测修复
8 8
9 在授权调试副本中发现并修复太空观察点不足、自动开采入口仍用短试钻检查、擦边发现导致空孔、开采入口持续绕行、短距离避让反复转身、自遮挡镜头阻止转向,以及返航倒放回环航迹等问题。首轮十二台均收到开采任务,但只有四台实际采到矿,不能据此声称十二台完整采矿通过;继续按每台矿机的实际矿石增量、返航连接和卸空逐项复核。详见 [本轮实机记录](agent-debug/FULL_CYCLE_20261010.md)。
9 在授权调试副本中发现并修复太空观察点不足、自动开采入口仍用短试钻检查、擦边发现导致空孔、开采入口持续绕行、短距离避让反复转身、自遮挡镜头阻止转向、返航倒放回环航迹、主控分帧续派延迟,以及对接运动脉冲耗尽重试和重载重放已完成返航段等问题。复测实际记录十二台同时钻进十二个不同任务,十二台均新增矿石,合计观测峰值约 **214.24 万 kg**。十一台首次自然返航完成卸货;2 号修复后恢复游戏并完成卸货,前后相邻快照中矿机减少和母舰增加同为 **180145.939019 kg**。过程包含热更新及游戏重启,不能称为单一版本无中断的完整循环。详见 [本轮实机记录](agent-debug/FULL_CYCLE_20261010.md)。
10 10
11 本轮代码的中英文回归各 **910/910** 通过;八份导出均通过独立编译、角色检查及 100000 字符限制,最终日志为 `obj/assignment-batch-build.log`。中文矿机 97370 字符,SHA-256 `4e17863776b7c281547852d3e73a9921d7787852d5e992e4a4d5d720b8981ec7`;中文主控 98367 字符,SHA-256 `df573273862435ed54258ca93a5d24716920904864c5b98b9a2896b9bce20b30`。英文矿机 99771、主控 99525 字符。调试工具十项 Python 检查通过,包含不把派工、空载返航、未连接时丢货或之前循环的矿物记为本轮完整采矿。
11 最终中英文回归各 **923/923** 通过;八份导出均通过独立编译、角色检查及 100000 字符限制,日志为 `obj/cycle-final-build.log`。中文矿机 97422 字符,SHA-256 `0938c9871de8facf78485a129a6d360be5213b1bea8e4590d7c2964cc67d3603`;中文主控 98384 字符,SHA-256 `f4b9f0138a8334520305976ad6b6df6430f2b87ca2d9822e54587ace658dfeec`。英文矿机 99823、主控 99542 字符。调试工具十项 Python 检查通过,包含不把派工、空载返航、未连接时丢货或之前循环的矿物记为本轮完整采矿。
12
13 最终十三个 PB 均与上述导出相符、存在编译实例且无编译错误;十二台全部空载连接、待命,192 个推进器全部关闭且推力与覆盖为零。十二台矿机及母舰的方块数、完整度、损伤和变形与基线一致;原存档 24 个活动文件及文件集合未变。最后的返航航迹存档修复通过回归及游戏内编译,未在部署后重新跑一次完整舰队循环。
12 14
13 15 ### 2026-10-10 并行大范围开采与原存档更新
14 16
Modified docs/agent-debug/FULL_CYCLE_20261010.md +46 -1
@@ -2,6 +2,8 @@
2 2
3 3 通过自研加载器与 AgentBridge 运行离线副本 `XFE Agent Debug AMS 20261010-182910`。本轮原始证据保存在本仓库忽略目录 `artifacts/agent-debug/bulk-cycle-20261010/`,记录器为 `tools/agent-debug/fleet_cycle.py`。AMS 专用代码、存档解释和记录均留在脚本仓库;插件仅提供通用接口。
4 4
5 结果:十二台均实际参与探索和开采,并有采矿后返航连接、卸空记录;十一台首次自然返航完成,2 号在修复靠泊故障并恢复游戏后完成。最终十二台全部空载停靠、192 个推进器全部关闭、十三个网格的完整度均未降低。过程包含热更新和一次游戏进程中断,不是单一版本下无干预的连续验收。
6
5 7 ## 验收口径
6 8
7 9 先记录全部矿机连接且矿石库存为空的基线,再启动探索。分别统计真实任务执行、钻进后库存增量、返航、实际连接及采矿后卸空;收到任务不等于采到矿。矿机货物只统计钻头、连接器、分拣器和货箱等运输库存,排除反应堆、氢氧制造机及生产设备的自用物资。母舰接收另核对货箱和生产设备的矿石流入,避免把已经进入精炼的矿石误判为丢失。
@@ -16,6 +18,8 @@
16 18 - 实机 9 号的镜头射线打到自身船体,但转向选择仍将该镜头的视锥覆盖视为可用视线,造成 9 号、10 号互相等待。已将本次实际被遮挡的镜头排除出转向选择,保留其他镜头和缺少方向覆盖时的转向探测。
17 19 - 旧版反复寻找入口留下大量近距离回环;返航逐点倒放时反复制动和掉头。返航可重新接上两个船体半径内更早的航迹点,消除局部回环;没有直接删除远处急转弯,新连接段仍执行完整包络扫描和避障。实际快照中 1 号有 49 个航迹点,7 号距离更早航迹点仅 2.6 米;对应回归同时覆盖空旷捷径和捷径有墙的情况。
18 20 - 十二台探索时,主控每查找一批最多 64 个候选任务都等待 0.1 秒,504 项计划导致每轮续派约十秒,矿机频繁同时等待。任务查找已开始时改为下一帧继续,仍限制单帧候选数量和指令预算;开始下一台查找仍保留节流。回归以 60 Hz 运行真实调度逻辑,验证 504 项计划下十二台均在四秒内获得任务。
21 - 2 号三次对接中断均由母舰接头的短暂速度脉冲触发:故障快照的接头速度仅 0.01 m/s、转速 0.012°/s,差分加速度却达 0.12 m/s²。主控对用于求导的速度应用 0.4 秒滤波,实际速度和角速度仍原样参与运动限制;矿机因过期遥测或真实运动超限退出窗口时继续退让,但不再当作捕获失败扣减三次重试额度。回归同时验证短脉冲、持续加速、实际高速及反复遥测过期。
22 - 游戏进程中断后恢复同一副本,又复现返航航迹重放:2 号已经退到离接头约 107 米的位置,重载却从旧航迹末端开始,先飞离母舰到约 1117 米再折返。现在保存返航中的未完成航迹前缀,已走完的段不再写回;靠泊失败的恢复同样处理,采矿与出程航迹继续保留。十项回归中,旧实现七项失败、修复后全部通过,覆盖途中恢复、已完成航迹、靠泊中断及采矿故障。
19 23
20 24 ## 首轮实测
21 25
@@ -32,4 +36,45 @@ UTC 10:41:59 记录十二台矿机全部连接、矿石库存为零;10:42:25
32 36
33 37 首轮四台最后均已连接并卸空;7 号最后一批在 UTC 11:28:44 的记录中确认。全部十二台再次连接、空载且保持 85 个方块、47056 完整度之后,保存 `final-cycle-baseline.json`,逐一读取十三个编程块确认源码和编译实例,于 UTC 11:28:57.111538 执行 `clear-tasks`、`survey 2000`、`start` 开始复测。十二台均离港并取得不同观察点。9 号随后真实命中同一小行星 `483731818465130598`,方向修正后的新开采区为 `主控-deposit-2137`;十二台均取得不同开采孔。
34 38
35 本轮矿机版本保持 SHA-256 `4e17863776b7c281547852d3e73a9921d7787852d5e992e4a4d5d720b8981ec7`。为修复实测续派延迟,UTC 11:34:45 热更新并核验主控为 `df573273862435ed54258ca93a5d24716920904864c5b98b9a2896b9bce20b30`,保留进行中的计划与任务;本轮没有重置矿机程序或伪造矿石。
39 探索与采矿阶段的矿机版本为 SHA-256 `4e17863776b7c281547852d3e73a9921d7787852d5e992e4a4d5d720b8981ec7`。为修复实测续派延迟,UTC 11:34:45 热更新并核验主控为 `df573273862435ed54258ca93a5d24716920904864c5b98b9a2896b9bce20b30`,保留进行中的计划与任务;这段没有重置矿机程序或伪造矿石。
40
41 ## 十二台实际开采与返航
42
43 UTC 11:36:16.861472 的同一次舰队采样中,十二台全部处于 `Drilling`,对应十二个不同任务。11:37:20.588522 已观察到十二台全部新增矿石;11:39:31.909134 十二台均已自行进入返航,触发原因为满载或钻头库存堵塞。这个阶段没有发送全体返航命令。
44
45 每台新增石头峰值如下;合计 **2142365.279337 kg**。这是矿机货物库存的观测峰值之和,不把母舰最终余额当作开采总量,母舰会同步精炼。
46
47 | 矿机 | 新增矿石峰值(kg) | 实际连接并卸空(UTC) |
48 | --- | ---: | --- |
49 | 1 号 | 178522.888312 | 11:40:27.566888 |
50 | 2 号 | 180145.941440 | 12:22:53.5038669(修复后恢复) |
51 | 3 号 | 180068.197312 | 11:43:30.9990209 |
52 | 4 号 | 174386.323414 | 11:42:29.7002418 |
53 | 5 号 | 180618.595102 | 11:44:52.8155771 |
54 | 6 号 | 178741.806152 | 11:42:05.4049707 |
55 | 7 号 | 177351.982578 | 11:42:35.0108681 |
56 | 8 号 | 174917.642409 | 11:44:43.0308149 |
57 | 9 号 | 179676.625472 | 11:42:46.9483445 |
58 | 10 号 | 179617.481120 | 11:43:02.724974 |
59 | 11 号 | 178991.727946 | 11:44:55.6874839 |
60 | 12 号 | 179326.068080 | 11:45:57.9053047 |
61
62 十一台在首次自然返航中完成连接、卸货。记录器仅在实际连接后发送停止下一轮出航的命令,货物由游戏传送系统和脚本自行卸载;1 号因最初无线命令延迟又离港一次,随后召回并重新停靠。没有通过插件设置位置、增加矿石、删除矿石或强制连接来完成验收。
63
64 2 号发生上述三次运动窗口误判。修复首次热部署后,游戏进程消失,末尾日志没有确认正常退出原因,因此不判定具体崩溃原因。通过自研加载器重新启动,并加载同一份 UTC 11:50:40 保存的调试副本;没有回退到空载基线重新计数。读取确认另十一台空载连接、2 号仍有 **180145.939019 kg** 石头,部署运动窗口修复并发送 2 号返航恢复命令,于 UTC 12:17:54 左右继续运行。此段属于故障修复后的恢复验证,不能称为十二台在单一版本下无中断的一次循环。
65
66 2 号于 UTC 12:22:52.3944666 实际连接;12:22:53.0243028 至 12:22:53.5038669 的相邻快照中,矿机货物减少 **180145.939019 kg**、母舰包括生产设备在内的矿石库存增加同样数量,随后矿机货物为零。末段距接触点约 0.2 米的采样中,指令速度为 **0.5 m/s**、实际网格速度为 **0.5623744 m/s**,相对速度约 **0.52 m/s**,随后成功捕获;整个恢复接近过程未再累计对接失败。
67
68 ## 最终版本和核验
69
70 最后将包含返航存档修复的版本部署到全部十二台矿机,并逐一读取全部十三个编程块验证源码摘要、编译实例和无编译错误;`terminationReason` 均为 `None`。返航存档修复通过上述十项回归与游戏内编译,未另启动一次完整舰队循环来验证此最后一处序列化改动。
71
72 - 中文矿机:97422 字符,SHA-256 `0938c9871de8facf78485a129a6d360be5213b1bea8e4590d7c2964cc67d3603`。
73 - 中文主控:98384 字符,SHA-256 `f4b9f0138a8334520305976ad6b6df6430f2b87ca2d9822e54587ace658dfeec`。
74 - 英文矿机 99823 字符、主控 99542 字符;八份导出均通过独立编译、角色检查及 100000 字符限制。
75 - 完整中英文回归各 **923/923** 项通过,调试工具 **10/10** 项 Python 检查通过;最终构建日志 `obj/cycle-final-build.log`,摘要清单 `dist/manifest.json`。
76 - UTC 12:23:57 起进行最终冻结核验:十二台均连接、矿石为零、显示“待命中”;每台 16 个推进器均 `enabled=false`,实际推力与两种覆盖值均为零,共 **192** 个。
77 - 十二台矿机各 **85** 个方块、完整度 **47056**;母舰 **1335** 个方块、完整度 **5418434**,均与基线一致,损伤、变形及未完成方块均为零。最后保存调试副本并通过插件正常退出;离线重新读取的十三个脚本摘要仍与最终导出一致。
78 - 原存档按本次复制前相同范围核对 **24** 个活动文件,文件集合和 SHA-256 全部一致;不包含原有 `Backup` 目录。
79
80 可复核证据:`final-cycle-baseline.json`、`final-cycle-start.json`、`final-cycle-milestones.json`、`trace-*.jsonl`、`cycle-report.json`、`final-cargo-events.jsonl`、`recovery-cargo-events.jsonl`、`final-completed-cycles.json`、`recovery-unload-proof.json`、`final-all-docked-empty.json`、`final-audit.json`、`final-program-*.json`、`final-hardware-*.json`、`final-save.json`、`final-exit.json`、`post-exit-verification.json`。返航存档修复部署期间的旧记录器缓存版本号不作最终版本证明,以最后十三份 `pb.read` 和源码摘要核对为准。
Modified tools/agent-debug/trace_ams.py +8 -0
@@ -60,6 +60,14 @@ MAPPINGS["60c51c6c050b0a4ec23b67e27c0d7f0d2e6a388befdaa7f46c2a8f671e6e03ba"] = d
60 60 # compared byte-for-byte (ignoring whitespace) with the preceding deployed source.
61 61 MAPPINGS["4e17863776b7c281547852d3e73a9921d7787852d5e992e4a4d5d720b8981ec7"] = MAPPINGS[
62 62 "60c51c6c050b0a4ec23b67e27c0d7f0d2e6a388befdaa7f46c2a8f671e6e03ba"]
63 # Dock window interruptions no longer consume capture retries; declarations and
64 # enum bodies again verified against the preceding deployed export.
65 MAPPINGS["6ce28ca6329bc4b654d3c4d20f09a1ea8e9cd232132f859f100951ad1035139b"] = MAPPINGS[
66 "4e17863776b7c281547852d3e73a9921d7787852d5e992e4a4d5d720b8981ec7"]
67 # Save only unfinished return breadcrumbs. Root/miner/flight declarations, job
68 # class and both enum bodies compared with the preceding export.
69 MAPPINGS["0938c9871de8facf78485a129a6d360be5213b1bea8e4590d7c2964cc67d3603"] = MAPPINGS[
70 "6ce28ca6329bc4b654d3c4d20f09a1ea8e9cd232132f859f100951ad1035139b"]
63 71 STATES = {"î": "Boot", "ï": "Docked", "ð": "Servicing", "ñ": "Ready",
64 72 "ò": "Departing", "ó": "Transit", "ô": "Survey", "õ": "Align",
65 73 "ö": "Drilling", "ø": "Retreat", "ù": "Returning", "ú": "Holding",