يتم إعطاؤك مقتطفًا برمجيًا لبرنامج نقل البيانات الذي يتكون من مرسل ومستقبل. المرسل مسؤول عن إرسال حزم البيانات إلى المتلقي، والمتلقي مسؤول عن استقبال تلك الحزم والاعتراف بها.

وفي نهاية عملية نقل البيانات، يرسل المرسل إشارة "END" للإشارة إلى اكتمال عملية النقل. يستخدم المرسل طريقة `sendTillAck` لإرسال الحزم وينتظر الإقرارات (ACKs) من جهاز الاستقبال. إذا لم يتم التعرف على الحزمة ضمن حد معين لإعادة الإرسال، يقوم المرسل بإعادة إرسال الحزمة.

لدى جهاز الاستقبال طريقة تسمى "inbound_stream" والتي تأخذ في الاعتبار طول البيانات التي سيتم استلامها. فهو يقسم البيانات إلى أجزاء ذات حجم كبير ويتوقع تلقي الحزم من المرسل. لدى جهاز الاستقبال أيضًا حجم نافذة (`win_size`) يحدد عدد الحزم التي يمكنه تلقيها والاعتراف بها في المرة الواحدة.

تحتاج إلى تنفيذ الوظيفة المفقودة في كل من المرسل والمستقبل:
1. في المرسل:
   - قم بتنفيذ المنطق لإرسال إشارة "END" في نهاية نقل البيانات باستخدام طريقة `sendTillAck`.
   - بعد إرسال إشارة "النهاية"، قم بطباعة "Success!".

2. في المتلقي:
   - تنفيذ المنطق للتعامل مع حزمة "FIN" إذا تم إرسالها من قبل المرسل.

بافتراض أن فئتي المرسل والمستقبل محددتان بالفعل بالطرق الخاصة بكل منهما، قم بتنفيذ الكود المفقود لضمان إكمال عملية نقل البيانات بنجاح.
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}