يتم إعطاؤك مقتطفًا برمجيًا يقوم بإنشاء رسم بياني للاتصال بشكل متكرر. يمثل الرسم البياني للاتصال التبعيات بين الوظائف المختلفة. في الكود، يتم استدعاء وظيفة "trace_calls" بشكل متكرر لإنشاء الرسم البياني للاستدعاء. تتضمن العملية الشاملة تعيين رتبة لكل وظيفة وإنشاء قائمة مجاورة لتمثيل التبعيات بين الوظائف.

مهمتك هي تنفيذ دالة، `construct_call_graph`، والتي تأخذ معلمتين: `XML` (سلسلة تمثل بيانات XML) و`FUNCTION` (اسم دالة المستوى الأعلى). يجب أن تقوم وظيفتك بإرجاع الرسم البياني للاتصال الذي تم إنشاؤه بواسطة مقتطف الشفرة.

يتم تمثيل الرسم البياني للاتصال كقاموس، حيث المفاتيح هي أسماء الوظائف والقيم هي قوائم أسماء الوظائف التي تستدعيها الوظيفة الرئيسية (التبعيات المباشرة). يجب أن يتضمن الرسم البياني للاتصال جميع الوظائف التي تمت مواجهتها أثناء الاستدعاء المتكرر لـ "trace_calls".

على سبيل المثال، في ضوء مقتطف التعليمات البرمجية التالي:

```
FUNCS[$next_rank]=$func
رتبة[$func]=$next_rank
((المرتبة التالية++))
منتهي

# قم بإنشاء قائمة مجاورة بقيمة 2 دولار وقم أيضًا بوضع علامة على المعاملة:
الرسم البياني[$2]=${FUNCS[@]}

للوظيفة في ${FUNCS[@]}; يفعل
    Trace_calls $1 "${func}"
منتهي
}

معلومات "إنشاء الرسم البياني للاتصال بشكل متكرر ..."
Trace_calls "${XML}" "${FUNCTION}"
```

واستدعاء الوظيفة `construct_call_graph(xml_data, "main")`، حيث `xml_data` عبارة عن سلسلة XML، يجب أن ترجع وظيفتك قاموسًا يمثل الرسم البياني للاستدعاء.

ملحوظة:
- الرتبة المخصصة لكل وظيفة تمثل تسلسل النداء. يبدأ الترتيب من 1 ويتزايد لكل وظيفة جديدة تتم مواجهتها.
- الدالة `trace_calls` تأخذ معلمتين: `XML` واسم الدالة. وهو مسؤول عن استدعاء نفسه بشكل متكرر لكل وظيفة تمت مواجهتها وإضافة أسماء الوظائف إلى مصفوفة `FUNCS`.
- المتغير "الرسم البياني" هو قاموس يحتوي على قائمة الجوار لكل دالة. يتم إنشاؤه عن طريق تعيين مصفوفة "FUNCS" كقيمة للدالة الحالية في قاموس "الرسم البياني".
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}