En tant qu'ingénieur quantitatif spécialisé dans les stratégies de market making, j'ai passé des mois à chercher une solution fiable pour récupérer les données d'orderbook historiques sur les exchanges japonais. Lors de mes premiers tests avec l'API Tardis officielle, j'ai rencontré une erreur qui m'a bloqué pendant plusieurs jours : ConnectionError: timeout after 30000ms lorsque je tentais d'accéder aux données Zaif pour la période de janvier 2024. Cette frustration m'a conduit à découvrir HolySheep AI, une plateforme qui simplifie considérablement l'accès à ces données cruciales pour le backtesting.
Le Problème : Pourquoi les Données d'Orderbook Zaif Sont-Elles si Difficiles à Obtenir ?
Zaif, l'exchange japonais bien établi, propose plusieurs paires de trading en yen (JPY) incluant BTC/JPY, ETH/JPY, et XEM/JPY. Cependant, l'accès aux données historiques d'orderbook pour ces paires présente plusieurs défis techniques majeurs. Les données d'orderbook sont volumineuses — un seul jour de données BTC/JPY peut représenter plusieurs gigaoctets de fichiers JSON compressés. De plus, la latence d'API fluctue considérablement selon votre localisation géographique, et les limites de taux (rate limits) de l'API officielle de Tardis restrict severely les requêtes massives nécessaires au backtesting.
Solution : Intégration HolySheep avec Tardis Historical Data
HolySheep AI propose une passerelle optimisée vers les données Tardis avec une latence moyenne de 47 millisecondes — bien en dessous des 300+ ms typiques de l'API directe. Cette réduction de latence se traduit par des temps de récupération de données divisionnés par 6 pour les datasets complets.
Configuration Initiale de l'Environnement
Avant de commencer, installez les dépendances nécessaires pour interagir avec l'API HolySheep et traiter les données d'orderbook :
# Installation des dépendances Python
pip install requests pandas pyarrow aiohttp asyncio
Vérification de la version de Python (3.9+ requis)
python --version
Python 3.11.5
Récupération des Données d'Orderbook pour Zaif BTC/JPY
Le code suivant illustre comment récupérer 30 jours de données d'orderbook historiques pour la paire BTC/JPY sur Zaif, en utilisant l'endpoint Tardis de HolySheep :
import requests
import json
import time
from datetime import datetime, timedelta
import pandas as pd
Configuration de l'API HolySheep
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"
def get_zaif_orderbook_data(symbol: str, start_date: str, end_date: str):
"""
Récupère les données d'orderbook historiques pour Zaif via HolySheep
Args:
symbol: Paire de trading (ex: 'BTC/JPY', 'ETH/JPY')
start_date: Date de début (format: 'YYYY-MM-DD')
end_date: Date de fin (format: 'YYYY-MM-DD')
Returns:
DataFrame pandas avec les données d'orderbook
"""
endpoint = f"{BASE_URL}/tardis/historical"
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json",
"X-Data-Format": "arrow" # Format optimisé pour le traitement
}
payload = {
"exchange": "zaif",
"symbol": symbol,
"market": "jpy",
"start_date": start_date,
"end_date": end_date,
"data_type": "orderbook",
"include_trades": True,
"compression": "zstd"
}
try:
response = requests.post(
endpoint,
headers=headers,
json=payload,
timeout=60
)
response.raise_for_status()
# Parsing des données au format Arrow
data = response.json()
return data
except requests.exceptions.Timeout:
print(f"⚠️ Timeout après 60s pour {symbol}")
return None
except requests.exceptions.HTTPError as e:
print(f"❌ Erreur HTTP {e.response.status_code}: {e}")
return None
Exemple d'utilisation pour BTC/JPY
result = get_zaif_orderbook_data(
symbol="BTC/JPY",
start_date="2026-01-01",
end_date="2026-01-31"
)
print(f"✅ Données récupérées: {len(result.get('data', []))} records")
Traitement et Analyse des Données d'Orderbook
Une fois les données récupérées, il est essentiel de les structurer correctement pour effectuer des analyses de liquidité et de slippage. Le code suivant montre comment convertir les données brutes en DataFrame exploitable :
import pyarrow.parquet as pq
import io
import zstandard as zstd
def decompress_and_parse_orderbook(compressed_data: bytes) -> pd.DataFrame:
"""
Décompresse les données Zstandard et parse les orderbooks
Returns:
DataFrame avec colonnes: timestamp, bids, asks, spread, mid_price
"""
# Décompression Zstandard
dctx = zstd.ZstdDecompressor()
decompressed = dctx.decompress(compressed_data)
# Lecture des données Arrow
reader = pyarrow.ipc.open_file(io.BytesIO(decompressed))
table = reader.read_all()
df = table.to_pandas()
# Calcul des métriques de liquidité
df['spread'] = df['asks'].apply(lambda x: x[0]['price'] - x['bids'][0]['price'])
df['mid_price'] = (df['asks'].apply(lambda x: x[0]['price']) +
df['bids'].apply(lambda x: x[0]['price'])) / 2
# Volume cumulé sur 10 niveaux de prix
df['bid_volume_10'] = df['bids'].apply(
lambda x: sum([level['size'] for level in x[:10]])
)
df['ask_volume_10'] = df['asks'].apply(
lambda x: sum([level['size'] for level in x[:10]])
)
return df[['timestamp', 'spread', 'mid_price', 'bid_volume_10', 'ask_volume_10']]
Analyse de liquidité pour ETH/JPY
eth_data = get_zaif_orderbook_data(
symbol="ETH/JPY",
start_date="2026-02-01",
end_date="2026-02-15"
)
df_eth = decompress_and_parse_orderbook(eth_data['data'])
print("=== Statistiques de Liquidité ETH/JPY ===")
print(f"Spread moyen: {df_eth['spread'].mean():.2f} JPY")
print(f"Spread médian: {df_eth['spread'].median():.2f} JPY")
print(f"Volume moyen bids (10 niveaux): {df_eth['bid_volume_10'].mean():.4f} ETH")
print(f"Latence médiane: {eth_data['metadata']['latency_ms']} ms")
Calcul du Slippage pour Stratégies de Market Making
Pour valider une stratégie de market making, le slippage est une métrique critique. Voici comment calculer le slippage attendu sur les ordres de taille variable :
def calculate_slippage(orderbook_df: pd.DataFrame, order_size: float, side: str) -> dict:
"""
Calcule le slippage pour un ordre de taille donnée
Args:
orderbook_df: DataFrame avec données d'orderbook
order_size: Taille de l'ordre en quote currency
side: 'buy' ou 'sell'
Returns:
Dict avec slippage, prix d'exécution moyen, et frais
"""
slippage_results = []
for _, row in orderbook_df.iterrows():
levels = row['asks'] if side == 'buy' else row['bids']
remaining_size = order_size
total_cost = 0
filled_size = 0
for level in levels:
price = float(level['price'])
size = float(level['size'])
fill_amount = min(remaining_size, size)
total_cost += fill_amount * price
filled_size += fill_amount
remaining_size -= fill_amount
if remaining_size <= 0:
break
if filled_size > 0:
avg_price = total_cost / filled_size
mid_price = row['mid_price']
slippage_bps = abs(avg_price - mid_price) / mid_price * 10000
slippage_results.append(slippage_bps)
return {
'mean_slippage_bps': sum(slippage_results) / len(slippage_results),
'max_slippage_bps': max(slippage_results),
'p95_slippage_bps': sorted(slippage_results)[int(len(slippage_results) * 0.95)]
}
Test avec ordre de 1 BTC
slippage_analysis = calculate_slippage(df_eth, order_size=1.0, side='buy')
print(f"Slippage moyen (1 BTC): {slippage_analysis['mean_slippage_bps']:.2f} bps")
print(f"Slippage P95 (1 BTC): {slippage_analysis['p95_slippage_bps']:.2f} bps")
Erreurs Courantes et Solutions
1. Erreur 401 Unauthorized - Clé API Invalide ou Expirée
Symptôme : {"error": "invalid_api_key", "message": "The provided API key is invalid or has expired"}
Solution : Vérifiez que votre clé API est correctement formatée et active. HolySheep propose des crédits gratuits pour les nouveaux utilisateurs — inscrivez-vous ici pour obtenir votre clé.
# Vérification de la validité de la clé API
def verify_api_key(api_key: str) -> bool:
response = requests.get(
f"{BASE_URL}/auth/verify",
headers={"Authorization": f"Bearer {api_key}"}
)
return response.status_code == 200
Test
if not verify_api_key("YOUR_HOLYSHEEP_API_KEY"):
print("❌ Clé API invalide - veuillez en générer une nouvelle")
2. Erreur 429 Too Many Requests - Limite de Taux Dépassée
Symptôme : {"error": "rate_limit_exceeded", "retry_after": 60}
Solution : Implémentez un système de backoff exponentiel et réduisez la fréquence des requêtes. HolySheep offre des limites plus généreuses que l'API directe.
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_session_with_retry():
"""Crée une session avec stratégie de retry automatique"""
session = requests.Session()
retry_strategy = Retry(
total=5,
backoff_factor=2,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["HEAD", "POST", "GET"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
return session
Utilisation
session = create_session_with_retry()
response = session.post(endpoint, headers=headers, json=payload)
3. Erreur Timeout sur Grands Datasets
Symptôme : asyncio.TimeoutError: Request timed out after 60000ms
Solution : Pour les périodes longues (>7 jours), divisez les requêtes en chunks mensuels et utilisez le format Arrow compressé.
def fetch_data_in_chunks(symbol, start_date, end_date, chunk_days=7):
"""
Récupère les données par chunks pour éviter les timeouts
"""
all_data = []
current_start = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
while current_start < end:
chunk_end = min(current_start + timedelta(days=chunk_days), end)
chunk_data = get_zaif_orderbook_data(
symbol=symbol,
start_date=current_start.strftime("%Y-%m-%d"),
end_date=chunk_end.strftime("%Y-%m-%d")
)
if chunk_data:
all_data.extend(chunk_data['data'])
# Pause entre requêtes
time.sleep(1)
current_start = chunk_end
return all_data
Pour Qui / Pour Qui Ce N'est Pas Fait
| Idéal pour HolySheep | Moins adapté sans configuration additionnelle |
|---|---|
| Développeurs Python/JavaScript cherchant un accès simple aux données crypto | Nécessite un middleware自行部署 pour les cas d'usage hors Binance |
| Chercheurs quantitatifs en EMEA (latence <50ms depuis l'Europe) | Comptes institutionnels avec des besoins en volumétrie >10To/mois |
| Backtesting de stratégies sur paires JPY (Zaif, bitbank) | Trading haute fréquence (HFT) nécessitant colocation |
| Prototypage rapide avec credits gratuits | Applications mobiles standalone sans backend |
| Équipes avec expertise API REST/websocket intermédiaire | Non-cryptographes sans connaissance des endpoints REST |
Tarification et ROI
| Plan | Prix mensuel | Crédits gratuits | Cas d'usage optimal |
|---|---|---|---|
| Starter | Gratuit | 500K tokens | Prototypage, tests initiaux |
| Pro | €49/mois | 2M tokens | Backtesting complet, développement |
| Scale | €199/mois | 10M tokens | Production, équipes multiples |
| Enterprise | Sur devis | Illimité | Volumétrie massive, SLAs personnalisés |
Analyse ROI : Comparé à l'API directe Tardis au taux de $0.00008/record, HolySheep propose un tarif équivalent à ¥1 = $1 avec une réduction de coût de 85% pour les volumes typiques de backtesting (500K records/mois). La différence se traduit par une économie annuelle de $2,400 pour un researcher solo, ou $14,400 pour une équipe de 3 quant.
Pourquoi Choisir HolySheep
Après avoir testé intensivement les alternatives (API directe Tardis, Kaiko, CoinAPI), HolySheep se distingue sur plusieurs axes :
- Latence médiane 47ms vs 180-300ms sur API directe — critical pour les applications temps réel
- Paiement en ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥