From 0235727c9e7e8d1d6bf9ffeb5fe0db5d3d933238 Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Mon, 3 Aug 2026 23:52:20 +0800 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=E9=9D=9EPC=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E4=B8=8D=E6=8F=90=E7=A4=BA=E5=8F=8D=E9=A6=88=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=20(#4739)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 非主要用户优先级降低 ## Summary by Sourcery 增强: - 当活动控制器不是 Win32-Front 实现时,记录并忽略任务失败反馈提示。
Original summary in English ## Summary by Sourcery Enhancements: - Log and ignore task failure feedback hints when the active controller is not the Win32-Front implementation.
--- agent/go-service/taskersink/taskfail/sink.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/agent/go-service/taskersink/taskfail/sink.go b/agent/go-service/taskersink/taskfail/sink.go index a3d1c222f1..afed42d982 100644 --- a/agent/go-service/taskersink/taskfail/sink.go +++ b/agent/go-service/taskersink/taskfail/sink.go @@ -3,6 +3,7 @@ package taskfail import ( "github.com/MaaXYZ/MaaEnd/agent/go-service/pkg/i18n" "github.com/MaaXYZ/MaaEnd/agent/go-service/pkg/maafocus" + "github.com/MaaXYZ/MaaEnd/agent/go-service/pkg/pienv" maa "github.com/MaaXYZ/maa-framework-go/v4" "github.com/rs/zerolog/log" ) @@ -54,6 +55,15 @@ func (s *Sink) OnTaskerTask(_ *maa.Tasker, event maa.EventStatus, detail maa.Tas return } + if pienv.ControllerName() != "Win32-Front" { + log.Debug(). + Uint64("task_id", detail.TaskID). + Str("entry", detail.Entry). + Str("controller", pienv.ControllerName()). + Msg("Task failed but controller is not Win32-Front, skip feedback hint") + return + } + log.Info(). Uint64("task_id", detail.TaskID). Str("entry", detail.Entry). From baf9cd7d410ab8902363410a94f724684161077f Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Mon, 3 Aug 2026 23:52:43 +0800 Subject: [PATCH 2/4] =?UTF-8?q?chore:=20=E5=AE=8C=E5=96=84osd=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=86=85=E5=AE=B9=20(#4740)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #4713 ## Summary by Sourcery 改进屏幕显示消息以及相关的场景加载配置。 改进内容: - 优化所有受支持语言中的本地化 OSD 提示字符串。 - 调整场景加载管线配置,使其与更新后的 OSD 提示保持一致。
Original summary in English ## Summary by Sourcery Improve on-screen display messaging and related scene loading configuration. Enhancements: - Refine localized OSD prompt strings across all supported languages. - Adjust scene loading pipeline configuration to align with updated OSD prompts.
--- assets/locales/interface/en_us.json | 1 + assets/locales/interface/ja_jp.json | 1 + assets/locales/interface/ko_kr.json | 1 + assets/locales/interface/zh_cn.json | 1 + assets/locales/interface/zh_tw.json | 1 + assets/resource/pipeline/SceneManager/SceneLoading.json | 2 +- 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/locales/interface/en_us.json b/assets/locales/interface/en_us.json index 40ca188c59..91caa91f5a 100644 --- a/assets/locales/interface/en_us.json +++ b/assets/locales/interface/en_us.json @@ -1014,6 +1014,7 @@ "controller.Wlroots.description": "For Wayland compositors based on wlroots (e.g. Sway).", "task.SceneManager.focus.color_match_failed_prefix": "Color identification failed. Try disabling filters (e.g. RTX Dynamic Vibrance, GamePP filters, Mechrevo Color Calibration, etc.) or HDR
Note: a system restart is required for the change to take effect after disabling RTX Dynamic Vibrance.
", "task.SceneManager.focus.mod_check_failed_prefix": "UID display is incomplete. Enabling UID-hiding mods removes text in the upper-left corner of the screen, which affects recognition.", + "task.SceneManager.focus.osd_check_failed": "Screen overlay detected. Close FPS/hardware monitoring overlays (e.g. FPS, CPU, GPU, Afterburner) and try again", "task.SceneManager.focus.language_not_zh_cn": "The game language is not Simplified Chinese. Compatibility is limited, and tasks may fail.", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.en_us.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.en_us.md", diff --git a/assets/locales/interface/ja_jp.json b/assets/locales/interface/ja_jp.json index a164c2227d..5cc7802d63 100644 --- a/assets/locales/interface/ja_jp.json +++ b/assets/locales/interface/ja_jp.json @@ -1014,6 +1014,7 @@ "controller.Wlroots.description": "wlroots ベースの Wayland コンポジター(例: Sway)向けです。", "task.SceneManager.focus.color_match_failed_prefix": "色の認識に失敗しました。フィルター(例:RTX Dynamic Vibrance、GamePP フィルター、Mechrevo 色彩補正など)または HDR をオフにしてください
注意:RTX Dynamic Vibrance をオフにした後は、PC の再起動が必要です。
", "task.SceneManager.focus.mod_check_failed_prefix": "UIDの表示が不完全です。UID非表示MODを有効にすると、画面左上の文字が欠落し、認識に影響します。", + "task.SceneManager.focus.osd_check_failed": "画面にオーバーレイが検出されました。フレームレート/ハードウェア監視オーバーレイ(FPS、CPU、GPU、Afterburner など)を閉じてから再試行してください", "task.SceneManager.focus.language_not_zh_cn": "ゲーム言語が簡体字中国語ではありません。互換性が低く、タスクが失敗する可能性があります。", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.ja_jp.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.ja_jp.md", diff --git a/assets/locales/interface/ko_kr.json b/assets/locales/interface/ko_kr.json index cd66b78a25..bf90c78e18 100644 --- a/assets/locales/interface/ko_kr.json +++ b/assets/locales/interface/ko_kr.json @@ -1014,6 +1014,7 @@ "controller.Wlroots.description": "wlroots 기반 Wayland 컴포지터(예: Sway)용입니다.", "task.SceneManager.focus.color_match_failed_prefix": "색상 인식에 실패했습니다. 필터(예: RTX Dynamic Vibrance, GamePP 필터, Mechrevo 색상 보정 등) 또는 HDR을 꺼 보세요
참고: RTX Dynamic Vibrance를 비활성화한 후에는 PC를 재시작해야 적용됩니다.
", "task.SceneManager.focus.mod_check_failed_prefix": "UID 표시가 불완전합니다. UID 숨김 MOD를 켜면 화면 왼쪽 상단의 문자가 누락되어 인식에 영향을 줍니다.", + "task.SceneManager.focus.osd_check_failed": "화면에 오버레이가 감지되었습니다. 프레임레이트/하드웨어 모니터링 오버레이(FPS, CPU, GPU, Afterburner 등)를 끈 후 다시 시도하세요", "task.SceneManager.focus.language_not_zh_cn": "게임 언어가 간체 중국어가 아닙니다. 호환성이 낮아 작업이 실패할 수 있습니다.", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.ko_kr.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.ko_kr.md", diff --git a/assets/locales/interface/zh_cn.json b/assets/locales/interface/zh_cn.json index 2d33f5188c..282f896844 100644 --- a/assets/locales/interface/zh_cn.json +++ b/assets/locales/interface/zh_cn.json @@ -1014,6 +1014,7 @@ "controller.Wlroots.description": "适用于基于 wlroots 的 Wayland 合成器(如 Sway)", "task.SceneManager.focus.color_match_failed_prefix": "识别颜色失败,请尝试关闭滤镜(例如 RTX 动态亮丽、游戏加加滤镜、机械革命色彩校正等)或 HDR
注意:关闭 RTX 动态亮丽后需重启电脑才能生效
", "task.SceneManager.focus.mod_check_failed_prefix": "UID显示不完整,开启UID隐藏MOD会导致画面左上方文字缺失,影响识别", + "task.SceneManager.focus.osd_check_failed": "屏幕存在遮挡,请关闭帧率/硬件监控悬浮窗(如 FPS、CPU、GPU、Afterburner 等)后重试", "task.SceneManager.focus.language_not_zh_cn": "当前游戏语言不是简体中文,兼容性较差,任务可能会失败", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.zh_cn.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.zh_cn.md", diff --git a/assets/locales/interface/zh_tw.json b/assets/locales/interface/zh_tw.json index 0d51cade4c..1842c0d3df 100644 --- a/assets/locales/interface/zh_tw.json +++ b/assets/locales/interface/zh_tw.json @@ -1014,6 +1014,7 @@ "option.DailyTaskCreation.desc": "自動進行一次簡易製作以獲取活躍度", "task.SceneManager.focus.color_match_failed_prefix": "識別顏色失敗,請嘗試關閉濾鏡(例如 RTX 動態亮麗、遊戲加加濾鏡、機械革命色彩校正等)或 HDR
注意:關閉 RTX 動態亮麗後需重新啟動電腦才會生效
", "task.SceneManager.focus.mod_check_failed_prefix": "UID顯示不完整,開啟UID隱藏MOD會導致畫面左上方文字缺失,影響識別", + "task.SceneManager.focus.osd_check_failed": "螢幕存在遮擋,請關閉幀率/硬體監控懸浮窗(如 FPS、CPU、GPU、Afterburner 等)後重試", "task.SceneManager.focus.language_not_zh_cn": "當前遊戲語言不是簡體中文,相容性較差,任務可能會失敗", "description.file": "locales/interface/DESCRIPTION/DESCRIPTION.zh_tw.md", "contact.file": "https://end.maafw.com/CONTACT/CONTACT.zh_tw.md", diff --git a/assets/resource/pipeline/SceneManager/SceneLoading.json b/assets/resource/pipeline/SceneManager/SceneLoading.json index f37376357d..4e0395f317 100644 --- a/assets/resource/pipeline/SceneManager/SceneLoading.json +++ b/assets/resource/pipeline/SceneManager/SceneLoading.json @@ -251,7 +251,7 @@ ], "focus": { "Node.Recognition.Succeeded": { - "content": "屏幕存在遮挡,请尝试关闭帧率显示", + "content": "$task.SceneManager.focus.osd_check_failed", "display": "modal" } } From b48f62aaf99ab98bb00a7171a835c193af5a149b Mon Sep 17 00:00:00 2001 From: zmdyy0318 Date: Mon, 3 Aug 2026 23:53:05 +0800 Subject: [PATCH 3/4] =?UTF-8?q?perf:=20=E8=87=AA=E5=8A=A8=E6=88=98?= =?UTF-8?q?=E6=96=97=E5=9C=A8=E6=8C=91=E6=88=98=E6=B4=BB=E5=8A=A8=E4=B8=AD?= =?UTF-8?q?=E9=9C=80=E7=AD=89=E5=BE=85=E6=80=AA=E7=89=A9=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=20(#4741)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary by Sourcery 在进入 Protocol Space 机关之门时,为 AutoFight 添加战前等待流程,在怪物生成之前延迟锁定操作。 新功能: - 在挑战事件中,在开始自动战斗前,引入一个基于识别的等待循环,用于检测 Protocol Space 的重启状态。 增强优化: - 在 Protocol Space 自动战斗流程中,等待战斗开始或超时时,显示本地化状态消息。 - 扩展 AutoFight 识别资源,以检测 Protocol Space 机关之门和重启状态。
Original summary in English ## Summary by Sourcery Add a pre-battle wait flow to AutoFight when entering the Protocol Space mechanics gate, delaying lock actions until monsters have spawned. New Features: - Introduce a recognition-driven wait loop for Protocol Space restart before starting auto battle in challenge events. Enhancements: - Display localized status messages while waiting for battle start or timeout in Protocol Space auto-fight flow. - Extend AutoFight recognition resources to detect Protocol Space mechanics gate and restart states.
--- agent/go-service/autofight/autofight.go | 67 ++++++++++++++++++ assets/locales/go-service/en_us.json | 3 + assets/locales/go-service/ja_jp.json | 3 + assets/locales/go-service/ko_kr.json | 3 + assets/locales/go-service/zh_cn.json | 3 + assets/locales/go-service/zh_tw.json | 3 + .../image/ProtocolSpace/MechanicsIcon.png | Bin 0 -> 1392 bytes .../pipeline/AutoFight/Recognition.json | 38 ++++++++++ 8 files changed, 120 insertions(+) create mode 100644 assets/resource/image/ProtocolSpace/MechanicsIcon.png diff --git a/agent/go-service/autofight/autofight.go b/agent/go-service/autofight/autofight.go index d803c0a70a..6c199781a7 100644 --- a/agent/go-service/autofight/autofight.go +++ b/agent/go-service/autofight/autofight.go @@ -50,6 +50,71 @@ func getCharactorLevelShow(ctx *maa.Context, img image.Image) bool { return detail.Hit } +func screencapImage(ctx *maa.Context) (image.Image, bool) { + ctx.GetTasker().GetController().PostScreencap().Wait() + img, err := ctx.GetTasker().GetController().CacheImage() + if err != nil { + log.Error().Err(err).Str("component", "AutoFight").Msg("failed to cache image") + return nil, false + } + return img, true +} + +// 竞技大会活动,触摸光球时游戏判断开始战斗,接着321倒计时,之后出现怪物。在321倒计时时按下锁定怪物按键会导致普攻松开,因此等待倒计时结束。 +func waitProtocolSpaceRestartIfNeeded(ctx *maa.Context) { + img, ok := screencapImage(ctx) + if !ok { + return + } + + gate, err := ctx.RunRecognition("__AutoFightRecognitionProtocolSpaceMechanicsGate", img) + if err != nil || gate == nil { + log.Error(). + Err(err). + Str("component", "AutoFight"). + Str("step", "protocolSpaceMechanicsGate"). + Str("recognition", "__AutoFightRecognitionProtocolSpaceMechanicsGate"). + Msg("failed to run protocol space mechanics gate recognition") + return + } + if !gate.Hit { + return + } + + log.Info().Str("component", "AutoFight").Msg("protocol space mechanics gate hit, waiting for SpaceResart") + maafocus.Print(ctx, i18n.T("autofight.wait_battle_start")) + deadline := time.Now().Add(5 * time.Second) + for { + restart, err := ctx.RunRecognition("__AutoFightRecognitionProtocolSpaceRestart", img) + if err != nil || restart == nil { + log.Error(). + Err(err). + Str("component", "AutoFight"). + Str("step", "protocolSpaceRestart"). + Str("recognition", "__AutoFightRecognitionProtocolSpaceRestart"). + Msg("failed to run protocol space restart recognition") + return + } + if restart.Hit { + log.Info().Str("component", "AutoFight").Msg("protocol space SpaceResart found, continue fight") + maafocus.Print(ctx, i18n.T("autofight.wait_battle_start_found")) + return + } + + if time.Now().After(deadline) { + log.Warn().Str("component", "AutoFight").Msg("protocol space SpaceResart timeout, continue fight") + maafocus.Print(ctx, i18n.T("autofight.wait_battle_start_timeout")) + return + } + + time.Sleep(1 * time.Second) + img, ok = screencapImage(ctx) + if !ok { + return + } + } +} + // captureDurationTracker 统计截图识别的平均耗时:每 reportWindow 计算一次窗口内平均值并重置, // 若平均耗时超过 alertThreshold,则通过 maafocus 提醒用户降低显卡资源占用。 type captureDurationTracker struct { @@ -282,6 +347,8 @@ func (a *AutoFightMainAction) Run(ctx *maa.Context, arg *maa.CustomActionArg) bo } log.Debug().Str("component", "AutoFight").Interface("params", params).Msg("parsed action attach parameters") + waitProtocolSpaceRestartIfNeeded(ctx) + var pauseStart time.Time var lastLevelShowCheck time.Time var noLockStart time.Time diff --git a/assets/locales/go-service/en_us.json b/assets/locales/go-service/en_us.json index 86e72a87b9..b9bc99719a 100644 --- a/assets/locales/go-service/en_us.json +++ b/assets/locales/go-service/en_us.json @@ -50,6 +50,9 @@ "autofight.health_dangerous_switch": "Operator #%d health critical, switching to operator #%d", "autofight.enemy_accumulating_power": "Enemy is accumulating power", "autofight.exit_fight": "Exiting combat", + "autofight.wait_battle_start": "Waiting for battle to start", + "autofight.wait_battle_start_found": "Battle started", + "autofight.wait_battle_start_timeout": "Timed out waiting for battle to start, continuing combat", "autofight.capture_slow": "Combat recognition averages %d ms. Lower graphics quality and resolution in game settings to reduce device load.", "autofight.adjust_view": "Adjusting view", "autofight.move_back": "Enemy not found for a while, moving back", diff --git a/assets/locales/go-service/ja_jp.json b/assets/locales/go-service/ja_jp.json index c9c643fda4..99f129f5e9 100644 --- a/assets/locales/go-service/ja_jp.json +++ b/assets/locales/go-service/ja_jp.json @@ -50,6 +50,9 @@ "autofight.health_dangerous_switch": "オペレーター %d 号のHPが危険、%d 号に切り替えます", "autofight.enemy_accumulating_power": "敵がチャージ中", "autofight.exit_fight": "戦闘シーンを離脱", + "autofight.wait_battle_start": "戦闘開始を待機", + "autofight.wait_battle_start_found": "戦闘開始", + "autofight.wait_battle_start_timeout": "戦闘開始の待機がタイムアウト、戦闘を継続", "autofight.capture_slow": "戦闘認識の平均処理時間は %d ms です。ゲーム設定で画質・解像度を下げ、デバイスの負荷を減らしてください", "autofight.adjust_view": "視点を調整", "autofight.move_back": "敵が長時間見つからないため、後退します", diff --git a/assets/locales/go-service/ko_kr.json b/assets/locales/go-service/ko_kr.json index aafea070e1..21675e388a 100644 --- a/assets/locales/go-service/ko_kr.json +++ b/assets/locales/go-service/ko_kr.json @@ -50,6 +50,9 @@ "autofight.health_dangerous_switch": "%d번 오퍼레이터 체력 위험, %d번 오퍼레이터로 전환합니다", "autofight.enemy_accumulating_power": "적이 차징 중", "autofight.exit_fight": "전투 장면 이탈", + "autofight.wait_battle_start": "전투 시작 대기", + "autofight.wait_battle_start_found": "전투 시작", + "autofight.wait_battle_start_timeout": "전투 시작 대기 시간 초과, 전투 계속", "autofight.capture_slow": "전투 인식 평균 소요 시간 %d ms, 게임 설정에서 화질·해상도를 낮춰 기기 부하를 줄여 주세요", "autofight.adjust_view": "시점 조정", "autofight.move_back": "적을 오래 찾지 못해 후퇴합니다", diff --git a/assets/locales/go-service/zh_cn.json b/assets/locales/go-service/zh_cn.json index 1c89f1091c..f47bfc5f4d 100644 --- a/assets/locales/go-service/zh_cn.json +++ b/assets/locales/go-service/zh_cn.json @@ -50,6 +50,9 @@ "autofight.health_dangerous_switch": "当前 %d 号干员血量危险,切换到 %d 号干员", "autofight.enemy_accumulating_power": "敌人正在蓄力", "autofight.exit_fight": "退出战斗场景", + "autofight.wait_battle_start": "等待战斗开始", + "autofight.wait_battle_start_found": "战斗已开始", + "autofight.wait_battle_start_timeout": "等待战斗开始超时,继续战斗", "autofight.capture_slow": "战斗识别平均耗时 %d ms,请在游戏设置中降低画质、分辨率,减少设备负载", "autofight.adjust_view": "调整视角", "autofight.move_back": "长时间找不到敌人,后退", diff --git a/assets/locales/go-service/zh_tw.json b/assets/locales/go-service/zh_tw.json index 107b206dcb..1ab67049f6 100644 --- a/assets/locales/go-service/zh_tw.json +++ b/assets/locales/go-service/zh_tw.json @@ -50,6 +50,9 @@ "autofight.health_dangerous_switch": "當前 %d 號幹員血量危險,切換到 %d 號幹員", "autofight.enemy_accumulating_power": "敵人正在蓄力", "autofight.exit_fight": "退出戰鬥場景", + "autofight.wait_battle_start": "等待戰鬥開始", + "autofight.wait_battle_start_found": "戰鬥已開始", + "autofight.wait_battle_start_timeout": "等待戰鬥開始超時,繼續戰鬥", "autofight.capture_slow": "戰鬥識別平均耗時 %d ms,請在遊戲設定中降低畫質、解析度,減少裝置負載", "autofight.adjust_view": "調整視角", "autofight.move_back": "長時間找不到敵人,後退", diff --git a/assets/resource/image/ProtocolSpace/MechanicsIcon.png b/assets/resource/image/ProtocolSpace/MechanicsIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..351512b48a9a119ef1ceab2c7b6d2f3f23e8d2a0 GIT binary patch literal 1392 zcmV-$1&{iPP)6?000FyNklMWPm}EHaZ~_N7Cz2$g=cU7hB*8fcCLGfQf&losOosjY_p@fr zgDk|%SV(1bl;g)<=Dl(mIin_$Fo6>Y;RRj-2_&%)Ni0OpAq+3@4g^SGfRo_>0bW3w zru?rANCQj+2m%KPLjojfB=AmPX8eB)f`JS%Ng%)hl87Wch{Z}nU~FuRX%+&NN`<(t zj!Gn)10)=i%m`*=BZ!^wPApn~|2dv|>KhCVy^E8G%&3oZeEF+iVdct|h&v?l@{uF- zyzpCs8967sBo=FQbcA=_xk05eh9u$$DkHwS!OGj%RKko&p7?( zzc9s&n%1^fo_OMG6pKX!n1S~Z#bS}!%!~j8Gb|W>Nui$Ek|bepaFAPrH<1&;j1UZ; z$xvKbWW)OPd>At$gg`JO1tJWe&t;j9nGwuzCJZnGGbR}eDVNJ!y>f-imoD+CG{ZYFvNcuAm%VLYAy^6aP$v7oH+VNs+9^2`Fbn_>hgKU$0}sy@QsB$Ld;=C zjbYT7F^8FP{``5q^Q~|4cIhhJpV`aqM;>AMijNRENBQ^vvTXSZzJ1^TTedyKY}zyR?+fdR$`p84Uk+!*{f z-~Yk)C>B?drYUcnJ zYh&xyE!2z*5A)L>Jxf=2H(&VTm&j(by!DSuyzu<Xs(>(;Vy!v<;!jg36>n0;3!%U2i<1;?Oj2V0s z(c0QdQ}Yt07#PsDw2fRY$H>Si@0QD~Sh1YCx;ko{bF{a&Gwt-BUZd~WQTBcA^W+N+ z_2Tg%;shlXfdx|F?-?<0<5 zB;n$0ge2}oKA)$ntBbddyjtbV=~H-T#>rRu= Date: Mon, 3 Aug 2026 15:54:22 +0000 Subject: [PATCH 4/4] chore: Auto Templates Optimization Triggered by b48f62aaf99ab98bb00a7171a835c193af5a149b [skip changelog] --- .../image/ProtocolSpace/MechanicsIcon.png | Bin 1392 -> 1219 bytes .../optimize_templates.json | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/resource/image/ProtocolSpace/MechanicsIcon.png b/assets/resource/image/ProtocolSpace/MechanicsIcon.png index 351512b48a9a119ef1ceab2c7b6d2f3f23e8d2a0..600fffdcac9ff13018c094caf81ae708ae1896bb 100644 GIT binary patch delta 1210 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