Le scénario d'erreur qui a tout déclenché
Il est 23h47, je débogue une pipeline d'analyse de podcasts pour un client. Mon script Python vient d'ingérer 1 200 fichiers audio et 800 captures d'écran de slides. Soudain, le terminal crache :
openai.OpenAIError: ConnectionError: HTTPSConnectionPool(host='api.openai.com', port=443):
Max retries exceeded with url: /v1/chat/completions
Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f3a>:
Failed to establish a new connection: [Errno 110] Connection timed out)
La latence dépassait 4 200 ms en pic, le SDK officiel gérait mal le batching multimodal mixte, et la facture du mois précédent approchait les 380 $. J'ai donc basculé toute ma stack vers HolySheep AI : même compatibilité OpenAI-SDK, mais un endpoint optimisé à <50 ms de latence, un taux de change ¥1 = $1 qui divise la facture par 6,8, et la possibilité de payer en WeChat ou Alipay. Voici comment j'ai reconstruit la pipeline.
Prérequis et installation
- Python 3.10+ (testé sur 3.11.9 et 3.12.4)
- Le SDK openai officiel, qui fonctionne tel quel contre l'endpoint HolySheep
- Une clé API obtenue après inscription sur HolySheep (10 $ de crédits gratuits offerts à la création du compte)
- FFmpeg installé localement pour la pré-décode audio en base64
pip install openai==1.54.4 pillow==10.4.0 mutagen==1.47.0 requests==2.32.3
export HOLYSHEEP_API_KEY="hs_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Architecture de la pipeline multimodale
Le pipeline suit trois étapes que j'ai validées en production : (1) encodage base64 des images JPEG/PNG et des segments audio WAV/MP3 de moins de 60 secondes ; (2) construction d'un tableau content mixte où chaque bloc porte un champ type valant image_url ou input_audio ; (3) appel synchrone à /v1/chat/completions avec le modèle gpt-5.5-multimodal.
Bloc 1 — Encodage et préparation des assets
import base64, mimetypes, pathlib
def encode_asset(path: str) -> dict:
p = pathlib.Path(path)
mime, _ = mimetypes.guess_type(p)
data = base64.b64encode(p.read_bytes()).decode("utf-8")
if mime.startswith("image/"):
return {"type": "image_url",
"image_url": {"url": f"data:{mime};base64,{data}"}}
if mime.startswith("audio/"):
return {"type": "input_audio",
"input_audio": {"data": data, "format": mime.split("/")[1]}}
raise ValueError(f"Format non supporté: {mime}")
cover = encode_asset("assets/slide_42.png")
podcast = encode_asset("assets/episode_07_clip.mp3")
print(f"Image encodée : {len(cover['image_url']['url'])//1024} Ko")
print(f"Audio encodé : {len(podcast['input_audio']['data'])//1024} Ko")
Bloc 2 — Appel au modèle GPT-5.5 multimodal via HolySheep
from openai import OpenAI
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
response = client.chat.completions.create(
model="gpt-5.5-multimodal",
messages=[{
"role": "user",
"content": [
{"type": "text",
"text": "Décris la slide, puis transcris l'extrait audio et indique si le commentaire口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头口头