#!/usr/bin/env python3 """ LOTTO PREDICTOR V5.3 ULTRA - GOD MODE Upgrades vs V5.2: - New GOD-MODE style: "top_cluster" * Explicitly packs the top 3 highest-score numbers (not banned) into one hyper-focused combo, then fills the rest. - Gimme5-specific tuning: * Short-window ML weights increased for Gimme5 * Agent weights adjusted to favor recency / hot/cold / clusters more for Gimme5, while other games keep the older balanced mix. - V5.3 ULTRA layer: * Regime & trend-aware adjustment (low/flat/high volatility, high_run/low_run) * Low-zone boost + cold-burst correction * Anti-lock usage limiter across sets + coverage optimizer * Mega Millions specific mid/high-band refinements + MM neighbor-chaser * Lotto America specific main-range tweaks + neighbor-chaser * Megabucks specific main-range tweaks (mid/high band support, soften 1–3) * Powerball specific main-range tweaks (core band support, soften extremes) * Lucky for Life specific main-range tweaks + neighbor-chaser for mids * Gimme 5 neighbor-chaser with micro-boost around recent hot core numbers * Mega Millions legacy Megaball 25→1–24 remap so all history fits MB 1–24 * Enhanced star/bonus picker (V5.3.1) with low-zone + cold-burst logic Features: - Multi-game, multi-agent, multi-window prediction engine - Games supported: * gimme5 (Gimme 5) * la (Lotto America) * mb (Megabucks) * mm (Mega Millions) * pb (Powerball) * l4l (Lucky for Life) - Multi-window ML: * Short (20 draws), Medium (80 draws), Long (400 draws or all) - Agents per number: * ML agent (RF + ET + GB + XGB + MLP ensemble) * Hot/Cold frequency agent * Bayesian frequency agent * Recency agent * RL-style "good draw" agent * Pattern agent (sum/odd-even/high-low/range) * Cluster compression agent (recent density bands) * Drift agent (low/high sum shifts) * Parity drift agent (odd/even imbalance) - Combination search: * GOD-MODE Monte Carlo over agent scores + pattern scoring * LAST-4 repeater ban rule (YOUR CUSTOM RULE): - If a number appears in EACH of the last 4 consecutive draws, it is banned from prediction. (We do NOT ban all numbers that simply appeared in the last 4 once.) * Generates multiple GOD MODE combos with different pattern styles: - top_cluster (hyper-focused, forced top-3 core) - balanced - low_cluster - high_cluster - tight_cluster - wide_spread - API: * predict_for_game_v3(csv_path, game_key, run_backtest=False) * predict_for_game(csv_path, game_key, run_backtest=False) * generate_wheel_numbers(...) * get_wheel_for_game(...) * get_hot_cold_analysis(...) * load_and_prepare_data(...) """ from __future__ import annotations import json import random from collections import Counter from dataclasses import dataclass from pathlib import Path from typing import Dict, List, Optional, Tuple import numpy as np import pandas as pd import warnings warnings.filterwarnings("ignore") # ============================================================================= # PATCH PACK (toggleable) — Deep-Low Injection / Tight Relax / Mid-Carry / Wildcard # UI can override via PATCH_UI_FLAGS from app.py before calling predictions. # ============================================================================= PATCH_UI_FLAGS = { "enable_streak_guard": False, # NEW: optional streak guard (OFF by default) "streak_guard_max": 3, # allow up to 3 consecutive appearances "streak_guard_penalty_factor": 0.55, # when a number is on a 3-draw streak, downweight it # Master toggles (safe defaults) "deep_low_patch": True, # Force at least one deep-low number into a target set "tight_relax_patch": True, # Relax over-compressed tight_cluster "mid_carry_patch": True, # Promote multi-set repeaters into strike pool (vote buckets) "wildcard_strike": True, # Add 1 wildcard profile strike ticket (no bonus touched) "la_upper_tail_escape": True, # LA-only: add/replace 1 upper-tail hedge set "enable_pb_consec_guard": True, # PB-only: block 3+ consecutive main numbers (OFF by default) "pb_consec_guard_run": 3, # consecutive run length to block when enabled } def _patch_game_deep_low_range(cfg: "GameConfig") -> Tuple[int, int]: """Return (low_min, low_max) per game.""" name = (getattr(cfg, "name", "") or "").lower() # Gimme5: 1–35 if "gimme" in name: return (1, 7) # Megabucks (Tri-State): 1–41 (+ megaball handled elsewhere) if "mega" in name and "buck" in name: return (1, 6) # Lucky for Life: 1–48 (+ lucky ball handled elsewhere) if "lucky for life" in name or "l4l" in name: return (1, 8) # Mega Millions: 1–70 (+ megaball 1–24 handled elsewhere) if "mega millions" in name or "mm" == name.strip(): return (1, 10) # Fallback: first 7 numbers of main range return (int(getattr(cfg, "main_min", 1)), min(int(getattr(cfg, "main_min", 1)) + 6, int(getattr(cfg, "main_max", 99)))) def _patch_best_candidate_in_range(final_scores: Dict[int, float], allowed: set, banned: set, existing: set, rmin: int, rmax: int) -> Optional[int]: cands = [n for n in range(rmin, rmax + 1) if n in allowed and n not in banned and n not in existing] if not cands: return None cands.sort(key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True) return int(cands[0]) def _patch_deep_low_inject_into_set(nums: List[int], final_scores: Dict[int, float], allowed: set, banned: set, rmin: int, rmax: int) -> List[int]: """Ensure one number from [rmin,rmax] exists by replacing the weakest-scored number.""" nums = sorted({int(x) for x in nums}) if any(rmin <= n <= rmax for n in nums): return nums pick = _patch_best_candidate_in_range(final_scores, allowed, banned, set(nums), rmin, rmax) if pick is None: return nums # Replace weakest scored number (prefer highest if tie) weakest = sorted(nums, key=lambda n: (float(final_scores.get(int(n), 0.0)), n))[0] out = [n for n in nums if n != weakest] out.append(int(pick)) out = sorted(set(out)) # If uniqueness dropped (rare), fill with best overall if len(out) < len(nums): pool = [n for n in allowed if n not in banned and n not in set(out)] pool.sort(key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True) for n in pool: out.append(int(n)) out = sorted(set(out)) if len(out) == len(nums): break return out[: len(nums)] def _patch_relax_tight_cluster(nums: List[int], final_scores: Dict[int, float], allowed: set, banned: set, max_gap: int = 9, max_same_decade: int = 3) -> List[int]: """If tight set is too compressed or too decade-heavy, swap one number to widen distribution.""" nums = sorted({int(x) for x in nums}) if len(nums) < 2: return nums gaps = [nums[i+1] - nums[i] for i in range(len(nums)-1)] # decade counts decades = {} for n in nums: d = n // 10 decades[d] = decades.get(d, 0) + 1 if (max(gaps) <= max_gap) and (max(decades.values()) <= max_same_decade): return nums # Drop candidate: either from overloaded decade, else from endpoint of largest gap drop = None overloaded = [d for d,c in decades.items() if c > max_same_decade] if overloaded: od = overloaded[0] cand = [n for n in nums if (n//10)==od] drop = cand[-1] else: i = max(range(len(nums)-1), key=lambda k: nums[k+1]-nums[k]) drop = nums[i] if float(final_scores.get(int(nums[i]), 0.0)) <= float(final_scores.get(int(nums[i+1]), 0.0)) else nums[i+1] existing = set(nums) existing.discard(drop) pool = [n for n in allowed if n not in banned and n not in existing] pool.sort(key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True) for cand in pool: out = sorted(set(existing | {int(cand)})) if len(out) != len(nums): continue gaps2 = [out[i+1]-out[i] for i in range(len(out)-1)] decades2 = {} for n in out: d = n // 10 decades2[d] = decades2.get(d, 0) + 1 if (max(gaps2) <= max_gap) and (max(decades2.values()) <= max_same_decade): return out # If we can't fully satisfy, return best-effort swap if pool: return sorted(set(existing | {int(pool[0])})) return nums def _patch_make_wildcard_profile_ticket(god_sets: List[Dict[str, object]], final_scores: Dict[int, float], allowed: set, banned: set, cfg: "GameConfig") -> Optional[List[int]]: """ Wildcard profile ticket: 1 deep-low + 2 mid + 2 upper (main numbers only) Uses favored numbers from god_sets first, then score-based fallback. """ main_n = int(len(cfg.main_cols)) if main_n != 5: return None # this profile is tuned for 5-number games low_min, low_max = _patch_game_deep_low_range(cfg) mid_min, mid_max = (low_max + 1, min(low_max + 15, int(cfg.main_max))) up_min, up_max = (mid_max + 1, int(cfg.main_max)) favored = [] for s in god_sets: favored.extend([int(x) for x in (s.get("numbers", []) or [])]) favored = sorted(set(favored)) def pick_k(lo: int, hi: int, k: int, used: set) -> List[int]: pref = [n for n in favored if lo <= n <= hi and n in allowed and n not in banned and n not in used] pref.sort(key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True) out = [] for n in pref: out.append(int(n)); used.add(int(n)) if len(out) == k: return out # fallback: score-based from full range pool = [n for n in range(lo, hi+1) if n in allowed and n not in banned and n not in used] pool.sort(key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True) for n in pool: out.append(int(n)); used.add(int(n)) if len(out) == k: return out return [] used = set(banned) ticket = [] ticket += pick_k(low_min, low_max, 1, used) ticket += pick_k(mid_min, mid_max, 2, used) ticket += pick_k(up_min, up_max, 2, used) ticket = sorted(set(ticket)) return ticket if len(ticket) == 5 else None # ============================================================ # JSON encoder for numpy types # ============================================================ class NumpyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, (np.integer, np.int64)): return int(obj) if isinstance(obj, (np.floating, np.float64)): return float(obj) if isinstance(obj, np.ndarray): return obj.tolist() return super().default(obj) # ============================================================ # Game configuration # ============================================================ @dataclass class GameConfig: name: str csv_date_col: str main_cols: List[str] star_col: Optional[str] main_min: int main_max: int star_min: Optional[int] = None star_max: Optional[int] = None sum_min: int = 0 sum_max: int = 1000 clean_func: Optional[str] = None draw_frequency: str = "Unknown" # used by engine/app GAME_CONFIGS: Dict[str, GameConfig] = { "gimme5": GameConfig( name="Gimme 5", csv_date_col="Date", main_cols=["1", "2", "3", "4", "5"], star_col=None, main_min=1, main_max=39, sum_min=40, sum_max=160, draw_frequency="5x/week", ), "la": GameConfig( name="Lotto America", csv_date_col="DrawDate", main_cols=["1", "2", "3", "4", "5"], star_col="SB", main_min=1, main_max=52, star_min=1, star_max=10, sum_min=70, sum_max=210, draw_frequency="3x/week", ), "mb": GameConfig( name="Megabucks", csv_date_col="Date", main_cols=["1", "2", "3", "4", "5"], star_col="Megaball", main_min=1, main_max=41, star_min=1, star_max=6, sum_min=45, sum_max=165, draw_frequency="3x/week", ), "mm": GameConfig( name="Mega Millions", csv_date_col="Date", main_cols=["1", "2", "3", "4", "5"], star_col="MB", main_min=1, main_max=70, star_min=1, star_max=24, # modern format (Megaball 1–24, legacy 25 remapped below) sum_min=75, sum_max=280, draw_frequency="2x/week", ), "pb": GameConfig( name="Powerball", csv_date_col="DrawDate", main_cols=["1", "2", "3", "4", "5"], star_col="PB", main_min=1, main_max=69, star_min=1, star_max=26, sum_min=65, sum_max=265, clean_func="clean_powerball_df", draw_frequency="3x/week", ), "l4l": GameConfig( name="Lucky for Life", csv_date_col="Draw Date", main_cols=["Ball 1", "Ball 2", "Ball 3", "Ball 4", "Ball 5"], star_col="Lucky Ball", main_min=1, main_max=48, star_min=1, star_max=18, sum_min=60, sum_max=200, draw_frequency="Daily", ), } # ============================================================ # Cleaning / Date / Recency helpers # ============================================================ def clean_powerball_df(raw_df: pd.DataFrame) -> pd.DataFrame: """ Example cleanup for Powerball: drop Double Play / malformed rows. Adapt if your PB CSV has extra columns. """ df = raw_df.copy() if "DrawDate" in df.columns: mask = ~df["DrawDate"].astype(str).str.contains("Double Play", na=False) df = df[mask] return df.reset_index(drop=True) def _ensure_datetime(df: pd.DataFrame, date_col: str) -> pd.DataFrame: df = df.copy() df[date_col] = pd.to_datetime(df[date_col], errors="coerce") invalid = df[date_col].isna().sum() if invalid > 0: df = df.dropna(subset=[date_col]) df = df.sort_values(date_col).reset_index(drop=True) df["Date"] = pd.to_datetime(df[date_col], errors="coerce") df["DayOfWeek"] = df["Date"].dt.dayofweek df["Month"] = df["Date"].dt.month df["Year"] = df["Date"].dt.year df["DayOfYear"] = df["Date"].dt.dayofyear return df def _limit_history(df: pd.DataFrame, max_rows: int) -> pd.DataFrame: if len(df) > max_rows: return df.tail(max_rows).reset_index(drop=True) return df.reset_index(drop=True) # ============================================================ # Auto window selection (per-game) + dynamic shrink/expand (volatility) # Silent by default (no UI text) # ============================================================ def _detect_game_key(cfg: "GameConfig") -> str: name_l = (getattr(cfg, "name", "") or "").lower() main_max = int(getattr(cfg, "main_max", 0) or 0) if "gimme" in name_l or main_max == 39: return "gimme5" if "megabucks" in name_l or main_max == 45: return "mb" if "lotto america" in name_l or main_max == 52: return "la" if "lucky for life" in name_l or main_max == 48: return "l4l" if "powerball" in name_l or main_max == 69: return "pb" if "mega millions" in name_l or main_max == 70: return "mm" return "generic" def _auto_history_window(df: pd.DataFrame, cfg: "GameConfig") -> int: """Return the history window (draw count) to use for this run. - Auto-detects a sensible base window per game. - Dynamically shrinks/expands based on recent volatility. """ gk = _detect_game_key(cfg) base = { "gimme5": 50, "mb": 100, "la": 120, "l4l": 150, "pb": 300, "mm": 280, "generic": 120, }.get(gk, 120) # hard bounds per game (keep God Mode stable) bounds = { "gimme5": (40, 110), "mb": (60, 180), "la": (70, 220), "l4l": (80, 260), "pb": (180, 450), "mm": (180, 450), "generic": (60, 220), }.get(gk, (60, 220)) # compute volatility on a short lookback try: lookback = min(len(df), 30) recent = df.tail(lookback) if lookback < 10: # not enough to estimate; return base (clamped) return int(max(bounds[0], min(bounds[1], base))) sums = recent[cfg.main_cols].sum(axis=1) spans = recent[cfg.main_cols].max(axis=1) - recent[cfg.main_cols].min(axis=1) sum_mean = float(sums.mean()) if float(sums.mean()) != 0.0 else 1.0 span_mean = float(spans.mean()) if float(spans.mean()) != 0.0 else 1.0 sum_cv = float(sums.std(ddof=0)) / abs(sum_mean) span_cv = float(spans.std(ddof=0)) / (abs(span_mean) + 1.0) # tail pressure (helps detect PB/MM high-tail flips) hi_thr = int(cfg.main_max) - 5 lo_thr = int(cfg.main_min) + 5 tail_hi = float((recent[cfg.main_cols] >= hi_thr).sum(axis=1).mean()) / max(1.0, float(len(cfg.main_cols))) tail_lo = float((recent[cfg.main_cols] <= lo_thr).sum(axis=1).mean()) / max(1.0, float(len(cfg.main_cols))) vol = 0.50 * sum_cv + 0.40 * span_cv + 0.10 * (tail_hi + tail_lo) # map volatility to scaling if vol >= 0.35: scale = 0.70 elif vol >= 0.25: scale = 0.85 elif vol <= 0.10: scale = 1.30 elif vol <= 0.15: scale = 1.15 else: scale = 1.00 win = int(round(base * scale)) win = int(max(bounds[0], min(bounds[1], win))) return win except Exception: return int(max(bounds[0], min(bounds[1], base))) # ============================================================ # Structural features per draw # ============================================================ def calculate_structural_features(df: pd.DataFrame, cfg: GameConfig) -> pd.DataFrame: df = df.copy() df["sum_total"] = df[cfg.main_cols].sum(axis=1) df["mean_val"] = df[cfg.main_cols].mean(axis=1) df["std_val"] = df[cfg.main_cols].std(axis=1) df["even_count"] = df[cfg.main_cols].apply( lambda row: sum(1 for v in row if v % 2 == 0), axis=1 ) df["odd_count"] = len(cfg.main_cols) - df["even_count"] df["range_span"] = df[cfg.main_cols].max(axis=1) - df[cfg.main_cols].min(axis=1) midpoint = (cfg.main_min + cfg.main_max) / 2.0 df["high_count"] = df[cfg.main_cols].apply( lambda row: sum(1 for v in row if v > midpoint), axis=1 ) df["low_count"] = len(cfg.main_cols) - df["high_count"] def count_consecutive(values): s = sorted(values) return sum(1 for i in range(len(s) - 1) if s[i + 1] - s[i] == 1) def avg_gap(values): s = sorted(values) gaps = [s[i + 1] - s[i] for i in range(len(s) - 1)] return float(np.mean(gaps)) if gaps else 0.0 df["consecutive_count"] = df[cfg.main_cols].apply(count_consecutive, axis=1) df["avg_gap"] = df[cfg.main_cols].apply(avg_gap, axis=1) return df def create_frequency_features( df: pd.DataFrame, cfg: GameConfig, windows: List[int] = [20, 80, 400], ) -> Dict[int, Dict[str, float]]: freq: Dict[int, Dict[str, float]] = {} for num in range(cfg.main_min, cfg.main_max + 1): freq[num] = {} total_hits = (df[cfg.main_cols] == num).sum().sum() freq[num]["overall_freq"] = total_hits / max(len(df), 1) for w in windows: sub = df.tail(w) if len(df) >= w else df hits = (sub[cfg.main_cols] == num).sum().sum() freq[num][f"freq_{w}"] = hits / max(len(sub), 1) last_idx = -1 for i in range(len(df) - 1, -1, -1): if num in df.iloc[i][cfg.main_cols].values: last_idx = i break if last_idx == -1: freq[num]["days_since_last"] = float(len(df)) else: freq[num]["days_since_last"] = float(len(df) - 1 - last_idx) return freq # ============================================================ # Multi-window ML ensemble # ============================================================ try: from xgboost import XGBClassifier _HAS_XGB = True except ImportError: from sklearn.ensemble import GradientBoostingClassifier as XGBClassifier _HAS_XGB = False from sklearn.ensemble import ( RandomForestClassifier, ExtraTreesClassifier, GradientBoostingClassifier, VotingClassifier, ) from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score def _build_window_ml_models( df: pd.DataFrame, cfg: GameConfig, window: int, ) -> Dict[int, Dict]: """ Train a per-number ML ensemble for a given window size. Returns {num: {"model": VotingClassifier, "scaler": StandardScaler, "feature_cols": [...], "accuracy": float}} """ if len(df) < 40: return {} sub = df.tail(window) if len(df) > window else df feats = calculate_structural_features(sub, cfg) base_cols = [ "DayOfWeek", "Month", "sum_total", "even_count", "odd_count", "range_span", "consecutive_count", "avg_gap", "high_count", ] feature_cols = [c for c in base_cols if c in feats.columns] X = feats[feature_cols].fillna(0.0) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) models: Dict[int, Dict] = {} for num in range(cfg.main_min, cfg.main_max + 1): y = (sub[cfg.main_cols] == num).any(axis=1).astype(int) if y.sum() < 4: continue try: X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42, stratify=y ) rf = RandomForestClassifier( n_estimators=120, max_depth=7, random_state=42, class_weight="balanced", ) et = ExtraTreesClassifier( n_estimators=120, max_depth=7, random_state=42, class_weight="balanced", ) gb = GradientBoostingClassifier( n_estimators=120, max_depth=3, learning_rate=0.08, random_state=42, ) if _HAS_XGB: xgb = XGBClassifier( n_estimators=120, max_depth=3, learning_rate=0.08, subsample=0.9, colsample_bytree=0.9, eval_metric="logloss", random_state=42, ) else: xgb = XGBClassifier( n_estimators=120, max_depth=3, random_state=42, ) mlp = MLPClassifier( hidden_layer_sizes=(32, 16), max_iter=600, random_state=42, alpha=0.0005, ) ensemble = VotingClassifier( estimators=[ ("rf", rf), ("et", et), ("gb", gb), ("xgb", xgb), ("mlp", mlp), ], voting="soft", ) ensemble.fit(X_train, y_train) y_pred = ensemble.predict(X_test) acc = accuracy_score(y_test, y_pred) if acc >= 0.52: models[num] = { "model": ensemble, "scaler": scaler, "feature_cols": feature_cols, "accuracy": acc, } except Exception: continue return models def build_multiwindow_ml( df: pd.DataFrame, cfg: GameConfig, windows: List[int] = [20, 80, 400], ) -> Dict[int, Dict[str, object]]: """ Train ML models in multiple history windows and store them per number. result[num] = {"short": {...}, "medium": {...}, "long": {...}} """ models_by_window: Dict[int, Dict[str, object]] = {} if len(df) < 40: return {} for w in windows: label = "short" if w <= 20 else ("medium" if w <= 120 else "long") mw = _build_window_ml_models(df, cfg, w) for num, info in mw.items(): if num not in models_by_window: models_by_window[num] = {} models_by_window[num][label] = info return models_by_window # ============================================================ # Multi-agent per-number scoring (V5.2 + Gimme5 tuning) # ============================================================ def compute_agent_scores( df: pd.DataFrame, cfg: GameConfig, ml_models: Dict[int, Dict[str, object]], freq_features: Dict[int, Dict[str, float]], ) -> Dict[int, Dict[str, float]]: """ Compute scores from multiple agents for each number: - ml_agent - hotcold_agent - bayes_agent - recency_agent - rl_agent - pattern_agent - cluster_agent - drift_agent - parity_agent """ scores: Dict[int, Dict[str, float]] = {} df_struct = calculate_structural_features(df, cfg) latest_feat = df_struct.iloc[[-1]].copy() base_cols = [ "DayOfWeek", "Month", "sum_total", "even_count", "odd_count", "range_span", "consecutive_count", "avg_gap", "high_count", ] latest_feat = latest_feat.reindex(columns=base_cols, fill_value=0.0) # Global stats for drift / cluster sums = df[cfg.main_cols].sum(axis=1) sum_mean = float(sums.mean()) sum_std = float(sums.std()) if sums.std() > 0 else 1.0 total_draws = len(df) # Good draws mask for RL (sums near mean) good_mask = (abs(sums - sum_mean) <= sum_std) good_indices = df.index[good_mask] # RL rewards rl_rewards: Dict[int, float] = {} for num in range(cfg.main_min, cfg.main_max + 1): if total_draws <= 0: rl_rewards[num] = 0.5 continue good_hits = 0 for idx in good_indices: if num in df.loc[idx, cfg.main_cols].values: good_hits += 1 rl_rewards[num] = good_hits / max(len(good_indices), 1) # Cluster agent: based on recent 40 draws, density in +/-2 window recent_n = min(40, len(df)) recent = df.tail(recent_n) if recent_n > 0 else df cluster_counts: Dict[int, float] = {} if recent_n > 0: all_recent_nums = recent[cfg.main_cols].values.flatten() all_recent_nums = [int(v) for v in all_recent_nums if not pd.isna(v)] hist = Counter(all_recent_nums) for num in range(cfg.main_min, cfg.main_max + 1): window_sum = 0 for k in range(num - 2, num + 3): if cfg.main_min <= k <= cfg.main_max: window_sum += hist.get(k, 0) cluster_counts[num] = window_sum if cluster_counts: max_cluster = max(cluster_counts.values()) or 1 for num in cluster_counts.keys(): cluster_counts[num] = cluster_counts[num] / max_cluster else: for num in range(cfg.main_min, cfg.main_max + 1): cluster_counts[num] = 0.5 # Drift agent: compare recent sums vs older sums (20 vs 80) recent_window = min(20, len(df)) mid_window = min(80, len(df)) if mid_window > recent_window >= 5: recent_sums = sums.tail(recent_window) older_sums = sums.tail(mid_window).head(mid_window - recent_window) recent_mean = float(recent_sums.mean()) older_mean = float(older_sums.mean()) if len(older_sums) > 0 else recent_mean if older_mean > 0: drift_ratio = (recent_mean - older_mean) / older_mean else: drift_ratio = 0.0 else: drift_ratio = 0.0 # Parity drift: even/odd balance in last 40 draws if len(df) >= 10: last_k = df.tail(min(40, len(df))) even_counts = last_k[cfg.main_cols].apply( lambda row: sum(1 for v in row if v % 2 == 0), axis=1 ) even_mean_recent = float(even_counts.mean()) expected_even = len(cfg.main_cols) / 2.0 parity_delta = even_mean_recent - expected_even else: parity_delta = 0.0 # Pre-calc uniform position mapping for drift span = cfg.main_max - cfg.main_min if cfg.main_max > cfg.main_min else 1 # Is this Gimme5? (name is "Gimme 5") is_gimme5 = cfg.name.lower().startswith("gimme") for num in range(cfg.main_min, cfg.main_max + 1): scores[num] = {} # ML agent ml_score = 0.5 if num in ml_models: cfg_models = ml_models[num] probs = [] weights = [] for label, info in cfg_models.items(): model = info["model"] scaler = info["scaler"] feature_cols = info["feature_cols"] X_latest = latest_feat[feature_cols].fillna(0.0) X_scaled = scaler.transform(X_latest) if hasattr(model, "predict_proba"): p = model.predict_proba(X_scaled)[0][1] else: p = 0.5 probs.append(p) # V5.2: Gimme5 → stronger short-window weighting if is_gimme5: if label == "short": weights.append(0.6) elif label == "medium": weights.append(0.25) else: weights.append(0.15) else: if label == "short": weights.append(0.5) elif label == "medium": weights.append(0.3) else: weights.append(0.2) if probs: p_arr = np.array(probs) w_arr = np.array(weights) ml_score = float((p_arr * w_arr).sum() / w_arr.sum()) scores[num]["ml_agent"] = float(np.clip(ml_score, 0.0, 1.0)) # Hot/cold agent fdata = freq_features[num] f_20 = fdata.get("freq_20", 0.0) f_80 = fdata.get("freq_80", 0.0) f_400 = fdata.get("freq_400", fdata.get("overall_freq", 0.0)) hot_score = 0.5 * f_20 + 0.3 * f_80 + 0.2 * f_400 scores[num]["hotcold_agent"] = float(np.clip(hot_score * 5.0, 0.0, 1.0)) # Bayesian agent hits = (df[cfg.main_cols] == num).sum().sum() bayes_mean = (hits + 1.0) / (total_draws + 2.0) scores[num]["bayes_agent"] = float(np.clip(bayes_mean * 8.0, 0.0, 1.0)) # Recency agent days_since_last = fdata.get("days_since_last", float(total_draws)) recency_score = 1.0 / (1.0 + 0.08 * days_since_last) scores[num]["recency_agent"] = float(np.clip(recency_score, 0.0, 1.0)) # RL agent rl_raw = rl_rewards[num] scores[num]["rl_agent"] = float(np.clip(rl_raw * 5.0, 0.0, 1.0)) # Pattern agent: how well this number participates in "good" patterns pattern_hits = 0 pattern_total = 0 for idx in range(total_draws): row_nums = df.loc[idx, cfg.main_cols].values if num not in row_nums: continue row_sum = row_nums.sum() even_cnt = sum(1 for v in row_nums if v % 2 == 0) in_range = (cfg.sum_min <= row_sum <= cfg.sum_max) balanced = even_cnt in (2, 3) if in_range and balanced: pattern_hits += 1 pattern_total += 1 pattern_score = (pattern_hits / pattern_total) if pattern_total > 0 else 0.5 scores[num]["pattern_agent"] = float(np.clip(pattern_score, 0.0, 1.0)) # Cluster agent (recent density in +/-2 around num) scores[num]["cluster_agent"] = float( np.clip(cluster_counts.get(num, 0.5), 0.0, 1.0) ) # Drift agent: if sums drifting lower, prefer low; if higher, prefer high if drift_ratio < -0.03: # trending lower pos_num = (num - cfg.main_min) / span drift_score = 1.0 - pos_num # low numbers ~1, high ~0 elif drift_ratio > 0.03: # trending higher pos_num = (num - cfg.main_min) / span drift_score = pos_num # high numbers ~1, low ~0 else: drift_score = 0.5 scores[num]["drift_agent"] = float(np.clip(drift_score, 0.0, 1.0)) # Parity drift agent: favor even or odd depending on recent imbalance if abs(parity_delta) < 0.2: parity_score = 0.5 else: is_even = (num % 2 == 0) if parity_delta > 0: # more evens recently parity_score = 0.8 if is_even else 0.2 else: # more odds recently parity_score = 0.8 if not is_even else 0.2 scores[num]["parity_agent"] = float(np.clip(parity_score, 0.0, 1.0)) # Normalize each agent across all numbers (0..1) if scores: agent_names = list(next(iter(scores.values())).keys()) for agent in agent_names: vals_agent = np.array([scores[n][agent] for n in scores.keys()]) vmin_a, vmax_a = vals_agent.min(), vals_agent.max() if vmax_a > vmin_a: for n in scores.keys(): scores[n][agent] = float( (scores[n][agent] - vmin_a) / (vmax_a - vmin_a) ) else: for n in scores.keys(): scores[n][agent] = 0.5 return scores def combine_agent_scores( agent_scores: Dict[int, Dict[str, float]], cfg: GameConfig, ) -> Dict[int, float]: """ Combine multi-agent scores into a single score per number. V5.2: uses a different profile for Gimme5 vs other games. """ is_gimme5 = cfg.name.lower().startswith("gimme") if is_gimme5: # Gimme5: faster game, lean more on short-window / recency / clusters weights = { "ml_agent": 0.20, "hotcold_agent": 0.20, "bayes_agent": 0.10, "recency_agent": 0.15, "rl_agent": 0.10, "pattern_agent": 0.05, "cluster_agent": 0.12, "drift_agent": 0.04, "parity_agent": 0.04, } else: # Other games: more balanced weights = { "ml_agent": 0.25, "hotcold_agent": 0.18, "bayes_agent": 0.12, "recency_agent": 0.08, "rl_agent": 0.12, "pattern_agent": 0.08, "cluster_agent": 0.08, "drift_agent": 0.05, "parity_agent": 0.04, } final_scores: Dict[int, float] = {} for num, agents in agent_scores.items(): total = 0.0 for name, w in weights.items(): total += w * agents.get(name, 0.5) final_scores[num] = float(total) if final_scores: vals = np.array(list(final_scores.values())) vmin, vmax = vals.min(), vals.max() if vmax > vmin: for n in final_scores.keys(): final_scores[n] = float((final_scores[n] - vmin) / (vmax - vmin)) else: for n in final_scores.keys(): final_scores[n] = 0.5 return final_scores # ============================================================ # Combination scoring & generation # ============================================================ def score_combo_pattern( combo: List[int], df: pd.DataFrame, cfg: GameConfig, style: str = "balanced", ) -> float: """ Score a candidate combination: - Sum vs history & config - Even/odd mix - Range & gaps plus style-specific tweaks for multi-style GOD MODE. """ combo = sorted(combo) score = 0.0 sums = df[cfg.main_cols].sum(axis=1) sum_mean = float(sums.mean()) sum_std = float(sums.std()) if sums.std() > 0 else 1.0 combo_sum = sum(combo) if cfg.sum_min <= combo_sum <= cfg.sum_max: score += 1.0 z = abs(combo_sum - sum_mean) / sum_std score += max(0.0, 1.5 - z) else: score -= 1.0 even_count = sum(1 for v in combo if v % 2 == 0) if even_count in (2, 3): score += 1.0 elif even_count in (1, 4): score += 0.2 else: score -= 0.5 combo_range = max(combo) - min(combo) hist_range = df[cfg.main_cols].max(axis=1) - df[cfg.main_cols].min(axis=1) mean_r = float(hist_range.mean()) if len(hist_range) > 0 else combo_range if mean_r > 0: diff = abs(combo_range - mean_r) / mean_r if diff < 0.3: score += 0.7 elif diff < 0.6: score += 0.2 else: score -= 0.2 gaps = [combo[i + 1] - combo[i] for i in range(len(combo) - 1)] avg_gap = float(np.mean(gaps)) if gaps else 0.0 midpoint = (cfg.main_min + cfg.main_max) / 2.0 low_count = sum(1 for v in combo if v <= midpoint) high_count = len(combo) - low_count if style == "low_cluster": if low_count >= 3: score += 0.7 if combo_range <= (cfg.main_max - cfg.main_min) * 0.5: score += 0.3 elif style == "high_cluster": if high_count >= 3: score += 0.7 if combo_range <= (cfg.main_max - cfg.main_min) * 0.5: score += 0.3 elif style == "tight_cluster": if combo_range <= (cfg.main_max - cfg.main_min) * 0.4: score += 0.8 if avg_gap <= 8: score += 0.4 elif style == "wide_spread": if combo_range >= (cfg.main_max - cfg.main_min) * 0.6: score += 0.8 if avg_gap >= 6: score += 0.4 elif style == "top_cluster": # Reward combos staying fairly central and not too extreme if combo_range <= (cfg.main_max - cfg.main_min) * 0.6: score += 0.5 if avg_gap <= 10: score += 0.3 return score def _max_consecutive_run(nums: List[int]) -> int: """Return the maximum length of any consecutive (x, x+1, x+2, ...) run in a sorted list.""" if not nums: return 0 run = 1 best = 1 for i in range(1, len(nums)): if nums[i] == nums[i - 1] + 1: run += 1 else: run = 1 if run > best: best = run return best def _has_consecutive_run(nums: List[int], run_len: int = 3) -> bool: """True if nums contains any consecutive run of length >= run_len.""" return _max_consecutive_run(nums) >= run_len def generate_godmode_combo( df: pd.DataFrame, cfg: GameConfig, final_scores: Dict[int, float], banned_nums: Optional[set] = None, n_candidates: int = 6000, style: str = "balanced", enforce_pb_tail_slot: bool = False, ) -> Tuple[List[int], float]: """ Monte Carlo search for best combination for a given style. style ∈ {"balanced", "low_cluster", "high_cluster", "tight_cluster", "wide_spread", "top_cluster"} (for "top_cluster" a separate helper is usually used, but style is kept here for consistency). """ if banned_nums is None: banned_nums = set() last_draw_set = get_last_draw_main_set(df, cfg) filtered_scores = {n: s for n, s in final_scores.items() if n not in banned_nums} if not filtered_scores: filtered_scores = final_scores.copy() numbers = list(filtered_scores.keys()) weights = np.array(list(filtered_scores.values()), dtype=float) if weights.sum() <= 0: weights = np.ones_like(weights) weights /= weights.sum() best_combo: Optional[List[int]] = None best_score = -1e9 for _ in range(n_candidates): combo = list( np.random.choice(numbers, size=len(cfg.main_cols), replace=False, p=weights) ) combo.sort() # Soft preference: include at least ONE main number from the most recent draw # LIMITED to styles: Top Cluster / Balanced and games: L4L, Gimme5, Megabucks if style in ("top_cluster", "balanced") and cfg.name in ("Lucky for Life", "Gimme 5", "Megabucks"): if last_draw_set: overlap = set(combo) & set(last_draw_set) if not overlap: # pick the best-scoring last-draw number that isn't banned and isn't already in combo ld_cands = [n for n in last_draw_set if n not in banned_nums and n not in combo] if ld_cands: best_ld = max(ld_cands, key=lambda t: filtered_scores.get(t, 0.0)) # replace the weakest number in the current combo (by filtered score) weakest = min(combo, key=lambda t: filtered_scores.get(t, 0.0)) if best_ld != weakest: new_combo = sorted((set(combo) - {weakest}) | {best_ld}) if len(new_combo) == len(cfg.main_cols): combo = new_combo # Optional PB tail-slot enforcement: ensure at least one number from 60–69 if enforce_pb_tail_slot and cfg.name == "Powerball" and style in ("high_cluster", "wide_spread"): if not any(65 <= x <= 69 for x in combo): tail_cands = [n for n in numbers if 65 <= n <= 69 and n not in combo] if tail_cands: best_tail = max(tail_cands, key=lambda t: filtered_scores.get(t, 0.0)) non_tail = [x for x in combo if not (65 <= x <= 69)] if non_tail: weakest = min(non_tail, key=lambda t: filtered_scores.get(t, 0.0)) combo = sorted([best_tail if x == weakest else x for x in combo]) # PB-only consecutive guard (optional): skip combos with 3+ consecutive main numbers if cfg.name == "Powerball" and PATCH_UI_FLAGS.get("enable_pb_consec_guard", False): if _has_consecutive_run(combo, int(PATCH_UI_FLAGS.get("pb_consec_guard_run", 3))): continue pat_score = score_combo_pattern(combo, df, cfg, style=style) synergy = float(np.mean([filtered_scores[n] for n in combo])) total_score = pat_score + synergy * 2.0 if last_draw_set and combo == last_draw_set: total_score *= 0.93 # soft full-repeat dampener (exact 5/5 match) if total_score > best_score: best_score = total_score best_combo = combo if best_combo is None: best_combo = sorted( np.random.choice(numbers, size=len(cfg.main_cols), replace=False).tolist() ) return best_combo, float(best_score) def generate_top_cluster_combo( df: pd.DataFrame, cfg: GameConfig, final_scores: Dict[int, float], banned_nums: Optional[set] = None, top_n_core: int = 3, n_candidates: int = 3000, ) -> Tuple[List[int], float]: """ Hyper-focused combo that forces top K highest-score numbers together in a single line, then fills the remaining spots with other strong numbers. """ if banned_nums is None: banned_nums = set() last_draw_set = get_last_draw_main_set(df, cfg) sorted_nums = sorted( ((n, s) for n, s in final_scores.items() if n not in banned_nums), key=lambda kv: kv[1], reverse=True, ) if not sorted_nums: sorted_nums = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) core = [n for n, _ in sorted_nums[:top_n_core]] core = core[: len(cfg.main_cols)] # safety remaining_pool = [n for n, _ in sorted_nums if n not in core] if len(remaining_pool) < (len(cfg.main_cols) - len(core)): # not enough left, just fall back return generate_godmode_combo( df, cfg, final_scores, banned_nums=banned_nums, n_candidates=n_candidates, style="top_cluster" ) remaining_weights = np.array([final_scores[n] for n in remaining_pool], dtype=float) if remaining_weights.sum() <= 0: remaining_weights = np.ones_like(remaining_weights) remaining_weights /= remaining_weights.sum() best_combo: Optional[List[int]] = None best_score = -1e9 needed = len(cfg.main_cols) - len(core) for _ in range(n_candidates): support = list( np.random.choice( remaining_pool, size=needed, replace=False, p=remaining_weights, ) ) combo = sorted(core + support) # PB-only consecutive guard (optional): skip combos with 3+ consecutive main numbers if cfg.name == "Powerball" and PATCH_UI_FLAGS.get("enable_pb_consec_guard", False): if _has_consecutive_run(combo, int(PATCH_UI_FLAGS.get("pb_consec_guard_run", 3))): continue pat_score = score_combo_pattern(combo, df, cfg, style="top_cluster") synergy = float(np.mean([final_scores[n] for n in combo])) total_score = pat_score + synergy * 2.0 if last_draw_set and combo == last_draw_set: total_score *= 0.93 # soft full-repeat dampener (exact 5/5 match) if total_score > best_score: best_score = total_score best_combo = combo if best_combo is None: # extreme fallback return generate_godmode_combo( df, cfg, final_scores, banned_nums=banned_nums, n_candidates=n_candidates, style="top_cluster" ) return best_combo, float(best_score) def _compute_sum_regime_and_trend(df: pd.DataFrame, cfg: GameConfig) -> Dict[str, object]: """ Analyze recent sums to detect: - volatility regime: low / flat / high - short-term trend: high_run / low_run / none """ sums = df[cfg.main_cols].sum(axis=1) if len(sums) == 0: return { "regime": "unknown", "volatility": 0.0, "trend": "none", "mean": 0.0, "std": 1.0, } recent = sums.tail(40) if len(sums) > 40 else sums mean = float(recent.mean()) std = float(recent.std()) if recent.std() > 0 else 1.0 z = (recent - mean) / std vol = float(np.mean(np.abs(z))) if vol < 0.8: regime = "low" elif vol > 1.2: regime = "high" else: regime = "flat" last_k = min(6, len(recent)) tail_vals = recent.tail(last_k) hi_th = mean + 0.5 * std lo_th = mean - 0.5 * std last3 = tail_vals.tail(3) if all(v > hi_th for v in last3): trend = "high_run" elif all(v < lo_th for v in last3): trend = "low_run" else: trend = "none" return { "regime": regime, "volatility": vol, "trend": trend, "mean": mean, "std": std, } def _compute_coldness(df: pd.DataFrame, cfg: GameConfig) -> Dict[int, float]: """ Coldness score per number in [0,1], where 1 = very cold, 0 = very hot. """ all_nums = df[cfg.main_cols].values.flatten() all_nums = [int(v) for v in all_nums if not pd.isna(v)] if not all_nums: return {n: 0.5 for n in range(cfg.main_min, cfg.main_max + 1)} freq = Counter(all_nums) values = list(freq.values()) if not values: return {n: 0.5 for n in range(cfg.main_min, cfg.main_max + 1)} f_min = min(values) f_max = max(values) denom = max(f_max - f_min, 1) coldness: Dict[int, float] = {} for n in range(cfg.main_min, cfg.main_max + 1): f = freq.get(n, 0) cold = (f_max - f) / denom # high when f is small coldness[n] = float(np.clip(cold, 0.0, 1.0)) return coldness def _adjust_scores_v5_3( df: pd.DataFrame, cfg: GameConfig, base_scores: Dict[int, float], ) -> Tuple[Dict[int, float], Dict[str, object], Dict[int, float]]: """ V5.3 ULTRA correction layer: 1) Dynamic regime detection (low/flat/high volatility). 2) Low-zone boost (roughly bottom 1/3rd of the range). 3) Inverse-trend feature (reversal agent). 4) Cold-burst: slight boost to colder numbers, dampen over-hot. 5) Mega Millions specific mid/high-band refinements + neighbor-chaser. 6) Lotto America specific main-range tweaks + neighbor-chaser. 7) Megabucks specific main-range tweaks. 8) Powerball specific main-range tweaks. 9) Lucky for Life specific main-range tweaks + neighbor-chaser for mids. 10) Gimme 5 neighbor-chaser with micro-boost around recent hot core numbers. Returns: adjusted_scores, regime_info, coldness_map """ if not base_scores: return base_scores, {"regime": "unknown"}, { n: 0.5 for n in range(cfg.main_min, cfg.main_max + 1) } regime_info = _compute_sum_regime_and_trend(df, cfg) regime = regime_info.get("regime", "flat") trend = regime_info.get("trend", "none") span = max(cfg.main_max - cfg.main_min, 1) mid = cfg.main_min + span / 2.0 low_cut = cfg.main_min + int(span * 0.33) regime_info["low_zone_cut"] = low_cut coldness = _compute_coldness(df, cfg) vals = np.array(list(base_scores.values()), dtype=float) vmin, vmax = float(vals.min()), float(vals.max()) norm_scores: Dict[int, float] = {} if vmax > vmin: for n, s in base_scores.items(): norm_scores[n] = float((s - vmin) / (vmax - vmin)) else: for n in base_scores.keys(): norm_scores[n] = 0.5 # Lucky for Life neighbor-chaser: identify recent hot mids (11–38) l4l_hot_mids: set = set() if cfg.name == "Lucky for Life": recent_draws = df[cfg.main_cols].tail(30) vals_mid = recent_draws.values.flatten() mids = [ int(v) for v in vals_mid if not pd.isna(v) and 11 <= int(v) <= 38 ] if mids: freq_mid = Counter(mids) l4l_hot_mids = { n for n, _ in sorted( freq_mid.items(), key=lambda kv: kv[1], reverse=True )[:6] } # Gimme 5 neighbor-chaser: identify recent hot core numbers (5–35) g5_hot_core: set = set() if cfg.name == "Gimme 5": recent_g5 = df[cfg.main_cols].tail(25) vals_g = recent_g5.values.flatten() gnums = [int(v) for v in vals_g if not pd.isna(v)] if gnums: freq_g = Counter(gnums) ordered = sorted(freq_g.items(), key=lambda kv: kv[1], reverse=True) core_list: List[int] = [] for n, _ in ordered: if 5 <= n <= 35: core_list.append(n) if len(core_list) >= 6: break g5_hot_core = set(core_list) # Gimme 5 extreme-low snapback: if no lows (<=5) appeared in recent draws, lightly boost 1–5 g5_low_suppressed: bool = False if cfg.name == "Gimme 5": recent_low = df[cfg.main_cols].tail(8).values.flatten() lows = [int(v) for v in recent_low if (not pd.isna(v) and int(v) <= 5)] g5_low_suppressed = (len(lows) == 0) # Lotto America neighbor-chaser: identify recent hot core band numbers (15–45) la_hot_core: set = set() if cfg.name == "Lotto America": recent_la = df[cfg.main_cols].tail(30) vals_la = recent_la.values.flatten() lans = [int(v) for v in vals_la if not pd.isna(v)] if lans: freq_la = Counter(lans) ordered_la = sorted( freq_la.items(), key=lambda kv: kv[1], reverse=True ) core_la: List[int] = [] for n, _ in ordered_la: if 15 <= n <= 45: core_la.append(n) if len(core_la) >= 6: break la_hot_core = set(core_la) # Mega Millions neighbor-chaser: identify recent hot core band numbers (20–60) mm_hot_core: set = set() if cfg.name == "Mega Millions": recent_mm = df[cfg.main_cols].tail(30) vals_mm = recent_mm.values.flatten() mnums = [int(v) for v in vals_mm if not pd.isna(v)] if mnums: freq_mm = Counter(mnums) ordered_mm = sorted( freq_mm.items(), key=lambda kv: kv[1], reverse=True ) core_mm: List[int] = [] for n, _ in ordered_mm: if 20 <= n <= 60: core_mm.append(n) if len(core_mm) >= 8: break mm_hot_core = set(core_mm) # Megabucks neighbor-chaser: identify recent hot core band numbers (18–35) mb_hot_core: set = set() if cfg.name == "Megabucks": recent_mb = df[cfg.main_cols].tail(30) vals_mb = recent_mb.values.flatten() mbnums = [int(v) for v in vals_mb if not pd.isna(v)] if mbnums: freq_mb = Counter(mbnums) ordered_mb = sorted(freq_mb.items(), key=lambda kv: kv[1], reverse=True) core_mb: List[int] = [] for n, _ in ordered_mb: if 18 <= n <= 35: core_mb.append(n) if len(core_mb) >= 6: break mb_hot_core = set(core_mb) # Powerball neighbor-chaser: identify recent hot core band numbers (20–45) pb_hot_core: set = set() if cfg.name == "Powerball": recent_pb = df[cfg.main_cols].tail(30) vals_pb = recent_pb.values.flatten() pbnums = [int(v) for v in vals_pb if not pd.isna(v)] if pbnums: freq_pb = Counter(pbnums) ordered_pb = sorted(freq_pb.items(), key=lambda kv: kv[1], reverse=True) core_pb: List[int] = [] for n, _ in ordered_pb: if 20 <= n <= 45: core_pb.append(n) if len(core_pb) >= 6: break pb_hot_core = set(core_pb) # --- PB_TAIL_SLOT_PATCH_V1 ------------------------------------- pb_tail_overdue = False if cfg.name == "Powerball" and len(df) >= 8: last8 = df[cfg.main_cols].tail(8).values.flatten() last8 = [int(v) for v in last8 if not pd.isna(v)] pb_tail_overdue = not any(60 <= v <= 69 for v in last8) # ---------------------------------------------------------------- adjusted: Dict[int, float] = {} for n, s in norm_scores.items(): m = 1.0 pos = (n - cfg.main_min) / span in_low_zone = n <= low_cut # Low-zone boost if in_low_zone: m *= 1.18 # low-zone probability boost # Regime-specific tweaks if regime == "high": if s > 0.7: m *= 0.92 elif s < 0.4: m *= 1.08 elif regime == "low": if s > 0.7: m *= 1.05 elif s < 0.3: m *= 0.90 else: if s > 0.8: m *= 0.97 elif s < 0.2: m *= 1.03 # Trend inversion: favor reversal side a bit if trend == "high_run": if n <= mid: m *= 1.10 else: m *= 0.90 elif trend == "low_run": if n >= mid: m *= 1.10 else: m *= 0.90 # Cold-burst factor c = coldness.get(n, 0.5) if regime == "high": m *= (1.0 + 0.25 * c) else: m *= (1.0 + 0.15 * c) # Mega Millions specific mid/high-band refinements + neighbor-chaser if cfg.name == "Mega Millions": # Mild band push for 30–55 to pull mid/high corridor together if 30 <= n <= 55: m *= 1.03 # Boost 34–36 band if 34 <= n <= 36: m *= 1.06 # Boost 37–39 ridge if 37 <= n <= 39: m *= 1.05 # Soften extreme high cooling 65+ so 69-style hits are not suppressed if n >= 65: m *= 1.03 # MM neighbor-chaser: tiny boost to neighbors of recent hot core numbers if mm_hot_core and ((n - 1 in mm_hot_core) or (n + 1 in mm_hot_core)): m *= 1.03 # Lotto America specific main-range tweaks (V5.3 ULTRA + neighbor-chaser + high-tail support) if cfg.name == "Lotto America": # Slight boost to mid-band 20–40 if 20 <= n <= 40: m *= 1.04 # NEW: small high-tail support 35–45 so 37/42/44-style clusters survive more often if 35 <= n <= 45: m *= 1.02 # Softer damp on extremes (keep lows like 3/4/5 alive; avoid over-cooling 50+) if n <= 5 or n >= 50: m *= 0.98 # Tiny neighbor-chaser boost: ±1 around recent hot core numbers if la_hot_core and ((n - 1 in la_hot_core) or (n + 1 in la_hot_core)): m *= 1.03 # Megabucks specific main-range tweaks (V5.3 ULTRA) if cfg.name == "Megabucks": # Slight boost to mid-band 18–32 (common MB hit zone) if 18 <= n <= 32: m *= 1.04 # Soft boost for upper range 35–41 so high numbers like 41 don't get over-cooled if 35 <= n <= 41: m *= 1.03 # Mild dampening on ultra-low extremes 1–3 if n <= 3: m *= 0.96 # MB neighbor-chaser micro-patch: push neighbors (±1) of recent hot core numbers # (helps catch 24–26 / 25–27 style ladders without forcing adjacency) if 'mb_hot_core' in locals() and mb_hot_core: if n in mb_hot_core: m *= 1.02 if (n - 1 in mb_hot_core) or (n + 1 in mb_hot_core): m *= 1.03 # Powerball specific main-range tweaks (V5.3 ULTRA + neighbor-chaser) if cfg.name == "Powerball": # Slight boost to core mid-band 20–45 (heavy PB activity zone) if 20 <= n <= 45: m *= 1.04 # Soft support for secondary band 10–19 and 46–59 if (10 <= n <= 19) or (46 <= n <= 59): m *= 1.02 # Softer dampening on extreme ends 1–3 and 65–69 (was 0.96) if n <= 3 or n >= 65: m *= 0.98 # PB_TAIL_SLOT_PATCH_V1 apply if 'pb_tail_overdue' in locals() and pb_tail_overdue and (65 <= n <= 69): m *= 1.05 # PB neighbor-chaser micro-patch: nudge neighbors (±1) of recent hot core numbers (20–45) if 'pb_hot_core' in locals() and pb_hot_core: if n in pb_hot_core: m *= 1.02 if (n - 1 in pb_hot_core) or (n + 1 in pb_hot_core): m *= 1.03 # Lucky for Life specific main-range tweaks (V5.3 ULTRA, stronger + neighbor-chaser) if cfg.name == "Lucky for Life": # Stronger boost to core central band 14–36 where many hits cluster if 14 <= n <= 36: m *= 1.06 # Secondary soft support for broader mid band 11–38 if 11 <= n <= 38: m *= 1.02 # Slightly stronger dampening on outer extremes 1–4 and 45–48 if n <= 4 or n >= 45: m *= 0.95 # Tiny neighbor-chaser boost: ±1 around recent hot mids if l4l_hot_mids and ((n - 1 in l4l_hot_mids) or (n + 1 in l4l_hot_mids)): m *= 1.03 # ~3% nudge, just enough to surface neighbors # Gimme 5 micro-patches: # - Neighbor-chaser: tiny nudge around recent hot core numbers # - Extreme-low snapback: if lows (<=5) have been absent for a short window, lightly boost 1–5 if cfg.name == "Gimme 5": if g5_low_suppressed and n <= 5: m *= 1.06 # snapback (kept small so it doesn't spam lows) if g5_hot_core and ((n - 1 in g5_hot_core) or (n + 1 in g5_hot_core)): m *= 1.05 # micro-boosted neighbor effect adjusted[n] = float(max(m * s, 0.0)) vals_adj = np.array(list(adjusted.values()), dtype=float) vmin_adj, vmax_adj = float(vals_adj.min()), float(vals_adj.max()) if vmax_adj > vmin_adj: for n in adjusted.keys(): adjusted[n] = float((adjusted[n] - vmin_adj) / (vmax_adj - vmin_adj)) else: for n in adjusted.keys(): adjusted[n] = 0.5 return adjusted, regime_info, coldness def pick_star_ball(df: pd.DataFrame, cfg: GameConfig) -> Optional[int]: """ V5.3.1 Mega / bonus ball picker. Improvements over V5.2: - Uses all-time + medium-term + short-term frequencies. - Adds a cold-burst factor (prefer colder balls slightly). - Favors low-zone bonus numbers a bit more (good for Mega Millions MB 1–12). - Respects cfg.star_min / cfg.star_max for all games. - Lotto America: extra boost for SB 1–5. - Powerball: mild preference for PB 1–15. - Lucky for Life: mild mid-band Lucky Ball tilt (7–15). """ if not cfg.star_col: return None df = df.copy() df[cfg.star_col] = pd.to_numeric(df[cfg.star_col], errors="coerce") df = df.dropna(subset=[cfg.star_col]) if df.empty: return None series = df[cfg.star_col].astype(int) freq_all = Counter(series) recent_med = series.tail(40) if len(series) > 40 else series freq_med = Counter(recent_med) recent_short = series.tail(15) if len(series) > 15 else series freq_short = Counter(recent_short) # Build base weights from multiple horizons weights: Dict[int, float] = {} all_vals_bonus = [] for s in range(cfg.star_min, cfg.star_max + 1): w = ( 0.50 * freq_med.get(s, 0) + 0.30 * freq_all.get(s, 0) + 0.20 * freq_short.get(s, 0) ) weights[s] = float(w) all_vals_bonus.append(w) # Avoid degenerate case if not all_vals_bonus or max(all_vals_bonus) == 0: return int(random.randint(cfg.star_min, cfg.star_max)) # Coldness (for cold-burst boosting) vals_bonus = [freq_all.get(s, 0) for s in range(cfg.star_min, cfg.star_max + 1)] f_min_b, f_max_b = min(vals_bonus), max(vals_bonus) denom_b = max(f_max_b - f_min_b, 1) coldness_bonus: Dict[int, float] = {} for s in range(cfg.star_min, cfg.star_max + 1): f = freq_all.get(s, 0) cold_b = (f_max_b - f) / denom_b # high when f is small coldness_bonus[s] = float(np.clip(cold_b, 0.0, 1.0)) # --- PB_BONUS_OVERDUE_PATCH_V1 (Powerball only) ---------------- pb_days_since: Dict[int, int] = {} pb_last_val: Optional[int] = None if cfg.name == "Powerball": cap = 20 try: pb_last_val = int(series.iloc[-1]) except Exception: pb_last_val = None for s in range(cfg.star_min, cfg.star_max + 1): d = cap for i in range(len(series) - 1, -1, -1): if int(series.iloc[i]) == s: d = min(cap, (len(series) - 1 - i)) break pb_days_since[s] = int(d) # ---------------------------------------------------------------- # Low-zone boost (e.g., MB 1–12) span_b = cfg.star_max - cfg.star_min low_cut_b = cfg.star_min + int(span_b * 0.5) # bottom half considered "low zone" adjusted_bonus: Dict[int, float] = {} for s in range(cfg.star_min, cfg.star_max + 1): base_b = weights.get(s, 0.0) c_b = coldness_bonus.get(s, 0.5) m_b = 1.0 # Low-zone preference if s <= low_cut_b: m_b *= 1.12 # +12% for low-zone stars # Lotto America: extra preference for SB 1–5 if cfg.name == "Lotto America" and s <= 5: m_b *= 1.08 # Powerball: mild preference for PB 1–15 zone if cfg.name == "Powerball" and s <= 15: m_b *= 1.05 # Lucky for Life: mid-band preference for Lucky Ball 7–15 if cfg.name == "Lucky for Life" and 7 <= s <= 15: m_b *= 1.05 # Cold-burst m_b *= (1.0 + 0.25 * c_b) # up to +25% for very cold bonus balls # PB_BONUS_OVERDUE_PATCH_V1 apply (gentle) if cfg.name == "Powerball" and pb_days_since: cap = 20 alpha = 0.35 anti_repeat = 0.97 overdue = min(cap, int(pb_days_since.get(s, cap))) / float(cap) m_b *= (1.0 + alpha * overdue) if pb_last_val is not None and int(s) == int(pb_last_val): m_b *= anti_repeat adjusted_bonus[s] = max(base_b * m_b, 0.0) # Normalize to probabilities stars = list(adjusted_bonus.keys()) wts = [adjusted_bonus[s] for s in stars] total_b = float(sum(wts)) if total_b <= 0: return int(random.randint(cfg.star_min, cfg.star_max)) probs = [w / total_b for w in wts] choice = int(np.random.choice(stars, p=probs)) return choice # ============================================================ # Last-4 repeater ban rule (your custom rule) # ============================================================ def get_last4_repeater_ban(df: pd.DataFrame, cfg: GameConfig) -> set: """ Your rule: - Look at the most recent 4 draws. - If a number appears in EACH of those 4 draws, it is banned from prediction. - We do NOT ban all numbers that just appeared once or twice. """ if len(df) < 4: return set() last4 = df[cfg.main_cols].tail(4).values cnt = Counter() for row in last4: unique_nums = {int(v) for v in row if not pd.isna(v)} for n in unique_nums: cnt[n] += 1 banned = {n for n, c in cnt.items() if c == 4} return banned def get_consecutive_streaks(df: pd.DataFrame, cfg: GameConfig, lookback: int = 12) -> Dict[int, int]: """ Compute consecutive-draw streak length for MAIN numbers, based on the most recent draws. Returns a dict {number: streak_len} for numbers that appear in the most recent draw. Example: streak_len == 3 means the number appeared in each of the last 3 consecutive draws. """ if len(df) == 0: return {} lookback = max(1, int(lookback)) tail = df[cfg.main_cols].tail(lookback).values.tolist() last_row = tail[-1] last_nums = {int(v) for v in last_row if not pd.isna(v)} streaks: Dict[int, int] = {} for n in last_nums: s = 0 # Walk backwards through draws; count consecutive appearances for row in reversed(tail): row_nums = {int(v) for v in row if not pd.isna(v)} if n in row_nums: s += 1 else: break streaks[int(n)] = int(s) return streaks def apply_streak_guard(final_scores: Dict[int, float], df: pd.DataFrame, cfg: GameConfig) -> Tuple[Dict[int, float], set]: """ Optional rule (toggle-controlled): - Allow repeats up to 3 consecutive draws. - If a number has a 3-draw streak already, DOWNWEIGHT it so we tend to move on. - If a number ever reaches a 4-draw streak, it will be banned by the existing last-4 repeater ban. Returns (adjusted_scores, extra_banned_set) """ if not PATCH_UI_FLAGS.get("enable_streak_guard", False): return final_scores, set() max_streak = int(PATCH_UI_FLAGS.get("streak_guard_max", 3)) penalty_factor = float(PATCH_UI_FLAGS.get("streak_guard_penalty_factor", 0.55)) # Safety if max_streak < 1: return final_scores, set() streaks = get_consecutive_streaks(df, cfg, lookback=max(12, max_streak + 2)) adjusted = dict(final_scores) extra_banned = set() for n, s in streaks.items(): # We only intervene at the threshold (e.g., s == 3 when max_streak == 3) if s >= (max_streak + 1): # 4+ streak (should already be caught by last-4 rule, but keep safe) extra_banned.add(int(n)) elif s == max_streak: # On a 3-draw streak: gently push away so we "move on to due/hot" if int(n) in adjusted: adjusted[int(n)] = float(adjusted[int(n)]) * penalty_factor return adjusted, extra_banned # ============================================================ # GOD MODE V5.3 prediction (multi-style, including top_cluster) # ============================================================ def get_last_draw_main_set(df: pd.DataFrame, cfg: GameConfig) -> List[int]: """Return the most recent draw's main numbers as a sorted list of ints. Used for a soft anti-repeat penalty when a candidate combo exactly matches the previous draw (exact 5/5 match on main numbers). Applies across all games. """ if df is None or df.empty: return [] row = df.iloc[-1][cfg.main_cols].values.tolist() nums = [int(v) for v in row if not pd.isna(v)] return sorted(nums) # ============================================================ # SPREAD PORTFOLIO + REGIME LABEL (ALL GAMES) # ============================================================ def _regime_low_high_bounce_label(df: pd.DataFrame, cfg: "GameConfig") -> str: """Heuristic label: detect recent LOW streak and suggest LOW→HIGH bounce (or reverse).""" try: if df is None or len(df) < 15: return "" # Sum history (main balls only) sums = [] for _, row in df.tail(60).iterrows(): try: s = sum(int(row[c]) for c in cfg.main_cols) sums.append(s) except Exception: continue if len(sums) < 15: return "" import numpy as _np arr = _np.array(sums, dtype=float) q35 = float(_np.quantile(arr, 0.35)) q65 = float(_np.quantile(arr, 0.65)) last = arr[-1] prev = arr[-2] # If last 2 were LOW, expect bounce UP if last <= q35 and prev <= q35: return "Regime detected: LOW → HIGH bounce" # If last 2 were HIGH, expect cool-down if last >= q65 and prev >= q65: return "Regime detected: HIGH → LOW cool-down" return "" except Exception: return "" def _build_spread_portfolio_generic( cfg: "GameConfig", pool12: List[int], star: int | None = None, force_high_bias: float = 0.0, ) -> Dict[str, Dict[str, object]]: """Build a 9–10 ticket spread portfolio from POOL12 (fallbacks to full range).""" nums = sorted({int(x) for x in (pool12 or []) if x is not None}) if not nums: nums = list(range(int(cfg.main_min), int(cfg.main_max) + 1)) main_n = int(len(cfg.main_cols)) # Zones span = int(cfg.main_max) - int(cfg.main_min) low_cut = int(cfg.main_min) + int(span * 0.33) high_cut = int(cfg.main_min) + int(span * 0.66) low = [n for n in nums if n <= low_cut] mid = [n for n in nums if low_cut < n < high_cut] high = [n for n in nums if n >= high_cut] # Fallbacks if len(low) < 2: low = sorted(set(low + nums[:max(2, min(6, len(nums)))])) if len(high) < 2: high = sorted(set(high + nums[-max(2, min(6, len(nums))):])) if len(mid) < 2: mid = [n for n in nums if n not in low and n not in high] if len(mid) < 2: mid = nums def _fill(parts: List[int]) -> List[int]: parts = [int(x) for x in parts if x is not None] parts = sorted(set(parts)) # Fill from nums first for n in nums: if len(parts) >= main_n: break if n not in parts: parts.append(n) # Fill from full range if still short if len(parts) < main_n: for n in range(int(cfg.main_min), int(cfg.main_max) + 1): if len(parts) >= main_n: break if n not in parts: parts.append(n) return sorted(parts[:main_n]) def _pick(k_low: int, k_mid: int, k_high: int) -> List[int]: take = [] take += low[:k_low] take += mid[:k_mid] # High bias: if force_high_bias>0, preferentially take more highs from the tail if force_high_bias > 0 and len(high) >= k_high: take += high[-k_high:] else: take += high[:k_high] return _fill(take) def _wrap(numbers: List[int]) -> Dict[str, object]: d = {"numbers": numbers} if star is not None: d["star"] = int(star) return d # Portfolio (10 tickets) portfolio = { "spread_low_1": _wrap(_pick(3, 2, 0)), "spread_low_2": _wrap(_pick(3, 2, 0)[::-1]), "spread_low_3": _wrap(_pick(3, 1, 1)), "spread_normal_1": _wrap(_pick(2, 2, 1)), "spread_normal_2": _wrap(_pick(1, 3, 1)), "spread_normal_3": _wrap(_pick(2, 1, 2)), "spread_high_1": _wrap(_pick(1, 1, 3)), "spread_high_2": _wrap(_pick(0, 2, 3)), "spread_high_3": _wrap(_pick(1, 0, 4) if main_n == 5 else _pick(1, 1, main_n - 2)), "spread_bridge_1": _wrap(_pick(2, 1, 2)), } return portfolio def generate_prediction_v4_god( # name kept for compatibility raw_df: pd.DataFrame, cfg: GameConfig, ) -> Dict[str, object]: """ Main GOD MODE engine (V5.3.1 ULTRA behavior on top of V5.2). - Builds multi-window ML models - Computes multi-agent scores (including cluster/drift/parity) - Applies last-4 repeater ban (your consecutive rule) - Applies V5.3.1 corrections: * regime detection (low/flat/high) * low-zone boost * inverse trend correction * cold-burst correction * anti-lock rule (prevent over-using same number across sets) * coverage optimizer across the 5–6 styles - Generates styled combos: top_cluster, balanced, low_cluster, high_cluster, tight_cluster, wide_spread """ df = _ensure_datetime(raw_df, cfg.csv_date_col) if cfg.clean_func and cfg.clean_func in globals(): df = globals()[cfg.clean_func](df) if len(df) < 40: raise ValueError("Insufficient history (<40 draws) for GOD-MODE engine.") df_long = _limit_history(df, _auto_history_window(df, cfg)) # Core multi-window ML + agent scoring ml_models = build_multiwindow_ml(df_long, cfg, windows=[20, 80, 400]) freq_features = create_frequency_features(df_long, cfg, windows=[20, 80, 400]) agent_scores = compute_agent_scores(df_long, cfg, ml_models, freq_features) base_scores = combine_agent_scores(agent_scores, cfg) # V5.3.1 correction layer (regime, low-zone, inverse trend, cold-burst) final_scores, regime_info, coldness = _adjust_scores_v5_3(df_long, cfg, base_scores) # Last-4 repeater ban (your rule) banned_nums = get_last4_repeater_ban(df_long, cfg) # Optional streak guard (OFF by default): # - allows repeats up to 3 consecutive draws # - gently downweights numbers already on a 3-draw streak final_scores, extra_banned = apply_streak_guard(final_scores, df_long, cfg) banned_nums = set(banned_nums) | set(extra_banned) # PB_TAIL_SLOT_PATCH_V1 wire enforce_pb_tail_slot = False if cfg.name == "Powerball" and len(df_long) >= 8: last8 = df_long[cfg.main_cols].tail(8).values.flatten() last8 = [int(v) for v in last8 if not pd.isna(v)] enforce_pb_tail_slot = not any(65 <= v <= 69 for v in last8) god_sets: List[Dict[str, object]] = [] usage_counts: Counter = Counter() # track usage across all styles def _make_style_scores(style_name: str, scores: Dict[int, float]) -> Dict[int, float]: """ Per-style adjustment: - Anti-lock rule (cap over-used numbers). - Extra cold-burst compensation if a lock is happening. - Micro-clustering: boost neighbors of strong numbers a bit. """ adjusted_style: Dict[int, float] = {} # Detect whether any number has been used twice already max_used = max(usage_counts.values()) if usage_counts else 0 lock_phase = (max_used >= 2) # Precompute which numbers are "strong" for micro-clustering vals_style = np.array(list(scores.values()), dtype=float) if vals_style.size == 0: return scores vmin_s, vmax_s = float(vals_style.min()), float(vals_style.max()) thresh = vmin_s + 0.75 * (vmax_s - vmin_s) if vmax_s > vmin_s else vmin_s strong_numbers = {n for n, s_val in scores.items() if s_val >= thresh} for n_val, s_val in scores.items(): m_style = 1.0 used = usage_counts.get(n_val, 0) # Anti-lock across sets if used >= 2: m_style *= (0.20 if (("lucky for life" in (getattr(cfg, "name", "") or "").lower()) or (int(getattr(cfg, "main_max", 0)) == 48)) else 0.25) elif used == 1: m_style *= (0.55 if (("lucky for life" in (getattr(cfg, "name", "") or "").lower()) or (int(getattr(cfg, "main_max", 0)) == 48)) else 0.65) # Extra cold compensation in lock phase if lock_phase: c_val = coldness.get(n_val, 0.5) m_style *= (1.0 + 0.40 * c_val) # Micro-clustering: if this number neighbors a strong number, give it a nudge if (n_val - 1 in strong_numbers) or (n_val + 1 in strong_numbers): m_style *= 1.08 adjusted_style[n_val] = max(m_style * s_val, 0.0) # Normalize to [0,1] vals_adj_style = np.array(list(adjusted_style.values()), dtype=float) if vals_adj_style.size == 0: return scores vmin_as, vmax_as = float(vals_adj_style.min()), float(vals_adj_style.max()) if vmax_as > vmin_as: for k in adjusted_style.keys(): adjusted_style[k] = float((adjusted_style[k] - vmin_as) / (vmax_as - vmin_as)) else: for k in adjusted_style.keys(): adjusted_style[k] = 0.5 return adjusted_style # 1) TOP-CLUSTER combo: force highest-score core together top_combo, top_score = generate_top_cluster_combo( df_long, cfg, final_scores, banned_nums=banned_nums, top_n_core=3, n_candidates=3000, ) top_star = pick_star_ball(df_long, cfg) god_sets.append( { "style": "top_cluster", "numbers": [int(x) for x in sorted(top_combo)], "star": int(top_star) if top_star is not None else None, "score": float(top_score), } ) usage_counts.update(int(x) for x in top_combo) # 2) Other main styles styles = [ "balanced", "low_cluster", "high_cluster", "tight_cluster", "wide_spread", ] for style in styles: style_scores = _make_style_scores(style, final_scores) combo, combo_score = generate_godmode_combo( df_long, cfg, style_scores, banned_nums=banned_nums, n_candidates=4000, style=style, ) star = pick_star_ball(df_long, cfg) god_sets.append( { "style": style, "numbers": [int(x) for x in sorted(combo)], "star": int(star) if star is not None else None, "score": float(combo_score), } ) usage_counts.update(int(x) for x in combo) # Coverage optimizer: adjust last 1–2 sets if coverage is weak if len(god_sets) >= 4: # Compute global coverage & high-score candidates all_used = set() for s_set in god_sets: all_used.update(int(x) for x in s_set["numbers"]) # Target extra numbers: high-score but not yet used sorted_nums = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) coverage_targets = [int(n) for n, sc in sorted_nums if int(n) not in all_used][:15] def _rebuild_for_coverage(style_name: str, base_scores_cov: Dict[int, float]) -> Tuple[List[int], float]: coverage_scores: Dict[int, float] = {} for n_cov, s_cov in base_scores_cov.items(): m_cov = 1.0 if n_cov in coverage_targets: m_cov *= 1.25 # strong push for uncovered high-score numbers # small micro-cluster around coverage targets if (n_cov - 1 in coverage_targets) or (n_cov + 1 in coverage_targets): m_cov *= 1.08 coverage_scores[n_cov] = max(m_cov * s_cov, 0.0) vals_cov = np.array(list(coverage_scores.values()), dtype=float) if vals_cov.size == 0: coverage_scores = base_scores_cov else: vmin_c, vmax_c = float(vals_cov.min()), float(vals_cov.max()) if vmax_c > vmin_c: for k in coverage_scores.keys(): coverage_scores[k] = float((coverage_scores[k] - vmin_c) / (vmax_c - vmin_c)) else: for k in coverage_scores.keys(): coverage_scores[k] = 0.5 combo_cov, score_cov = generate_godmode_combo( df_long, cfg, coverage_scores, banned_nums=banned_nums, n_candidates=4000, style=style_name, ) return [int(x) for x in sorted(combo_cov)], float(score_cov) # Rebuild last 1–2 styles for better coverage (usually tight_cluster & wide_spread) for idx in range(len(god_sets) - 2, len(god_sets)): style_name = god_sets[idx]["style"] if style_name in ("tight_cluster", "wide_spread", "high_cluster"): new_nums, new_score = _rebuild_for_coverage(style_name, final_scores) god_sets[idx]["numbers"] = new_nums god_sets[idx]["score"] = new_score # Select primary combo: prefer balanced, else fall back to top_cluster primary = next((s for s in god_sets if s["style"] == "balanced"), god_sets[0]) sorted_nums_expl = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) top_explain = sorted_nums_expl[:10] explanation = { "top_numbers": [ {"num": int(n), "score": float(round(s_val, 4))} for n, s_val in top_explain ], "banned_last4_repeater": sorted(int(x) for x in banned_nums), "regime": regime_info, "usage_counts": {int(k): int(v) for k, v in usage_counts.items()}, } # ------------------------------------------------------------ # Diversify the 5 GOD MODE sets (limit overlap) # Goal: prevent over-concentration (e.g., 11-12-30 core in 4-5 sets). # Applies conservatively to Gimme5 / Megabucks / Lucky for Life only. # ------------------------------------------------------------ try: name_l = (getattr(cfg, "name", "") or "").lower() is_g5 = ("gimme" in name_l) or (int(getattr(cfg, "main_max", 0)) == 39) is_mb = ("megabucks" in name_l) or (int(getattr(cfg, "main_max", 0)) == 45) is_l4l = ("lucky for life" in name_l) or (int(getattr(cfg, "main_max", 0)) == 48) is_la = ("lotto america" in name_l) or (int(getattr(cfg, "main_max", 0)) == 52) if (is_g5 or is_mb or is_l4l or is_la) and len(god_sets) >= 3: max_overlap = 1 if is_mb else 2 # MB stricter overlap; others default main_n = int(len(cfg.main_cols)) # candidate pool by score (descending) _pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] def _overlap(a, b) -> int: return len(set(int(x) for x in a) & set(int(x) for x in b)) def _best_replacement(cur_nums: List[int], replace_n: int, i_set: int) -> Optional[int]: cur_set = set(int(x) for x in cur_nums) # prefer candidates that reduce overlap with ALL previous sets for cand in _pool: if cand in cur_set: continue if cand < int(cfg.main_min) or cand > int(cfg.main_max): continue trial = (cur_set - {int(replace_n)}) | {int(cand)} ok = True for j in range(i_set): prev = god_sets[j].get("numbers", []) or [] if len(trial & set(int(x) for x in prev)) > max_overlap: ok = False break if ok: return int(cand) return None # Walk sets in order; adjust later sets to respect max_overlap vs earlier sets for i_set in range(1, min(len(god_sets), 5)): nums_i = [int(x) for x in (god_sets[i_set].get("numbers", []) or [])] if len(nums_i) != main_n: continue # Loop until overlap is within limits (bounded attempts) for _attempt in range(20): worst_j = None worst_ov = 0 for j in range(i_set): ov = _overlap(nums_i, god_sets[j].get("numbers", []) or []) if ov > worst_ov: worst_ov = ov worst_j = j if worst_ov <= max_overlap or worst_j is None: break prev_nums = [int(x) for x in (god_sets[worst_j].get("numbers", []) or [])] ov_set = sorted(set(nums_i) & set(prev_nums)) if not ov_set: break # Replace the weakest-overlap number (lowest final score among overlap) replace_n = min(ov_set, key=lambda n: float(final_scores.get(int(n), 0.0))) repl = _best_replacement(nums_i, replace_n, i_set) if repl is None: break nums_i = sorted((set(nums_i) - {int(replace_n)}) | {int(repl)}) if len(nums_i) != main_n: # if uniqueness collapsed, repair by filling with best candidates nums_set = set(nums_i) for cand in _pool: if len(nums_set) >= main_n: break if cand in nums_set: continue nums_set.add(int(cand)) nums_i = sorted(list(nums_set))[:main_n] # Save back god_sets[i_set]["numbers"] = [int(x) for x in nums_i] # -------------------------------------------------------- # Megabucks: add ONE "Tail Coverage" ticket to hedge regime flips # Constraints (MB main 1-45): # - 2 numbers from low (1-12) # - 1 number from mid (13-29) # - 2 numbers from high (30-45) # Replaces the weakest-scoring GOD MODE set if needed. # -------------------------------------------------------- if is_mb and len(god_sets) >= 5: low_rng = range(1, 13) mid_rng = range(13, 30) high_rng = range(30, int(cfg.main_max) + 1) def _sum_score(nums): return sum(float(final_scores.get(int(x), 0.0)) for x in nums) def _pick_from_range(rng, k, used): picked = [] for cand in _pool: if cand in used: continue if cand in rng: picked.append(int(cand)) used.add(int(cand)) if len(picked) >= k: break return picked # Build candidate tail ticket from top-scoring pool used = set() t_low = _pick_from_range(low_rng, 2, used) t_high = _pick_from_range(high_rng, 2, used) t_mid = _pick_from_range(mid_rng, 1, used) tail_ticket = sorted(set(t_low + t_mid + t_high)) # If we couldn't meet the structure, skip (never break predictions) if len(tail_ticket) == main_n: def _is_tail_struct(nums): s = set(int(x) for x in nums) return (len(s & set(low_rng)) >= 2) and (len(s & set(high_rng)) >= 2) # Only enforce if none of the 5 sets already provides tail coverage already = any(_is_tail_struct(s.get("numbers", []) or []) for s in god_sets[:5]) if not already: # Replace weakest of the 5 by sum-score scored_sets = [] for i0 in range(5): nums0 = god_sets[i0].get("numbers", []) or [] if len(nums0) == main_n: scored_sets.append((i0, _sum_score(nums0))) if scored_sets: weakest_i = sorted(scored_sets, key=lambda x: x[1])[0][0] god_sets[weakest_i]["numbers"] = [int(x) for x in tail_ticket] except Exception: # Never fail predictions due to diversification pass # FINAL HARD GUARD: ensure strike tickets are never identical (all games) try: st = result.get("strike_tickets", {}) c = st.get("collapse", {}).get("numbers", []) n = st.get("neighbor", {}).get("numbers", []) if c and n and set(int(x) for x in c) == set(int(x) for x in n): # force a deterministic difference using best unused candidate pool = [int(x) for x, _ in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] used = set(int(x) for x in c) for cand in pool_local: if cand not in used and int(cfg.main_min) <= cand <= int(cfg.main_max): nn = list(n) nn[-1] = int(cand) st["neighbor"]["numbers"] = sorted(set(nn))[:len(c)] break except Exception: pass model_info = { "numbers_modeled": len(ml_models), "total_possible": cfg.main_max - cfg.main_min + 1, } # ------------------------------------------------------------ # Strike Tickets (Consensus) - GUARANTEED UNIQUE # Provided for UI consumers (e.g., app.py) to avoid duplicates. # ------------------------------------------------------------ # ============================================================ # PATCH PACK — post-process GOD MODE sets (toggleable) # ============================================================ try: _allowed_main = set(range(int(cfg.main_min), int(cfg.main_max) + 1)) _banned_main = set(banned_nums) if "banned_nums" in locals() else set() # MM Mid-band Escape (Mega Millions) — additive only # Forces one extra set with 3+ numbers in 30–45 band to cover "mid-high compression" draws. if PATCH_UI_FLAGS.get("mm_midband_escape", True) and cfg.name == "Mega Millions": try: main_n = int(getattr(cfg, "main_n", 5)) mid_rng = list(range(30, 46)) chosen = [] # Pick top 3 mid-band numbers by score (not banned) mid_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in mid_rng if int(n) in _allowed_main and int(n) not in _banned_main], key=lambda t: t[1], reverse=True, ) for n, _sc in mid_scored: if int(n) not in chosen: chosen.append(int(n)) if len(chosen) >= 3: break # Fill remaining slots from global scores (excluding already chosen) global_scored = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) for n, _sc in global_scored: n = int(n) if n in _banned_main or n not in _allowed_main or n in chosen: continue chosen.append(n) if len(chosen) >= main_n: break chosen = sorted(set(chosen))[:main_n] if len(chosen) == main_n: star = pick_star_ball(df_long, cfg) score = sum(float(final_scores.get(int(x), 0.0)) for x in chosen) # Only add if not duplicate of an existing set if not any(set(s.get("numbers", []) or []) == set(chosen) for s in god_sets): god_sets.append( { "style": "midband_escape", "numbers": [int(x) for x in chosen], "star": int(star) if star is not None else None, "score": float(score), } ) except Exception: pass # G5 Fusion Cluster (Gimme 5) — additive only # Purpose: merge (a) mid-band anchor signal (14–19) with (b) core/common numbers and (c) one 20–29 band number. # This targets draws like 14-16-18-25-31 where pieces appear across multiple sets. if PATCH_UI_FLAGS.get("g5_fusion_cluster", True) and ("Gimme" in str(getattr(cfg, "name", "")) or str(getattr(cfg, "key", "")).lower() in ("g5","gimme5")): try: main_n = int(getattr(cfg, "main_n", 5)) chosen = [] # (1) Pick top 2 from mid band 14–19 by score mid_band = list(range(14, 20)) mid_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in mid_band if int(n) in _allowed_main and int(n) not in _banned_main], key=lambda t: t[1], reverse=True, ) for n, _sc in mid_scored: if int(n) not in chosen: chosen.append(int(n)) if len(chosen) >= 2: break # (2) Core/common: pick top 2 most frequent across existing god sets (excluding chosen) freq = {} for s in god_sets: for n in (s.get("numbers") or []): try: n = int(n) except Exception: continue if n in _banned_main or n not in _allowed_main: continue freq[n] = freq.get(n, 0) + 1 core_sorted = sorted(freq.items(), key=lambda kv: (kv[1], float(final_scores.get(int(kv[0]), 0.0))), reverse=True) for n, _ct in core_sorted: n = int(n) if n in chosen: continue chosen.append(n) if len(chosen) >= 4: break # (3) One 20–29 band number by score (excluding chosen) band_20_29 = list(range(20, 30)) band_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in band_20_29 if int(n) in _allowed_main and int(n) not in _banned_main and int(n) not in chosen], key=lambda t: t[1], reverse=True, ) for n, _sc in band_scored: chosen.append(int(n)) break # Fill remaining slots (if any) from global scores global_scored = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) for n, _sc in global_scored: n = int(n) if n in _banned_main or n not in _allowed_main or n in chosen: continue chosen.append(n) if len(chosen) >= main_n: break # Finalize chosen = sorted(set(int(x) for x in chosen)) chosen = chosen[:main_n] if len(chosen) == main_n: star = None # Gimme5 has no bonus score = sum(float(final_scores.get(int(x), 0.0)) for x in chosen) if not any(set((s.get("numbers") or [])) == set(chosen) for s in god_sets): god_sets.append( { "style": "g5_fusion_cluster", "numbers": [int(x) for x in chosen], "star": star, "score": float(score), } ) except Exception: pass # L4L Mid-band Escape (Lucky for Life) — additive only # Purpose: cover mid-high compression draws by forcing 3+ numbers from 20–40, # then allowing one low (1–19) and one high (41–48) when scores support it. if PATCH_UI_FLAGS.get("l4l_midband_escape", True) and ("Lucky for Life" in str(getattr(cfg, "name", "")) or str(getattr(cfg, "key", "")).lower() in ("l4l","lucky4life","lucky_for_life")): try: main_n = int(getattr(cfg, "main_n", 5)) chosen = [] # Prefer 3 mid-band numbers (20–40) by score mid_rng = list(range(20, 41)) mid_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in mid_rng if int(n) in _allowed_main and int(n) not in _banned_main], key=lambda t: t[1], reverse=True, ) for n, _sc in mid_scored: if int(n) not in chosen: chosen.append(int(n)) if len(chosen) >= 3: break # Add one low (1–19) by score if room if len(chosen) < main_n: low_rng = list(range(1, 20)) low_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in low_rng if int(n) in _allowed_main and int(n) not in _banned_main and int(n) not in chosen], key=lambda t: t[1], reverse=True, ) for n, _sc in low_scored: chosen.append(int(n)) break # Add one high (41–48) by score if room if len(chosen) < main_n: high_rng = list(range(41, 49)) high_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in high_rng if int(n) in _allowed_main and int(n) not in _banned_main and int(n) not in chosen], key=lambda t: t[1], reverse=True, ) for n, _sc in high_scored: chosen.append(int(n)) break # Fill remaining from global scores global_scored = sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True) for n, _sc in global_scored: n = int(n) if n in _banned_main or n not in _allowed_main or n in chosen: continue chosen.append(n) if len(chosen) >= main_n: break chosen = sorted(set(int(x) for x in chosen))[:main_n] if len(chosen) == main_n: star = pick_star_ball(df_long, cfg) score = sum(float(final_scores.get(int(x), 0.0)) for x in chosen) if not any(set((s.get("numbers") or [])) == set(chosen) for s in god_sets): god_sets.append( { "style": "l4l_midband_escape", "numbers": [int(x) for x in chosen], "star": int(star) if star is not None else None, "score": float(score), } ) except Exception: pass # LA Mid-band Escape (Lotto America) — additive only # Purpose: force mid-band coverage similar to MM/G5/L4L escapes. # Rules: 3 numbers from 15–40, 1 low (1–14), 1 high (41–52). if PATCH_UI_FLAGS.get("la_midband_escape", True) and ("Lotto America" in str(getattr(cfg, "name", "")) or str(getattr(cfg, "key", "")).lower() in ("la","lottoamerica","lotto_america")): try: main_n = int(getattr(cfg, "main_n", 5)) chosen = [] # (1) Mid band 15–40 (pick 3) mid_rng = list(range(15, 41)) mid_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in mid_rng if int(n) in _allowed_main and int(n) not in _banned_main], key=lambda t: t[1], reverse=True, ) for n, _ in mid_scored: chosen.append(int(n)) if len(chosen) >= 3: break # (2) One low 1–14 if len(chosen) < main_n: low_rng = list(range(1, 15)) low_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in low_rng if int(n) in _allowed_main and int(n) not in _banned_main and int(n) not in chosen], key=lambda t: t[1], reverse=True, ) for n, _ in low_scored: chosen.append(int(n)) break # (3) One high 41–52 if len(chosen) < main_n: high_rng = list(range(41, 53)) high_scored = sorted( [(n, float(final_scores.get(int(n), 0.0))) for n in high_rng if int(n) in _allowed_main and int(n) not in _banned_main and int(n) not in chosen], key=lambda t: t[1], reverse=True, ) for n, _ in high_scored: chosen.append(int(n)) break # Fill remaining slots for n, _ in sorted(final_scores.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in chosen or n in _banned_main or n not in _allowed_main: continue chosen.append(n) if len(chosen) >= main_n: break chosen = sorted(set(chosen))[:main_n] if len(chosen) == main_n: star = pick_star_ball(df_long, cfg) score = sum(float(final_scores.get(int(x), 0.0)) for x in chosen) if not any(set((s.get("numbers") or [])) == set(chosen) for s in god_sets): god_sets.append( { "style": "la_midband_escape", "numbers": chosen, "star": int(star) if star is not None else None, "score": float(score), } ) except Exception: pass # Deep-low injection into Top Cluster OR Balanced (first available) if PATCH_UI_FLAGS.get("deep_low_patch", True): _dl_min, _dl_max = _patch_game_deep_low_range(cfg) for _target_style in ("top_cluster", "balanced"): for _s in god_sets: if (_s.get("style") == _target_style) and isinstance(_s.get("numbers", None), list): _s["numbers"] = _patch_deep_low_inject_into_set(_s["numbers"], final_scores, _allowed_main, _banned_main, _dl_min, _dl_max) break # Tight cluster relaxation if PATCH_UI_FLAGS.get("tight_relax_patch", True): for _s in god_sets: if (_s.get("style") == "tight_cluster") and isinstance(_s.get("numbers", None), list): _s["numbers"] = _patch_relax_tight_cluster(_s["numbers"], final_scores, _allowed_main, _banned_main, max_gap=9, max_same_decade=3) break except Exception: pass def _build_unique_strike_tickets() -> Dict[str, object]: """ Strike Tickets (Consensus) — GUARANTEED UNIQUE collapse: top N numbers by (frequency-in-god-sets, score) neighbor (ANTI-CONSENSUS HEDGE): start from collapse, then replace TWO numbers: - one replacement pulled from the LOW tail band - one replacement pulled from the HIGH tail band This hedges regime flips and avoids "consensus trap". Works for ALL games, including Powerball and Lucky for Life. """ main_n = int(len(cfg.main_cols)) # Count appearances across GOD MODE sets (kept for diagnostics, but collapse selection is score-first) counts: Dict[int, int] = {} for s in god_sets: for n in (s.get("numbers", []) or []): nn = int(n) counts[nn] = counts.get(nn, 0) + 1 # Consensus = vote-count (3x → 2x → 1x) from GOD MODE sets counts: Dict[int, int] = {} for s in god_sets: for n in (s.get("numbers", []) or []): nn = int(n) counts[nn] = counts.get(nn, 0) + 1 by_votes = {3: [], 2: [], 1: []} for n, c in counts.items(): if c >= 3: by_votes[3].append(n) elif c == 2: by_votes[2].append(n) elif c == 1: by_votes[1].append(n) for k in by_votes: by_votes[k] = sorted(by_votes[k], key=lambda x: float(final_scores.get(int(x), 0.0)), reverse=True) collapse_nums = [] for k in (3, 2, 1): for n in by_votes[k]: if n not in collapse_nums: collapse_nums.append(int(n)) if len(collapse_nums) >= main_n: break if len(collapse_nums) >= main_n: break if len(collapse_nums) < main_n: pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] for cand in pool_local: if cand not in collapse_nums: collapse_nums.append(int(cand)) if len(collapse_nums) >= main_n: break collapse_nums = sorted(collapse_nums[:main_n]) # Pick a bonus (star / lucky ball / megaball) for strike tickets when the game has one. # Prefer the primary (Top Cluster) star if available, else most common star across GOD sets, # else random valid star. collapse_star = None try: # primary_star exists in the outer scope of generate_prediction_v4_god if cfg.star_col and 'primary_star' in locals() and primary_star is not None: collapse_star = int(primary_star) except Exception: pass try: if collapse_star is None and cfg.star_col: _sfreq = {} for s in god_sets: stv = s.get("star", None) if stv is None: continue try: stv = int(stv) except Exception: continue _sfreq[stv] = _sfreq.get(stv, 0) + 1 if _sfreq: collapse_star = sorted(_sfreq.items(), key=lambda kv: kv[1], reverse=True)[0][0] except Exception: pass try: if collapse_star is None and cfg.star_col and cfg.star_min is not None and cfg.star_max is not None: collapse_star = int(cfg.star_min) except Exception: pass # Candidate pool by score descending (all scored numbers) — already built above as `pool` collapse_set = set(collapse_nums) # Identify TWO weakest collapse numbers by score (these get replaced) weakest_two = sorted( collapse_nums, key=lambda n: float(final_scores.get(int(n), 0.0)) )[:2] if len(collapse_nums) >= 2 else list(collapse_nums) main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 99)) # Detect common games (for strike-hedge tuning) name_l = (getattr(cfg, "name", "") or "").lower() is_pb = ("powerball" in name_l) or (int(getattr(cfg, "main_max", 0)) == 69) # Tail bands: dynamic by range width (with Powerball high-tail specialization) width = max(1, main_max - main_min + 1) if is_pb: # Powerball main numbers 1-69: high tail is where regime flips often happen low_lo, low_hi = main_min, min(main_max, main_min + 11) # 1-12 (available if needed) high_lo, high_hi = max(main_min, 65), main_max # 60-69 (explicit) else: band = 12 if width >= 36 else max(6, int(width * 0.25)) low_lo, low_hi = main_min, min(main_max, main_min + band - 1) high_lo, high_hi = max(main_min, main_max - band + 1), main_max def _best_from_band(lo: int, hi: int, banned: set) -> int: pool_local = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] for cand in pool_local: if cand in banned: continue if lo <= cand <= hi: return int(cand) # fallback: best overall not banned for cand in pool_local: if cand not in banned and main_min <= cand <= main_max: return int(cand) # last resort: return something (should never happen) return int(main_min) neighbor_nums = list(collapse_nums) banned = set(collapse_set) # Replace weakest numbers with tail candidates. # Powerball special: TWO high-tail replacements (60-69) to hedge high-tail regime flips. if weakest_two: w0 = int(weakest_two[0]) if is_pb: pick0 = _best_from_band(high_lo, high_hi, banned) else: pick0 = _best_from_band(low_lo, low_hi, banned) if pick0 not in banned: try: i = neighbor_nums.index(w0) neighbor_nums[i] = int(pick0) except ValueError: neighbor_nums[-1] = int(pick0) banned.add(int(pick0)) if len(weakest_two) >= 2: w1 = int(weakest_two[1]) pick1 = _best_from_band(high_lo, high_hi, banned) if pick1 not in banned: try: i = neighbor_nums.index(w1) neighbor_nums[i] = int(pick1) except ValueError: neighbor_nums[-1] = int(pick1) banned.add(int(pick1)) # Clean up duplicates & size neighbor_nums = sorted(set(int(x) for x in neighbor_nums)) if len(neighbor_nums) < main_n: for cand in pool_local: if cand in neighbor_nums: continue if main_min <= int(cand) <= main_max: neighbor_nums.append(int(cand)) if len(neighbor_nums) >= main_n: break neighbor_nums = sorted(neighbor_nums[:main_n]) elif len(neighbor_nums) > main_n: neighbor_nums = sorted(neighbor_nums[:main_n]) # Final hard guard: never identical if set(neighbor_nums) == set(collapse_nums) and neighbor_nums: for cand in pool_local: if cand not in collapse_set and main_min <= int(cand) <= main_max: neighbor_nums[-1] = int(cand) neighbor_nums = sorted(set(neighbor_nums))[:main_n] break neighbor_nums = sorted(neighbor_nums) return { "collapse": {"numbers": collapse_nums, "star": collapse_star}, "neighbor": {"numbers": neighbor_nums, "star": collapse_star}, } # ------------------------------------------------------------ # Controlled 1-repeat logic (Gimme5 + Lucky for Life only) # Enforce EXACTLY ONE repeat from the previous draw for: # - Top Cluster # - Balanced # (Other sets remain untouched.) # ------------------------------------------------------------ try: _name_l = (getattr(cfg, "name", "") or "").lower() _is_g5 = ("gimme" in _name_l) or (int(getattr(cfg, "main_max", 0)) == 39 and int(len(getattr(cfg, "main_cols", []))) == 5) _is_l4l = ("lucky for life" in _name_l) or (int(getattr(cfg, "main_max", 0)) == 48 and int(len(getattr(cfg, "main_cols", []))) == 5) _is_repeat_game = _is_g5 or _is_l4l if _is_repeat_game and len(god_sets) >= 2: # Previous draw numbers (latest completed draw in history) _prev = [] try: _prev = [int(df_long.iloc[-1][c]) for c in cfg.main_cols if str(df_long.iloc[-1][c]).strip() != ""] except Exception: _prev = [] _prev_set = set(int(x) for x in _prev if x is not None) main_n = int(len(cfg.main_cols)) main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 99)) # Candidate pool by score (descending) _pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] def _enforce_exactly_one_repeat(nums): nums = [int(x) for x in (nums or [])] if not _prev_set or len(nums) != main_n: return sorted(nums) overlap = sorted(set(nums) & _prev_set) if len(overlap) == 1: return sorted(nums) # If 0 repeats: add best prev, drop weakest non-prev if len(overlap) == 0: add_cand = None for cand in _pool: if cand in _prev_set and main_min <= cand <= main_max and cand not in nums: add_cand = int(cand) break if add_cand is None: return sorted(nums) droppable = [n for n in nums if n not in _prev_set] or list(nums) drop_n = min(droppable, key=lambda n: float(final_scores.get(int(n), 0.0))) new_set = sorted((set(nums) - {int(drop_n)}) | {int(add_cand)}) new_set = [n for n in new_set if main_min <= n <= main_max] return sorted(new_set[:main_n]) if len(new_set) >= main_n else sorted(nums) # If 2+ repeats: keep best repeat, replace others keep = max(overlap, key=lambda n: float(final_scores.get(int(n), 0.0))) kept = [n for n in nums if n not in _prev_set or n == keep] sset = set(kept) for cand in _pool: if cand in _prev_set or cand in sset: continue if main_min <= cand <= main_max: sset.add(int(cand)) if len(sset) >= main_n: break new_list = sorted(list(sset))[:main_n] # final guard: ensure exactly one repeat reps = sorted(set(new_list) & _prev_set) if len(reps) == 0: if keep not in new_list: drop_n = min(new_list, key=lambda n: float(final_scores.get(int(n), 0.0))) new_list = sorted((set(new_list) - {int(drop_n)}) | {int(keep)})[:main_n] elif len(reps) > 1: best = max(reps, key=lambda n: float(final_scores.get(int(n), 0.0))) new_list = [n for n in new_list if n not in _prev_set or n == best] sset = set(new_list) for cand in _pool: if cand in _prev_set or cand in sset: continue if main_min <= cand <= main_max: sset.add(int(cand)) if len(sset) >= main_n: break new_list = sorted(list(sset))[:main_n] return sorted(new_list) # Apply to Top Cluster and Balanced only (index 0 and 1) god_sets[0]["numbers"] = _enforce_exactly_one_repeat(god_sets[0].get("numbers", [])) god_sets[1]["numbers"] = _enforce_exactly_one_repeat(god_sets[1].get("numbers", [])) except Exception: pass # ------------------------------------------------------------ # Mega Millions: ONE extreme-tail hedge ticket (main only) # Goal: reduce "total bust" nights when MM spikes into 63-70 range. # Rule (MM main 1-70): # - 2 numbers from 63-70 # - 1 number from 45-55 # - fill remaining with best-scoring non-used numbers # Replaces the weakest-scoring GOD MODE set if none already provides this coverage. # ------------------------------------------------------------ try: _name_l = (getattr(cfg, "name", "") or "").lower() _is_mm = ("mega" in _name_l and "mill" in _name_l) or (int(getattr(cfg, "main_max", 0)) == 70 and int(len(getattr(cfg, "main_cols", []))) == 5) if _is_mm and len(god_sets) >= 5: main_n = int(len(cfg.main_cols)) main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 70)) hi_tail = range(max(main_min, 63), main_max + 1) # 63-70 mid_hi = range(max(main_min, 45), min(main_max, 55) + 1) # 45-55 _pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] def _sum_score(nums): return sum(float(final_scores.get(int(x), 0.0)) for x in nums) def _pick_from(rng, k, used): picked = [] for cand in _pool: if cand in used: continue if cand in rng and main_min <= cand <= main_max: picked.append(int(cand)) used.add(int(cand)) if len(picked) >= k: break return picked def _mm_tail_ok(nums): s = set(int(x) for x in nums) return (len(s & set(hi_tail)) >= 2) and (len(s & set(mid_hi)) >= 1) already = any(_mm_tail_ok(s.get("numbers", []) or []) for s in god_sets[:5]) if not already: used = set() a = _pick_from(hi_tail, 2, used) b = _pick_from(mid_hi, 1, used) tail_ticket = list(a + b) for cand in _pool: if cand in used: continue if main_min <= cand <= main_max: tail_ticket.append(int(cand)) used.add(int(cand)) if len(tail_ticket) >= main_n: break tail_ticket = sorted(set(tail_ticket)) if len(tail_ticket) == main_n and _mm_tail_ok(tail_ticket): scored = [] for i0 in range(5): nums0 = god_sets[i0].get("numbers", []) or [] if len(nums0) == main_n: scored.append((i0, _sum_score(nums0))) if scored: weakest_i = sorted(scored, key=lambda x: x[1])[0][0] god_sets[weakest_i]["numbers"] = [int(x) for x in tail_ticket] except Exception: pass # ------------------------------------------------------------ # Megabucks: ONE upper-tail hedge ticket (main only) # Goal: reduce "total bust" nights when MB spikes into 37-41 range. # Rule (MB main 1-41): # - 1 number from 37-41 (upper tail) # - 1 number from 25-32 (upper-mid) # - fill remaining with best-scoring non-used numbers # Replaces the weakest-scoring GOD MODE set if none already provides this coverage. # ------------------------------------------------------------ try: _name_l = (getattr(cfg, "name", "") or "").lower() _key_l = (getattr(cfg, "key", "") or "").lower() _is_mb = ("megabuck" in _name_l) or (_key_l == "mb") or ( int(getattr(cfg, "main_max", 0)) == 41 and int(len(getattr(cfg, "main_cols", []))) == 5 ) if _is_mb and len(god_sets) >= 5: main_n = int(len(cfg.main_cols)) main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 41)) upper_tail = range(max(main_min, 37), main_max + 1) # 37-41 upper_mid = range(max(main_min, 25), min(main_max, 32) + 1) # 25-32 _pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] def _sum_score(nums): return sum(float(final_scores.get(int(x), 0.0)) for x in nums) def _pick_from(rng, k, used): picked = [] for cand in _pool: if cand in used: continue if cand in rng and main_min <= cand <= main_max: picked.append(int(cand)) used.add(int(cand)) if len(picked) >= k: break return picked def _mb_tail_ok(nums): s = set(int(x) for x in (nums or [])) return (len(s & set(upper_tail)) >= 1) and (len(s & set(upper_mid)) >= 1) already = any(_mb_tail_ok(s.get("numbers", []) or []) for s in god_sets[:5]) if not already: used = set() a = _pick_from(upper_tail, 1, used) b = _pick_from(upper_mid, 1, used) tail_ticket = list(a + b) for cand in _pool: if cand in used: continue if main_min <= cand <= main_max: tail_ticket.append(int(cand)) used.add(int(cand)) if len(tail_ticket) >= main_n: break tail_ticket = sorted(set(tail_ticket)) if len(tail_ticket) == main_n and _mb_tail_ok(tail_ticket): scored = [] for i0 in range(5): nums0 = god_sets[i0].get("numbers", []) or [] if len(nums0) == main_n: scored.append((i0, _sum_score(nums0))) if scored: weakest_i = sorted(scored, key=lambda x: x[1])[0][0] god_sets[weakest_i]["numbers"] = [int(x) for x in tail_ticket] except Exception: pass # ------------------------------------------------------------ # Lotto America: ONE upper-tail hedge ticket (main only) # Goal: reduce bust nights when LA spikes into 38-47 range. # Rule (LA main 1-52): # - 1 number from 38-47 (upper tail) # - 1 number from 25-33 (upper-mid) # - fill remaining with best-scoring non-used numbers # Replaces the weakest-scoring GOD MODE set if none already provides this coverage. # ------------------------------------------------------------ try: _name_l = (getattr(cfg, "name", "") or "").lower() _key_l = (getattr(cfg, "key", "") or "").lower() _is_la = ("lotto america" in _name_l) or (_key_l == "la") or ( int(getattr(cfg, "main_max", 0)) == 52 and int(len(getattr(cfg, "main_cols", []))) == 5 ) if _is_la and bool(PATCH_UI_FLAGS.get("la_upper_tail_escape", True)) and len(god_sets) >= 5: main_n = int(len(cfg.main_cols)) main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 52)) upper_tail = range(max(main_min, 38), min(main_max, 47) + 1) # 38-47 upper_mid = range(max(main_min, 25), min(main_max, 33) + 1) # 25-33 _pool = [int(n) for n, _sc in sorted( final_scores.items(), key=lambda kv: float(kv[1]), reverse=True )] def _sum_score(nums): return sum(float(final_scores.get(int(x), 0.0)) for x in nums) def _pick_from(rng, k, used): picked = [] for cand in _pool: if cand in used: continue if cand in rng and main_min <= cand <= main_max: picked.append(int(cand)) used.add(int(cand)) if len(picked) >= k: break return picked def _la_tail_ok(nums): s = set(int(x) for x in (nums or [])) return (len(s & set(upper_tail)) >= 1) and (len(s & set(upper_mid)) >= 1) already = any(_la_tail_ok(s.get("numbers", []) or []) for s in god_sets[:5]) if not already: used = set() a = _pick_from(upper_tail, 1, used) b = _pick_from(upper_mid, 1, used) tail_ticket = list(a + b) for cand in _pool: if cand in used: continue if main_min <= cand <= main_max: tail_ticket.append(int(cand)) used.add(int(cand)) if len(tail_ticket) >= main_n: break tail_ticket = sorted(set(tail_ticket)) if len(tail_ticket) == main_n and _la_tail_ok(tail_ticket): scored = [] for i0 in range(5): nums0 = god_sets[i0].get("numbers", []) or [] if len(nums0) == main_n: scored.append((i0, _sum_score(nums0))) if scored: weakest_i = sorted(scored, key=lambda x: x[1])[0][0] god_sets[weakest_i]["numbers"] = [int(x) for x in tail_ticket] except Exception: pass strike_tickets = _build_unique_strike_tickets() # ============================================================ # ============================================================ # PATCH PACK — Wildcard profile strike (main numbers only) # (Syntax-safe, no outer try/except) # ============================================================ if PATCH_UI_FLAGS.get("wildcard_strike", True): _allowed_main = set(range(int(cfg.main_min), int(cfg.main_max) + 1)) _banned_main = set(banned_nums) if "banned_nums" in locals() else set() wc = _patch_make_wildcard_profile_ticket(god_sets, final_scores, _allowed_main, _banned_main, cfg) if wc: # Choose wildcard bonus/star from the most common star used in GOD MODE sets (PB/MB/etc.) wc_star = None if getattr(cfg, "star_col", None) and getattr(cfg, "star_min", None) is not None and getattr(cfg, "star_max", None) is not None: stars = [] for _s in (god_sets or []): _sv = _s.get("star", None) if isinstance(_s, dict) else None if _sv is not None: stars.append(int(_sv)) # also consider strike ticket stars if present for _k, _v in (strike_tickets or {}).items(): if isinstance(_v, dict) and _v.get("star", None) is not None: stars.append(int(_v["star"])) if stars: wc_star = Counter(stars).most_common(1)[0][0] wc_star = max(int(cfg.star_min), min(int(cfg.star_max), int(wc_star))) strike_tickets["WILDCARD PROFILE"] = {"numbers": [int(x) for x in wc], "star": wc_star} # Controlled 1-repeat for CONSENSUS COLLAPSE (Gimme5 + Lucky for Life only) try: _name_l = (getattr(cfg, "name", "") or "").lower() _is_g5 = ("gimme" in _name_l) or (int(getattr(cfg, "main_max", 0)) == 39 and int(len(getattr(cfg, "main_cols", []))) == 5) _is_l4l = ("lucky for life" in _name_l) or (int(getattr(cfg, "main_max", 0)) == 48 and int(len(getattr(cfg, "main_cols", []))) == 5) _is_repeat_game = _is_g5 or _is_l4l if _is_repeat_game and isinstance(strike_tickets, dict) and "collapse" in strike_tickets: _prev = [] try: _prev = [int(df_long.iloc[-1][c]) for c in cfg.main_cols if str(df_long.iloc[-1][c]).strip() != ""] except Exception: _prev = [] _prev_set = set(int(x) for x in _prev if x is not None) nums = strike_tickets.get("collapse", {}).get("numbers", []) or [] nums = [int(x) for x in nums] main_n = int(len(cfg.main_cols)) if _prev_set and len(nums) == main_n: overlap = sorted(set(nums) & _prev_set) pool = [int(n) for n, _sc in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] if len(overlap) == 0: add_cand = None for cand in pool: if cand in _prev_set and cand not in nums: add_cand = int(cand) break if add_cand is not None: drop_n = min(nums, key=lambda n: float(final_scores.get(int(n), 0.0))) nums2 = sorted((set(nums) - {int(drop_n)}) | {int(add_cand)}) strike_tickets["collapse"]["numbers"] = nums2[:main_n] elif len(overlap) > 1: keep = max(overlap, key=lambda n: float(final_scores.get(int(n), 0.0))) kept = [n for n in nums if n not in _prev_set or n == keep] sset = set(kept) for cand in pool: if cand in _prev_set or cand in sset: continue sset.add(int(cand)) if len(sset) >= main_n: break strike_tickets["collapse"]["numbers"] = sorted(list(sset))[:main_n] except Exception: pass # ------------------------------------------------------------ # PB FUSION CLUSTER (ADDITIVE ONLY) # One extra GOD MODE set that fuses consensus + near-consensus numbers # to force co-occurrence of strong-but-separated signals. # ------------------------------------------------------------ try: pb_fusion_on = PATCH_UI_FLAGS.get("pb_fusion_cluster", True) if isinstance(globals().get("PATCH_UI_FLAGS", None), dict) else True except Exception: pb_fusion_on = True try: is_pb_local = (str(getattr(cfg, "key", "")).lower() == "pb") or ("powerball" in str(getattr(cfg, "name", "")).lower()) except Exception: is_pb_local = False if pb_fusion_on and is_pb_local: try: c_nums = [int(x) for x in (strike_tickets.get("collapse", {}).get("numbers", []) or [])] n_nums = [int(x) for x in (strike_tickets.get("neighbor", {}).get("numbers", []) or [])] if c_nums: cset, nset = set(c_nums), set(n_nums) union = list(cset | nset) both = cset & nset def _rank(n: int): return (1 if n in both else 0, float(final_scores.get(int(n), 0.0))) union_sorted = sorted(union, key=_rank, reverse=True) fusion_nums = [] for n in union_sorted: if int(getattr(cfg, "main_min", 1)) <= int(n) <= int(getattr(cfg, "main_max", 99)): fusion_nums.append(int(n)) if len(fusion_nums) >= int(getattr(cfg, "main_n", 5)): break # If still short, fill from global scores if len(fusion_nums) < int(getattr(cfg, "main_n", 5)): pool = sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True) for cand, _sc in pool: cand = int(cand) if cand not in fusion_nums and int(getattr(cfg, "main_min", 1)) <= cand <= int(getattr(cfg, "main_max", 99)): fusion_nums.append(cand) if len(fusion_nums) >= int(getattr(cfg, "main_n", 5)): break fusion_nums = sorted(fusion_nums)[: int(getattr(cfg, "main_n", 5))] # Bonus: reuse collapse star if available; else primary fusion_star = strike_tickets.get("collapse", {}).get("star", None) if fusion_star is None: fusion_star = primary.get("star", None) # Prevent duplicates: only add if not identical to an existing set existing = [set(int(x) for x in (s.get("numbers", []) or [])) for s in god_sets] if set(fusion_nums) not in existing: fusion_score = float(sum(float(final_scores.get(int(x), 0.0)) for x in fusion_nums)) god_sets.append({ "style": "fusion_cluster", "numbers": fusion_nums, "star": int(fusion_star) if fusion_star is not None else None, "score": fusion_score, }) except Exception: pass # ------------------------- # PATCH: POOL12 + +1 DRIFT ticket (safe, additive only) # ------------------------- pool12 = None try: # Build a 12-number pool to expose in the UI (your console "POOL12") # Priority: numbers that appear across primary + GOD MODE + consensus tickets, # then fill by score. from collections import Counter as _Counter _cand_lists = [] try: _cand_lists.append(list(primary.get("numbers") or [])) except Exception: pass try: _cand_lists.extend([list(s.get("numbers") or []) for s in (god_sets or [])]) except Exception: pass try: if isinstance(strike_tickets, dict): for _k in ("collapse", "neighbor", "neighbor", "consensus_collapse", "consensus_neighbor"): tk = strike_tickets.get(_k) if isinstance(tk, dict): _cand_lists.append(list(tk.get("numbers") or [])) except Exception: pass _freq = _Counter() for _lst in _cand_lists: for _x in (_lst or []): try: _freq[int(_x)] += 1 except Exception: continue _main_min = int(getattr(cfg, "main_min", 1)) _main_max = int(getattr(cfg, "main_max", 99)) _banned = set(int(x) for x in (banned_nums or []) if x is not None) def _ok(n: int) -> bool: return (_main_min <= int(n) <= _main_max) and (int(n) not in _banned) # Seed pool by co-occurrence (freq desc) then score desc _seed = [int(n) for n, _c in sorted(_freq.items(), key=lambda kv: (int(kv[1]), float(final_scores.get(int(kv[0]), 0.0))), reverse=True) if _ok(int(n))] _score_sorted = [int(n) for n, _s in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True) if _ok(int(n))] _pool = [] for n in _seed + _score_sorted: if n not in _pool and _ok(n): _pool.append(int(n)) if len(_pool) >= 12: break pool12 = _pool[:12] if len(_pool) >= 12 else _pool # ------------------------- # PATCH: POOL12 "Recent-12 Stats" mode (Hot / Due / Cold) — additive only # Idea: # - 4 HOT: >=25% appearance in last 12 draws (>=3 when window=12) # - 4 DUE: seen in last 12 and current gap >= its historical avg gap # - 4 COLD: not seen at all in last 12 # Falls back to the existing POOL12 builder if anything fails. try: _use_recent12_stats = getattr(cfg, "pool12_recent12_stats", True) if _use_recent12_stats and "df" in locals(): _w = min(12, int(len(df))) if _w > 0: _recent_df = df.tail(_w) # recent frequency across main columns from collections import Counter as _Counter2 _recent_nums = [] for _c in (cfg.main_cols or []): try: _recent_nums.extend([int(x) for x in _recent_df[_c].dropna().tolist()]) except Exception: pass _rc = _Counter2([int(x) for x in _recent_nums if _ok(int(x))]) import math _hot_thresh = max(1, int(math.ceil(0.25 * _w))) _hot_candidates = [n for n, c in _rc.items() if int(c) >= _hot_thresh and _ok(int(n))] _hot4 = sorted(_hot_candidates, key=lambda n: (int(_rc.get(int(n), 0)), float(final_scores.get(int(n), 0.0))), reverse=True)[:4] # build occurrences for avg-gap + current-gap, one pass _total_rows = int(len(df)) _occ = {} try: _vals = df[cfg.main_cols].values.tolist() for _ri, _row in enumerate(_vals): for _x in _row: try: if _x is None: continue _n = int(_x) if not _ok(_n): continue _occ.setdefault(_n, []).append(int(_ri)) except Exception: continue except Exception: _occ = {} # "Due" among numbers seen in last 12: current_gap >= avg_gap _due_scored = [] for _n in list(_rc.keys()): _n = int(_n) if not _ok(_n) or _n in _hot4: continue _idxs = _occ.get(_n, []) if not _idxs: continue if len(_idxs) >= 2: _gaps = [int(_idxs[i]) - int(_idxs[i-1]) for i in range(1, len(_idxs))] _avg_gap = float(sum(_gaps) / max(len(_gaps), 1)) else: # fallback: expected interval ~ total/frequency _avg_gap = float(_total_rows / max(len(_idxs), 1)) _current_gap = float((_total_rows - 1) - int(_idxs[-1])) if _avg_gap <= 0: continue if _current_gap + 1e-9 >= _avg_gap: _ratio = float(_current_gap / _avg_gap) _due_scored.append((_n, _ratio, float(final_scores.get(_n, 0.0)))) _due4 = [int(n) for n, _r, _s in sorted(_due_scored, key=lambda x: (float(x[1]), float(x[2])), reverse=True)[:4]] # cold: not seen at all in last 12 _cold_candidates = [n for n in range(_main_min, _main_max + 1) if _ok(int(n)) and int(n) not in _rc] _cold4 = [int(n) for n in sorted(_cold_candidates, key=lambda n: float(final_scores.get(int(n), 0.0)), reverse=True)[:4]] _pool12_new = [] for _n in (_hot4 + _due4 + _cold4): if int(_n) not in _pool12_new and _ok(int(_n)): _pool12_new.append(int(_n)) # fill remaining slots with the existing pool (seed/score based) for _n in list(pool12 or []): if len(_pool12_new) >= 12: break if int(_n) not in _pool12_new and _ok(int(_n)): _pool12_new.append(int(_n)) pool12 = _pool12_new[:12] if len(_pool12_new) > 0 else pool12 except Exception: pass except Exception: pool12 = None try: # +1 drift hedge ticket (main + bonus), wrapped into range, duplicates resolved. _mn = int(getattr(cfg, "main_min", 1)) _mx = int(getattr(cfg, "main_max", 99)) _base = [int(x) for x in (primary.get("numbers") or [])] _drift = [] for x in _base: y = int(x) + 1 if y > _mx: y = _mn # resolve duplicates by stepping forward while y in _drift: y += 1 if y > _mx: y = _mn _drift.append(int(y)) _drift = sorted(_drift)[:len(getattr(cfg, "main_cols", [])) or 5] _star = primary.get("star", None) _drift_star = None if _star is not None and getattr(cfg, "star_min", None) is not None and getattr(cfg, "star_max", None) is not None: try: smin, smax = int(cfg.star_min), int(cfg.star_max) _drift_star = int(_star) + 1 if _drift_star > smax: _drift_star = smin except Exception: _drift_star = None drift_plus1 = {"numbers": _drift, "star": _drift_star} if isinstance(strike_tickets, dict): strike_tickets["drift_plus1"] = drift_plus1 except Exception: pass # ------------------------- # PATCH: Lucky for Life LOW+HIGH Hybrid Hedge (safe, additive only) # Trigger: # - collapse ticket has <2 LOW numbers (1–9) # - last actual draw contains a HIGH-TAIL number (>=42) # Action: # - add one hybrid ticket that forces 2 LOW (1–9) + 1 MID (10–29) + 2 HIGH (>=30, incl >=42) # - also surfaces the ticket to the UI via strike_tickets # ------------------------- try: _name_l = (getattr(cfg, "name", "") or "").lower() _is_l4l = ("lucky for life" in _name_l) or (str(getattr(cfg, "key", "")).lower() in ("l4l", "lucky4life", "lucky_for_life")) or (int(getattr(cfg, "main_max", 0)) == 48) if _is_l4l and isinstance(strike_tickets, dict): main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 48)) # last draw signal (tail active) _last = [] try: _last = [int(df_long.iloc[-1][c]) for c in cfg.main_cols if str(df_long.iloc[-1][c]).strip() != ""] except Exception: _last = [] _tail_active = any(int(x) >= 42 for x in (_last or [])) cnums = [int(x) for x in (strike_tickets.get("collapse", {}) or {}).get("numbers", []) or []] low_in_collapse = [x for x in cnums if 1 <= int(x) <= 9] if _tail_active and len(low_in_collapse) < 2: # candidate ranking pool _scored = [int(n) for n, _v in sorted(final_scores.items(), key=lambda kv: float(kv[1]), reverse=True)] _banned = set(int(x) for x in (banned_nums or []) if x is not None) def _pick(rng_min, rng_max, k, used): out = [] for cand in _scored: cand = int(cand) if cand in used or cand in _banned: continue if rng_min <= cand <= rng_max: out.append(cand) used.add(cand) if len(out) >= k: break return out used = set() lows = _pick(1, 9, 2, used) mids = _pick(10, 29, 1, used) # one must be in tail band if possible tail = _pick(42, main_max, 1, used) highs = _pick(30, main_max, 2 - len(tail), used) hybrid = sorted(set(lows + mids + tail + highs)) # repair if short (never break) if len(hybrid) < int(len(cfg.main_cols) or 5): for cand in _scored: cand = int(cand) if cand in used or cand in _banned: continue if main_min <= cand <= main_max: hybrid.append(cand) used.add(cand) if len(set(hybrid)) >= int(len(cfg.main_cols) or 5): break hybrid = sorted(set(hybrid))[: int(len(cfg.main_cols) or 5)] if len(hybrid) == int(len(cfg.main_cols) or 5): # star: prefer collapse star if present _h_star = (strike_tickets.get("collapse", {}) or {}).get("star", None) if _h_star is None: _h_star = primary.get("star", None) strike_tickets["l4l_low_high_hybrid"] = {"numbers": [int(x) for x in hybrid], "star": int(_h_star) if _h_star is not None else None} except Exception: pass # ------------------------- # PATCH: Mega Millions hedges (safe, additive only) # - Anti-core hedge ticket # - Shape hedge (2 low / 2 mid / 1 high) # - Cold Megaball hedge (star 1-6) # ------------------------- try: if cfg.name == "Mega Millions" and isinstance(strike_tickets, dict): # Build frequency map across GOD MODE sets to detect "locked core" from collections import Counter as _Counter _freq = _Counter() try: for _s in (god_sets or []): _freq.update([int(x) for x in (_s.get("numbers") or [])]) except Exception: pass # Core = top 2 most frequent numbers (tie-broken by score) _sc = {int(k): float(v) for k, v in (final_scores or {}).items()} _core = [n for n, _c in sorted(_freq.items(), key=lambda kv: (kv[1], _sc.get(int(kv[0]), 0.0)), reverse=True)[:2]] # Candidate pool preference: pool12 -> otherwise top scored list _cand = [] try: if pool12: _cand = [int(x) for x in pool12] except Exception: _cand = [] if not _cand: _cand = [int(x) for x, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True)[:30]] def _pick_from_band(band_min, band_max, k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break # If not enough, fill from scored range within band if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked def _fill_any(k, exclude, main_min, main_max): picked = [] # Prefer remaining candidates then fall back to full range by score for n in _cand: n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked main_min = int(cfg.main_min); main_max = int(cfg.main_max) # 1) Anti-core hedge: exclude core numbers and build a balanced-ish ticket _ex = set(_core) anti = [] anti += _pick_from_band(1, 14, 2, _ex) # low anti += _pick_from_band(15, 45, 2, _ex) # mid anti += _pick_from_band(46, 70, 1, _ex) # high if len(anti) < 5: anti += _fill_any(5 - len(anti), _ex, main_min, main_max) anti = sorted(set(anti))[:5] # ensure exactly 5 (in case of dedupe) if len(anti) < 5: _tmp_ex = set(anti) | set(_core) anti += _fill_any(5 - len(anti), _tmp_ex, main_min, main_max) anti = sorted(set(anti))[:5] # 2) Shape hedge (2 low / 2 mid / 1 high) — not excluding core (coverage ticket) _ex2 = set() shape = [] shape += _pick_from_band(1, 14, 2, _ex2) shape += _pick_from_band(15, 45, 2, _ex2) shape += _pick_from_band(46, 70, 1, _ex2) if len(shape) < 5: shape += _fill_any(5 - len(shape), _ex2, main_min, main_max) shape = sorted(set(shape))[:5] if len(shape) < 5: _tmp_ex = set(shape) shape += _fill_any(5 - len(shape), _tmp_ex, main_min, main_max) shape = sorted(set(shape))[:5] # 3) Cold Megaball hedge: reuse collapse numbers if present but force cold star (1–6) cold_star = None try: smin, smax = int(cfg.star_min), int(cfg.star_max) cold_hi = min(smax, max(smin, 6)) cold_star = random.choice(list(range(smin, cold_hi + 1))) except Exception: cold_star = None base_nums = [] try: base_nums = [int(x) for x in (strike_tickets.get("collapse", {}).get("numbers") or [])] except Exception: base_nums = [] if not base_nums: try: base_nums = [int(x) for x in (primary.get("numbers") or [])] except Exception: base_nums = [] strike_tickets["mm_anti_core"] = {"numbers": anti, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["mm_shape_2low2mid1high"] = {"numbers": shape, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["mm_cold_megaball"] = {"numbers": sorted(set(base_nums))[:5], "star": cold_star} except Exception: pass # ------------------------- # PATCH: Powerball hedges (safe, additive only) # - Anti-core hedge ticket # - Shape hedge (2 low / 2 mid / 1 high) # - Cold Powerball hedge (star 1-6) # ------------------------- try: if cfg.name == "Powerball" and isinstance(strike_tickets, dict): from collections import Counter as _Counter _freq = _Counter() try: for _s in (god_sets or []): _freq.update([int(x) for x in (_s.get("numbers") or [])]) except Exception: pass _sc = {int(k): float(v) for k, v in (final_scores or {}).items()} _core = [n for n, _c in sorted(_freq.items(), key=lambda kv: (kv[1], _sc.get(int(kv[0]), 0.0)), reverse=True)[:2]] _cand = [] try: if pool12: _cand = [int(x) for x in pool12] except Exception: _cand = [] if not _cand: _cand = [int(x) for x, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True)[:30]] main_min = int(getattr(cfg, "main_min", 1) or 1) main_max = int(getattr(cfg, "main_max", 69) or 69) def _pick_from_band(band_min, band_max, k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked def _fill_any(k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked # --- Anti-core hedge (avoid the 2 most overused numbers) --- ex = set(_core) anti = _fill_any(5, ex) anti = sorted(set(int(x) for x in anti))[:5] if len(anti) == 5: strike_tickets["pb_anti_core"] = {"numbers": anti, "star": strike_tickets.get("collapse", {}).get("star")} # --- Shape hedge: 2 low (1-14), 2 mid (15-45), 1 high (46-main_max) --- ex = set() low = _pick_from_band(main_min, min(14, main_max), 2, ex) mid = _pick_from_band(15, min(45, main_max), 2, ex) high = _pick_from_band(46, main_max, 1, ex) if main_max >= 46 else [] shape = sorted(set(low + mid + high)) # Ensure 5 if len(shape) < 5: shape = sorted(set(shape + _fill_any(5 - len(shape), set(shape)))) shape = sorted(shape)[:5] # If shape duplicates collapse, tweak one number (prefer swapping in a different high/mid) try: _collapse_nums = [int(x) for x in (strike_tickets.get("collapse", {}).get("numbers") or [])] except Exception: _collapse_nums = [] if _collapse_nums and sorted(_collapse_nums) == shape: ex2 = set(shape) # try swap highest number first replaced = False for band_min, band_max in [(46, main_max), (15, min(45, main_max)), (main_min, min(14, main_max))]: cand_rep = _pick_from_band(band_min, band_max, 1, ex2) if cand_rep: # replace last element (highest) with new candidate shape2 = sorted(set(shape[:-1] + cand_rep)) if len(shape2) == 5 and shape2 != shape: shape = shape2 replaced = True break if not replaced: pass if len(shape) == 5: strike_tickets["pb_shape_2low2mid1high"] = {"numbers": shape, "star": strike_tickets.get("collapse", {}).get("star")} # --- Cold Powerball hedge: same best core numbers, but PB in 1-6 --- try: base_nums = strike_tickets.get("collapse", {}).get("numbers") or strike_tickets.get("neighbor", {}).get("numbers") or primary.get("numbers") or [] base_nums = [int(x) for x in base_nums][:5] pb_star = random.choice([1, 2, 3, 4, 5, 6]) strike_tickets["pb_cold_powerball"] = {"numbers": sorted(set(base_nums))[:5], "star": pb_star} except Exception: pass except Exception: pass # ------------------------- # PATCH: Megabucks hedges (safe, additive only) # - Anti-core hedge ticket # - Shape hedge (2 low / 2 mid / 1 high) # - Cold Megaball hedge (Megaball 1–6, prefer cold 1–2) # ------------------------- try: if cfg.name == "Megabucks" and isinstance(strike_tickets, dict): from collections import Counter as _Counter _freq = _Counter() try: for _s in (god_sets or []): _freq.update([int(x) for x in (_s.get("numbers") or [])]) except Exception: pass _sc = {int(k): float(v) for k, v in (final_scores or {}).items()} # Core = top 2 most frequent numbers (tie-broken by score) _core = [n for n, _c in sorted(_freq.items(), key=lambda kv: (kv[1], _sc.get(int(kv[0]), 0.0)), reverse=True)[:2]] # Candidate pool: pool12 first, else top scored list _cand = [] try: if pool12: _cand = [int(x) for x in pool12] except Exception: _cand = [] if not _cand: _cand = [int(x) for x, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True)[:30]] main_min = int(cfg.main_min); main_max = int(cfg.main_max) # Bands for Megabucks main range (1–41) low_lo, low_hi = main_min, min(main_max, 14) mid_lo, mid_hi = min(main_max, 15), min(main_max, 28) high_lo, high_hi = min(main_max, 29), main_max def _pick_from_band(band_min, band_max, k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked def _fill_any(k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked # 1) Anti-core hedge: exclude core numbers, build 2 low / 2 mid / 1 high _ex = set(_core) anti = [] anti += _pick_from_band(low_lo, low_hi, 2, _ex) anti += _pick_from_band(mid_lo, mid_hi, 2, _ex) anti += _pick_from_band(high_lo, high_hi, 1, _ex) if len(anti) < 5: anti += _fill_any(5 - len(anti), _ex) anti = sorted(set(anti))[:5] if len(anti) < 5: _tmp_ex = set(anti) | set(_core) anti += _fill_any(5 - len(anti), _tmp_ex) anti = sorted(set(anti))[:5] # 2) Shape hedge: 2 low / 2 mid / 1 high (coverage) _ex2 = set() shape = [] shape += _pick_from_band(low_lo, low_hi, 2, _ex2) shape += _pick_from_band(mid_lo, mid_hi, 2, _ex2) shape += _pick_from_band(high_lo, high_hi, 1, _ex2) if len(shape) < 5: shape += _fill_any(5 - len(shape), _ex2) shape = sorted(set(shape))[:5] if len(shape) < 5: _tmp_ex = set(shape) shape += _fill_any(5 - len(shape), _tmp_ex) shape = sorted(set(shape))[:5] # 3) Cold Megaball hedge: reuse collapse numbers if present but force cold megaball (1–2) mb_star = None try: smin, smax = int(cfg.star_min), int(cfg.star_max) cold_hi = min(smax, max(smin, 2)) mb_star = random.choice(list(range(smin, cold_hi + 1))) except Exception: mb_star = None base_nums = [] try: base_nums = [int(x) for x in (strike_tickets.get("collapse", {}).get("numbers") or [])] except Exception: base_nums = [] if not base_nums: try: base_nums = [int(x) for x in (primary.get("numbers") or [])] except Exception: base_nums = [] strike_tickets["mb_anti_core"] = {"numbers": anti, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["mb_shape_2low2mid1high"] = {"numbers": shape, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["mb_cold_megaball"] = {"numbers": sorted(set(base_nums))[:5], "star": mb_star} except Exception: pass # ------------------------- # PATCH: Lotto America hedges (safe, additive only) # - Anti-core hedge ticket # - Shape hedge (2 low / 2 mid / 1 high) # - Cold Star Ball hedge (SB 1–3) # ------------------------- try: if cfg.name == "Lotto America" and isinstance(strike_tickets, dict): from collections import Counter as _Counter _freq = _Counter() try: for _s in (god_sets or []): _freq.update([int(x) for x in (_s.get("numbers") or [])]) except Exception: pass _sc = {int(k): float(v) for k, v in (final_scores or {}).items()} # Core = top 2 most frequent numbers (tie-broken by score) _core = [n for n, _c in sorted(_freq.items(), key=lambda kv: (kv[1], _sc.get(int(kv[0]), 0.0)), reverse=True)[:2]] # Candidate pool: pool12 first, else top scored list _cand = [] try: if pool12: _cand = [int(x) for x in pool12] except Exception: _cand = [] if not _cand: _cand = [int(x) for x, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True)[:30]] main_min = int(cfg.main_min); main_max = int(cfg.main_max) # Bands for Lotto America main range (1–52) low_lo, low_hi = main_min, min(main_max, 17) mid_lo, mid_hi = min(main_max, 18), min(main_max, 35) high_lo, high_hi = min(main_max, 36), main_max def _fill_any(count, exclude): out = [] # prefer candidates first for n in _cand: n = int(n) if n in exclude: continue out.append(n) exclude.add(n) if len(out) >= count: return out # then top scored for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue out.append(n) exclude.add(n) if len(out) >= count: break # last resort random fill while len(out) < count: r = random.randint(main_min, main_max) if r in exclude: continue out.append(r); exclude.add(r) return out def _pick_from_band(bmin, bmax, k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if bmin <= n <= bmax: picked.append(n) exclude.add(n) if len(picked) >= k: return picked # fallback to top scored for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if bmin <= n <= bmax: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: picked += _fill_any(k - len(picked), exclude) return picked[:k] # Base numbers for reuse (collapse -> primary) base_nums = [] try: base_nums = [int(x) for x in (strike_tickets.get("collapse", {}).get("numbers") or [])] except Exception: base_nums = [] if not base_nums: try: base_nums = [int(x) for x in (primary.get("numbers") or [])] except Exception: base_nums = [] # 1) Anti-core hedge: avoid top-2 overused core numbers _ex = set(_core) anti = [] for n in _cand: n = int(n) if n in _ex: continue if main_min <= n <= main_max: anti.append(n) _ex.add(n) if len(anti) >= 5: break if len(anti) < 5: anti += _fill_any(5 - len(anti), _ex) anti = sorted(set(anti))[:5] if len(anti) < 5: _tmp_ex = set(anti) anti += _fill_any(5 - len(anti), _tmp_ex) anti = sorted(set(anti))[:5] # 2) Shape hedge: 2 low / 2 mid / 1 high _ex2 = set() shape = [] shape += _pick_from_band(low_lo, low_hi, 2, _ex2) shape += _pick_from_band(mid_lo, mid_hi, 2, _ex2) shape += _pick_from_band(high_lo, high_hi, 1, _ex2) shape = sorted(set(shape))[:5] if len(shape) < 5: shape += _fill_any(5 - len(shape), _ex2) shape = sorted(set(shape))[:5] # Avoid duplicating collapse exactly (wasted ticket) try: _collapse_nums = sorted([int(x) for x in (strike_tickets.get("collapse", {}).get("numbers") or [])]) except Exception: _collapse_nums = [] if _collapse_nums and sorted(shape) == _collapse_nums: _ex3 = set(shape) # try swapping in one different high-band number for n in _cand: n = int(n) if n in _ex3: continue if high_lo <= n <= high_hi: shape[-1] = n break shape = sorted(set(shape))[:5] if len(shape) < 5: shape += _fill_any(5 - len(shape), set(shape)) shape = sorted(set(shape))[:5] # 3) Cold Star Ball hedge: reuse base numbers (prefer collapse) but force cold star (1–3) cold_star = None try: smin, smax = int(cfg.star_min), int(cfg.star_max) cold_hi = min(smax, max(smin, 3)) cold_star = random.choice(list(range(smin, cold_hi + 1))) except Exception: cold_star = None strike_tickets["la_anti_core"] = {"numbers": anti, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["la_shape_2low2mid1high"] = {"numbers": shape, "star": strike_tickets.get("collapse", {}).get("star")} strike_tickets["la_cold_starball"] = {"numbers": sorted(set(base_nums))[:5], "star": cold_star} except Exception: pass # ------------------------- # PATCH: Gimme5 hedges (safe, additive only) # - Anti-core hedge ticket (avoid the 2 most overused numbers) # - Shape hedge (2 low / 2 mid / 1 high) for 1-39 # Note: Gimme5 has no bonus ball; 'star' will be None. # ------------------------- try: if cfg.name == "Gimme 5" and isinstance(strike_tickets, dict): from collections import Counter as _Counter _freq = _Counter() try: for _s in (god_sets or []): _freq.update([int(x) for x in (_s.get("numbers") or [])]) except Exception: pass _sc = {int(k): float(v) for k, v in (final_scores or {}).items()} # core = top 2 most frequent numbers (tie-break by score) _core = [n for n, _c in sorted(_freq.items(), key=lambda kv: (kv[1], _sc.get(int(kv[0]), 0.0)), reverse=True)[:2]] # Candidate pool preference: pool12 -> otherwise top scored list _cand = [] try: if pool12: _cand = [int(x) for x in pool12] except Exception: _cand = [] if not _cand: _cand = [int(x) for x, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True)[:30]] main_min = int(getattr(cfg, "main_min", 1) or 1) main_max = int(getattr(cfg, "main_max", 39) or 39) def _fill_any(k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if main_min <= n <= main_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked def _pick_from_band(band_min, band_max, k, exclude): picked = [] for n in _cand: n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break if len(picked) < k: for n, _v in sorted(_sc.items(), key=lambda kv: kv[1], reverse=True): n = int(n) if n in exclude: continue if band_min <= n <= band_max: picked.append(n) exclude.add(n) if len(picked) >= k: break return picked # Anti-core hedge: exclude core and fill 5 from candidates ex = set(_core) anti = _fill_any(5, ex) anti = sorted(set(int(x) for x in anti))[:5] if len(anti) == 5: strike_tickets["g5_anti_core"] = {"numbers": anti, "star": None} # Shape hedge: 2 low (1-13), 2 mid (14-26), 1 high (27-39) ex2 = set() shape = [] shape += _pick_from_band(1, 13, 2, ex2) shape += _pick_from_band(14, 26, 2, ex2) shape += _pick_from_band(27, 39, 1, ex2) if len(shape) < 5: shape += _fill_any(5 - len(shape), ex2) shape = sorted(set(int(x) for x in shape))[:5] if len(shape) == 5: strike_tickets["g5_shape_2low2mid1high"] = {"numbers": shape, "star": None} except Exception: pass result = { "game": cfg.name, "numbers": primary["numbers"], "star": primary["star"], "pool12": pool12, "meta": { "numbers_scored": len(final_scores), "history_used": len(df_long), "styles": [s["style"] for s in god_sets], }, "godmode_sets": god_sets, "strike_tickets": strike_tickets, "consensus_collapse": strike_tickets["collapse"], "consensus_neighbor": strike_tickets["neighbor"], "explanation": explanation, "model_info": model_info, } # ------------------------------------------------------------ # APPEND PATCH: EXTRA_PREDICTORS_V1 (runtime hook) # Compute 2 additional predictions WITHOUT using GOD MODE scores: # 1) ML Ensemble (RF + optional XGBoost) # 2) DL Sequence (LSTM/Transformer if TF available; safe fallback otherwise) # Stored under result['extra_predictions'] so UI can render without altering core sets. # ------------------------------------------------------------ try: _seed_local = int(result.get("seed", 0) or 0) except Exception: _seed_local = 0 try: _extra_ml = _extra_predict_ml_ensemble(df_long, cfg, seed=_seed_local, window=10) _extra_dl = _extra_predict_dl_sequence(df_long, cfg, seed=_seed_local, window=12, epochs=18) if isinstance(result, dict): result["extra_predictions"] = { "ml_ensemble": _extra_ml, "dl_sequence": _extra_dl, } except Exception: pass # ------------------------------------------------------------ # Spread Portfolio Mode (ALL GAMES) + simple regime label # ------------------------------------------------------------ try: _label = _regime_low_high_bounce_label(df_long, cfg) if _label: result["regime_label"] = _label _star_val = result.get("star", None) # If we just had a LOW streak, tilt spreads slightly higher _high_bias = 0.35 if ("LOW → HIGH" in (_label or "")) else 0.0 result["spread_portfolio_title"] = f"SPREAD PORTFOLIO MODE ({cfg.name})" result["spread_portfolio"] = _build_spread_portfolio_generic( cfg=cfg, pool12=pool12, star=_star_val, force_high_bias=_high_bias, ) except Exception: pass return result # ============================================================ # Backtesting # ============================================================ def enhanced_backtest( df: pd.DataFrame, cfg: GameConfig, n_tests: int = 200, ) -> Dict[str, float]: df = _ensure_datetime(df, cfg.csv_date_col) if cfg.clean_func and cfg.clean_func in globals(): df = globals()[cfg.clean_func](df) if len(df) < 80: return {"error": "Insufficient data for backtest (need >80 draws)"} total_tests = min(n_tests, len(df) - 60) print(f"[BACKTEST] {cfg.name}: running {total_tests} tests...") stats = { "hit_0": 0, "hit_1": 0, "hit_2": 0, "hit_3": 0, "hit_4": 0, "hit_5": 0, "rnd_0": 0, "rnd_1": 0, "rnd_2": 0, "rnd_3": 0, "rnd_4": 0, "rnd_5": 0, "sum_errors": [], "even_match": 0, } for idx in range(60, 60 + total_tests): if (idx - 59) % 30 == 0: print(f" progress: {idx - 59}/{total_tests}") train_df = df.iloc[:idx].copy() actual_row = df.iloc[idx] actual_nums = sorted(int(x) for x in actual_row[cfg.main_cols].values) try: pred = generate_prediction_v4_god(train_df, cfg) pred_nums = sorted(pred["numbers"]) except Exception: pred_nums = sorted( random.sample( range(cfg.main_min, cfg.main_max + 1), len(cfg.main_cols), ) ) hits = len(set(pred_nums) & set(actual_nums)) stats[f"hit_{hits}"] += 1 rnd_nums = sorted( random.sample( range(cfg.main_min, cfg.main_max + 1), len(cfg.main_cols), ) ) rnd_hits = len(set(rnd_nums) & set(actual_nums)) stats[f"rnd_{rnd_hits}"] += 1 stats["sum_errors"].append(abs(sum(pred_nums) - sum(actual_nums))) if sum(v % 2 == 0 for v in pred_nums) == sum( v % 2 == 0 for v in actual_nums ): stats["even_match"] += 1 out: Dict[str, float] = {} for i in range(6): out[f"model_hit_{i}_rate"] = round( stats[f"hit_{i}"] / max(total_tests, 1) * 100.0, 2 ) out[f"random_hit_{i}_rate"] = round( stats[f"rnd_{i}"] / max(total_tests, 1) * 100.0, 2 ) out["avg_sum_error"] = round(float(np.mean(stats["sum_errors"])), 2) out["even_count_accuracy"] = round( stats["even_match"] / max(total_tests, 1) * 100.0, 2 ) out["model_3plus_rate"] = round( sum(stats[f"hit_{i}"] for i in range(3, 6)) / max(total_tests, 1) * 100.0, 2 ) out["random_3plus_rate"] = round( sum(stats[f"rnd_{i}"] for i in range(3, 6)) / max(total_tests, 1) * 100.0, 2 ) return out # ============================================================ # CSV loading + public API # ============================================================ def load_csv_for_game(csv_path: Path, game_key: str) -> Tuple[pd.DataFrame, GameConfig]: cfg = GAME_CONFIGS[game_key] # Read CSV (support comma or tab-delimited exports) try: df = pd.read_csv(csv_path) except Exception: df = pd.read_csv(csv_path, sep=None, engine="python") # ---- Flexible header normalization (future-proof) ---- def _norm(s: str) -> str: return str(s).strip().lower().replace("_", " ").replace("-", " ").replace("\t", " ").replace(" ", " ") norm_to_actual = {_norm(c): c for c in df.columns} def _find_col(*cands: str) -> str | None: for c in cands: if c is None: continue cc = _norm(c) if cc in norm_to_actual: return norm_to_actual[cc] return None # Date column: accept common variants and rename to cfg.csv_date_col date_actual = _find_col( cfg.csv_date_col, "date", "draw date", "drawdate", "draw_date", ) if date_actual is None: raise ValueError(f"Expected a date column in CSV for {cfg.name}. Tried: '{cfg.csv_date_col}', 'Date', 'Draw Date'") if date_actual != cfg.csv_date_col: df = df.rename(columns={date_actual: cfg.csv_date_col}) # Main balls: accept canonical names OR numeric columns (1..N) OR b1..bN OR Ball 1..Ball N n_main = len(cfg.main_cols) have_canonical = all(c in df.columns for c in cfg.main_cols) if not have_canonical: # Candidate layouts (by position) numeric_cols = [str(i) for i in range(1, n_main + 1)] b_cols = [f"b{i}" for i in range(1, n_main + 1)] ball_cols = [f"ball {i}" for i in range(1, n_main + 1)] ball_caps_cols = [f"Ball {i}" for i in range(1, n_main + 1)] def _all_exist(cols): return all(_find_col(c) is not None for c in cols) chosen = None if _all_exist(numeric_cols): chosen = numeric_cols elif _all_exist(b_cols): chosen = b_cols elif _all_exist(ball_cols): chosen = ball_cols elif _all_exist(ball_caps_cols): chosen = ball_caps_cols if chosen is None: # Give a helpful error listing what we expected raise ValueError( f"Expected main ball columns for {cfg.name}.\n" f"Accepted formats: {cfg.main_cols} OR columns '1'..'{n_main}' OR 'b1'..'b{n_main}' OR 'Ball 1'..'Ball {n_main}'.\n" f"Found: {list(df.columns)[:25]}{'...' if len(df.columns) > 25 else ''}" ) # Rename chosen -> canonical rename_map = {} for i, cand in enumerate(chosen): actual = _find_col(cand) rename_map[actual] = cfg.main_cols[i] df = df.rename(columns=rename_map) # Bonus/Star column: accept common variants and rename to cfg.star_col (when game uses one) if cfg.star_col: star_actual = _find_col( cfg.star_col, # Generic "star", "bonus", "special", "extra", # Game-specific common variants "lucky ball", "luckyball", "lb", "mega ball", "megaball", "mb", "powerball", "power ball", "pb", "megabucks", "mega bucks", "megaball 1", # harmless extras "star ball", "sb", ) if star_actual is not None and star_actual != cfg.star_col: df = df.rename(columns={star_actual: cfg.star_col}) # ---- Basic cleaning ---- for col in cfg.main_cols: if col not in df.columns: raise ValueError(f"Expected column '{col}' in CSV for {cfg.name}") df[col] = pd.to_numeric(df[col], errors="coerce") mask_bad = (df[col].isna()) | (df[col] < cfg.main_min) | (df[col] > cfg.main_max) if mask_bad.any(): df = df[~mask_bad] if cfg.star_col and cfg.star_col in df.columns: df[cfg.star_col] = pd.to_numeric(df[cfg.star_col], errors="coerce") mask_bad_star = (df[cfg.star_col].isna()) | (df[cfg.star_col] < cfg.star_min) | (df[cfg.star_col] > cfg.star_max) if mask_bad_star.any(): df = df[~mask_bad_star] # Parse and sort by date df[cfg.csv_date_col] = pd.to_datetime(df[cfg.csv_date_col], errors="coerce") df = df.dropna(subset=[cfg.csv_date_col]) df = df.sort_values(cfg.csv_date_col).reset_index(drop=True) if cfg.clean_func and cfg.clean_func in globals(): df = globals()[cfg.clean_func](df) return df, cfg def predict_for_game_v3( csv_path: Path, game_key: str, run_backtest: bool = False, ) -> Dict[str, object]: """ Public API (same name/signature as earlier versions). If run_backtest=True -> run enhanced_backtest. Else -> run GOD-MODE prediction (V5.3 ULTRA). """ df, cfg = load_csv_for_game(Path(csv_path), game_key) # Backtest disabled (HF-safe). run_backtest = False # if run_backtest: # return enhanced_backtest(df, cfg) return generate_prediction_v4_god(df, cfg) def predict_for_game( csv_path: Path, game_key: str, run_backtest: bool = False, ): """ Backwards-compatible wrapper for older code that imports `predict_for_game`. """ return predict_for_game_v3(csv_path=Path(csv_path), game_key=game_key, run_backtest=run_backtest) # ============================================================ # Wheel generation + hot/cold analysis # ============================================================ def generate_wheel_numbers(raw_df: pd.DataFrame, cfg: GameConfig) -> Dict[str, object]: """ Generate a 20-number wheel using frequency, recency, and multi-agent ranking. """ df = _ensure_datetime(raw_df, cfg.csv_date_col) if cfg.clean_func and cfg.clean_func in globals(): df = globals()[cfg.clean_func](df) if len(df) < 40: return {"error": "Insufficient history (<40) for wheel generation"} df_long = _limit_history(df, _auto_history_window(df, cfg)) ml_models = build_multiwindow_ml(df_long, cfg, windows=[20, 80, 400]) freq_features = create_frequency_features(df_long, cfg, windows=[20, 80, 400]) agent_scores = compute_agent_scores(df_long, cfg, ml_models, freq_features) final_scores = combine_agent_scores(agent_scores, cfg) banned = get_last4_repeater_ban(df_long, cfg) wheel_pool = {n: s for n, s in final_scores.items() if n not in banned} if len(wheel_pool) < 20: wheel_pool = final_scores.copy() sorted_nums_wheel = sorted(wheel_pool.items(), key=lambda x: x[1], reverse=True) wheel_nums = [n for n, _ in sorted_nums_wheel[:20]] freq_all_main = Counter(df_long[cfg.main_cols].values.flatten()) hot = [n for n, _ in freq_all_main.most_common(10)] cold = [n for n, _ in freq_all_main.most_common()[-10:]] return { "wheel_numbers": wheel_nums, "hot_count": len(set(wheel_nums) & set(hot)), "cold_count": len(set(wheel_nums) & set(cold)), "warm_count": len(wheel_nums) - len(set(wheel_nums) & set(hot)) - len(set(wheel_nums) & set(cold)), "banned_last4_repeater": sorted(banned), "hot_cold_analysis": { "hot": hot, "cold": cold, }, } def get_wheel_for_game(csv_path: Path, game_key: str) -> Dict[str, object]: df, cfg = load_csv_for_game(Path(csv_path), game_key) return generate_wheel_numbers(df, cfg) def get_hot_cold_analysis( csv_path: Path, game_key: str, top_n: int = 10, ) -> Dict[str, object]: """ Helper for app/engine: top-N hottest and coldest numbers for the given game, plus full frequency table. """ df, cfg = load_csv_for_game(Path(csv_path), game_key) all_nums = [] for col in cfg.main_cols: all_nums.extend(df[col].tolist()) all_nums = [int(x) for x in all_nums if not pd.isna(x)] freq = Counter(all_nums) sorted_freq = sorted(freq.items(), key=lambda kv: kv[1], reverse=True) hot = [n for n, _ in sorted_freq[:top_n]] cold = [n for n, _ in sorted(freq.items(), key=lambda kv: kv[1])[:top_n]] return { "hot": hot, "cold": cold, "frequency": {int(n): int(c) for n, c in freq.items()}, } def load_and_prepare_data(csv_path: Path, game_key: str) -> Tuple[pd.DataFrame, GameConfig]: """ Backwards-compatible wrapper for older engine code. Loads CSV, cleans & validates it, and returns (DataFrame, GameConfig). """ csv_path = Path(csv_path) df, cfg = load_csv_for_game(csv_path, game_key) return df, cfg # ============================================================ # CLI (pretty output) def _consensus_collapse_ticket( primary_numbers: List[int], god_sets: List[Dict[str, object]], k: int = 5, ) -> Tuple[List[int], Optional[int]]: """Build a single 'collapsed' ticket from the engine's own consensus. Uses appearance frequency across GOD MODE sets (and primary pick, if provided). Returns (numbers, star_or_none). Print-only helper for CLI; does not change prediction logic. """ counts: Dict[int, int] = {} star_counts: Dict[int, int] = {} # Include GOD MODE set numbers for s in god_sets or []: nums = s.get("numbers") or [] for n in nums: try: nn = int(n) except Exception: continue counts[nn] = counts.get(nn, 0) + 1 st = s.get("star", None) if st is not None: try: ss = int(st) star_counts[ss] = star_counts.get(ss, 0) + 1 except Exception: pass # Include primary numbers as a light vote (helps collapse toward best single pick) for n in primary_numbers or []: try: nn = int(n) except Exception: continue counts[nn] = counts.get(nn, 0) + 1 # Pick top-k by frequency, then numeric (stable) ranked = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0])) top = [n for n, c in ranked[:k]] top = sorted(top) # Pick most common star (if any), tie -> smallest star = None if star_counts: star = sorted(star_counts.items(), key=lambda kv: (-kv[1], kv[0]))[0][0] return top, star def _consensus_neighbor_ticket( primary_numbers: List[int], god_sets: List[Dict[str, object]], cfg: GameConfig, k: int = 5, top_n: int = 3, ) -> Tuple[List[int], Optional[int]]: """Second collapsed ticket: consensus + neighbor-chaser. Starts from the same consensus counts as _consensus_collapse_ticket, then adds candidate neighbors (±1) around the top_n consensus anchors. Selection remains consensus-driven (frequency first). Neighbors only help when they have some support in the candidate pool. Print-only helper for CLI; does not change prediction logic. """ counts: Dict[int, float] = {} star_counts: Dict[int, int] = {} # Tally from GOD MODE sets for s in god_sets or []: nums = s.get("numbers") or [] for n in nums: try: nn = int(n) except Exception: continue counts[nn] = counts.get(nn, 0.0) + 1.0 st = s.get("star", None) if st is not None: try: ss = int(st) star_counts[ss] = star_counts.get(ss, 0) + 1 except Exception: pass # Light vote for primary numbers for n in primary_numbers or []: try: nn = int(n) except Exception: continue counts[nn] = counts.get(nn, 0.0) + 1.0 if not counts: return [], None # Identify top anchors by raw frequency ranked = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0])) anchors = [n for n, _c in ranked[: max(1, int(top_n))]] # Add neighbor candidates with a small bonus tied to the anchor strength for a in anchors: a_score = float(counts.get(a, 0.0)) for nb in (a - 1, a + 1): if nb < int(cfg.main_min) or nb > int(cfg.main_max): continue base_nb = float(counts.get(nb, 0.0)) counts[nb] = base_nb + 0.35 * a_score # Choose top-k by adjusted frequency, tie -> smaller number ranked2 = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0])) picked: List[int] = [] for n, _c in ranked2: if n not in picked: picked.append(n) if len(picked) >= k: break picked = sorted(picked) # Pick most common star (if any), tie -> smallest star = None if star_counts: star = sorted(star_counts.items(), key=lambda kv: (-kv[1], kv[0]))[0][0] return picked, star # ============================================================ # ============================================================ # APPEND PATCH: EXTRA_PREDICTORS_V1 (APPEND-ONLY / NO DELETIONS) # - Adds 2 additional prediction lines per game: # 1) ML Ensemble (RandomForest + optional XGBoost) # 2) DL Sequence (LSTM/Transformer if TensorFlow available; safe fallback otherwise) # - Both predictors read ONLY the game CSV history (df_long) and do NOT reuse GOD MODE scores. # - Output is attached under result['extra_predictions'] (UI can render without changing core sets). # ============================================================ def _extra__multi_hot_matrix(df: pd.DataFrame, cfg: GameConfig, *, window:int=10): ''' Build X, Y for next-draw multi-label prediction. X[t] uses frequency/recency features from draws [t-window, t) and Y[t] is the set of numbers in draw t. ''' try: main_cols = list(getattr(cfg, "main_cols", []) or []) main_n = int(len(main_cols) or 5) mn, mx = int(getattr(cfg, "main_min", 1)), int(getattr(cfg, "main_max", 99)) n_range = mx - mn + 1 if n_range <= 0: return None, None, None draws = [] for _i in range(len(df)): row = df.iloc[_i] s = [] for c in main_cols: try: v = int(row[c]) if mn <= v <= mx: s.append(v) except Exception: continue draws.append(sorted(set(s))) if len(draws) < window + 5: return None, None, None X = [] Y = [] for t in range(window, len(draws)): hist = draws[t-window:t] counts = [0]*n_range last_seen = [None]*n_range for j, d in enumerate(hist): for v in d: idx = int(v) - mn if 0 <= idx < n_range: counts[idx] += 1 last_seen[idx] = j # 0..window-1 rec = [1.0]*n_range for i in range(n_range): if last_seen[i] is None: rec[i] = 0.0 else: rec[i] = float(window - 1 - int(last_seen[i])) / float(max(1, window - 1)) feat = [float(c)/float(window) for c in counts] + rec X.append(feat) y = [0]*n_range for v in draws[t]: idx = int(v) - mn if 0 <= idx < n_range: y[idx] = 1 Y.append(y) return np.asarray(X, dtype=float), np.asarray(Y, dtype=float), {"mn": mn, "mx": mx, "main_n": main_n, "n_range": n_range, "window": window} except Exception: return None, None, None def _extra_predict_ml_ensemble(df: pd.DataFrame, cfg: GameConfig, *, seed:int=0, window:int=10): ''' Extra predictor #1: RandomForest + optional XGBoost in a light ensemble. Returns dict: {"numbers":[...], "star":..., "meta":{...}} ''' out = {"numbers": [], "star": None, "meta": {"method": "ml_ensemble", "used_xgboost": False, "window": int(window)}} try: X, Y, info = _extra__multi_hot_matrix(df, cfg, window=int(window)) if X is None or Y is None or info is None: out["meta"]["note"] = "insufficient_history" return out mn, mx, main_n = int(info["mn"]), int(info["mx"]), int(info["main_n"]) n = int(X.shape[0]) split = max(10, int(n * 0.85)) Xtr, Ytr = X[:split], Y[:split] from sklearn.multiclass import OneVsRestClassifier from sklearn.ensemble import RandomForestClassifier rf = OneVsRestClassifier( RandomForestClassifier( n_estimators=250, random_state=int(seed) if seed is not None else 0, min_samples_leaf=1, n_jobs=-1, ) ) rf.fit(Xtr, Ytr) xgb_model = None try: import xgboost as xgb # type: ignore xgb_model = OneVsRestClassifier( xgb.XGBClassifier( n_estimators=350, max_depth=6, learning_rate=0.08, subsample=0.85, colsample_bytree=0.85, reg_lambda=1.0, random_state=int(seed) if seed is not None else 0, n_jobs=-1, eval_metric="logloss", tree_method="hist", ) ) xgb_model.fit(Xtr, Ytr) out["meta"]["used_xgboost"] = True except Exception: xgb_model = None x_last = X[-1:].copy() def _ovr_proba(mdl, xrow): try: pr = mdl.predict_proba(xrow) if isinstance(pr, np.ndarray) and pr.ndim == 2 and pr.shape[0] == 1: return pr[0] if isinstance(pr, list): vals = [] for a in pr: try: if a.shape[1] == 2: vals.append(float(a[0, 1])) else: vals.append(float(a[0, -1])) except Exception: vals.append(0.0) return np.asarray(vals, dtype=float) except Exception: pass return None pr_rf = _ovr_proba(rf, x_last) if pr_rf is None: out["meta"]["note"] = "rf_failed" return out probs = np.array(pr_rf, dtype=float) if xgb_model is not None: pr_xgb = _ovr_proba(xgb_model, x_last) if pr_xgb is not None and len(pr_xgb) == len(probs): probs = 0.55 * probs + 0.45 * np.array(pr_xgb, dtype=float) banned = set() try: banned = set(get_last4_repeater_ban(df, cfg) or []) except Exception: banned = set() ranked = sorted([(mn + i, float(probs[i])) for i in range(len(probs))], key=lambda kv: (-kv[1], kv[0])) picks = [] for num, _p in ranked: if int(num) in banned: continue if mn <= int(num) <= mx and int(num) not in picks: picks.append(int(num)) if len(picks) >= int(main_n): break out["numbers"] = sorted(picks) try: if getattr(cfg, "star_col", None): smin = int(getattr(cfg, "star_min", 1)) smax = int(getattr(cfg, "star_max", smin)) series_all = pd.to_numeric(df[cfg.star_col], errors="coerce").dropna().astype(int).tolist() if series_all: from collections import Counter fa = Counter(series_all) series_80 = pd.to_numeric(df[cfg.star_col].tail(80), errors="coerce").dropna().astype(int).tolist() f8 = Counter(series_80) cand = list(range(smin, smax + 1)) wts = [] for b in cand: w = 1.0 + float(fa.get(b, 0)) + 2.0 * float(f8.get(b, 0)) wts.append(w) rnd = random.Random(int(seed) + 911) out["star"] = int(rnd.choices(cand, weights=wts, k=1)[0]) except Exception: pass return out except Exception as e: out["meta"]["error"] = str(e) return out def _extra_predict_dl_sequence(df: pd.DataFrame, cfg: GameConfig, *, seed:int=0, window:int=12, epochs:int=18): ''' Extra predictor #2: Sequence model. Preferred: TensorFlow/Keras LSTM + lightweight Transformer encoder. Safe fallback: sklearn MLP (multi-output) on flattened sequences if TF unavailable. Returns dict: {"numbers":[...], "star":..., "meta":{...}} ''' out = {"numbers": [], "star": None, "meta": {"method": "dl_sequence", "window": int(window), "epochs": int(epochs), "backend": "unknown"}} try: main_cols = list(getattr(cfg, "main_cols", []) or []) main_n = int(len(main_cols) or 5) mn, mx = int(getattr(cfg, "main_min", 1)), int(getattr(cfg, "main_max", 99)) n_range = mx - mn + 1 if n_range <= 0: out["meta"]["note"] = "bad_range" return out draws = [] for _i in range(len(df)): row = df.iloc[_i] s = [] for c in main_cols: try: v = int(row[c]) if mn <= v <= mx: s.append(v) except Exception: continue draws.append(sorted(set(s))) if len(draws) < int(window) + 6: out["meta"]["note"] = "insufficient_history" return out seqX, seqY = [], [] for t in range(int(window), len(draws)): hist = draws[t-int(window):t] mat = [] for d in hist: v = [0.0]*n_range for num in d: idx = int(num) - mn if 0 <= idx < n_range: v[idx] = 1.0 mat.append(v) seqX.append(mat) y = [0.0]*n_range for num in draws[t]: idx = int(num) - mn if 0 <= idx < n_range: y[idx] = 1.0 seqY.append(y) seqX = np.asarray(seqX, dtype=float) seqY = np.asarray(seqY, dtype=float) n = int(seqX.shape[0]) split = max(10, int(n * 0.85)) Xtr, Ytr = seqX[:split], seqY[:split] x_last = seqX[-1:] model_prob = None try: import tensorflow as tf # type: ignore tf.random.set_seed(int(seed) if seed is not None else 0) out["meta"]["backend"] = "tensorflow" inp = tf.keras.Input(shape=(int(window), n_range)) x = tf.keras.layers.LSTM(64, return_sequences=True)(inp) attn = tf.keras.layers.MultiHeadAttention(num_heads=4, key_dim=16)(x, x) x2 = tf.keras.layers.Add()([x, attn]) x2 = tf.keras.layers.LayerNormalization()(x2) x2 = tf.keras.layers.Dense(96, activation="relu")(x2) x2 = tf.keras.layers.GlobalAveragePooling1D()(x2) outp = tf.keras.layers.Dense(n_range, activation="sigmoid")(x2) model = tf.keras.Model(inp, outp) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.004), loss="binary_crossentropy") model.fit(Xtr, Ytr, epochs=int(epochs), batch_size=32, verbose=0) model_prob = model.predict(x_last, verbose=0)[0] except Exception: out["meta"]["backend"] = "sklearn_fallback" try: from sklearn.neural_network import MLPClassifier from sklearn.multioutput import MultiOutputClassifier flatX = seqX.reshape((seqX.shape[0], -1)) x_last2 = flatX[-1:].copy() clf = MultiOutputClassifier( MLPClassifier( hidden_layer_sizes=(256, 128), activation="relu", solver="adam", max_iter=220, random_state=int(seed) if seed is not None else 0, ) ) clf.fit(flatX[:split], seqY[:split]) probs = [] proba_list = clf.predict_proba(x_last2) for pr in proba_list: try: if pr.shape[1] == 2: probs.append(float(pr[0, 1])) else: probs.append(float(pr[0, -1])) except Exception: probs.append(0.0) model_prob = np.asarray(probs, dtype=float) except Exception as e2: out["meta"]["error"] = str(e2) return out if model_prob is None: out["meta"]["note"] = "model_failed" return out banned = set() try: banned = set(get_last4_repeater_ban(df, cfg) or []) except Exception: banned = set() ranked = sorted([(mn + i, float(model_prob[i])) for i in range(len(model_prob))], key=lambda kv: (-kv[1], kv[0])) picks = [] for num, _p in ranked: if int(num) in banned: continue if mn <= int(num) <= mx and int(num) not in picks: picks.append(int(num)) if len(picks) >= int(main_n): break out["numbers"] = sorted(picks) try: if getattr(cfg, "star_col", None): smin = int(getattr(cfg, "star_min", 1)) smax = int(getattr(cfg, "star_max", smin)) series_all = pd.to_numeric(df[cfg.star_col], errors="coerce").dropna().astype(int).tolist() if series_all: from collections import Counter fa = Counter(series_all) series_80 = pd.to_numeric(df[cfg.star_col].tail(80), errors="coerce").dropna().astype(int).tolist() f8 = Counter(series_80) cand = list(range(smin, smax + 1)) wts = [] for b in cand: w = 1.0 + float(fa.get(b, 0)) + 2.0 * float(f8.get(b, 0)) wts.append(w) rnd = random.Random(int(seed) + 1337) out["star"] = int(rnd.choices(cand, weights=wts, k=1)[0]) except Exception: pass return out except Exception as e: out["meta"]["error"] = str(e) return out if __name__ == "__main__": import argparse import os parser = argparse.ArgumentParser( description="Lotto Predictor V5.3 ULTRA GOD MODE (multi-agent, multi-window, cluster-aware, top_cluster style)" ) parser.add_argument( "--game", required=True, choices=list(GAME_CONFIGS.keys()), help="Game key: " + ", ".join(GAME_CONFIGS.keys()), ) parser.add_argument("--csv", required=True, help="Path to CSV for the game") parser.add_argument( "--backtest", action="store_true", help="Run backtest instead of prediction", ) parser.add_argument( "--save-json", action="store_true", help="Also save full JSON result to godmode_last_result_.json", ) args = parser.parse_args() result = predict_for_game_v3( csv_path=Path(args.csv), game_key=args.game, run_backtest=args.backtest, ) # ------------------------------- # Backtest mode: pretty summary # ------------------------------- if args.backtest: if "error" in result: print(f"\n[BACKTEST ERROR] {result['error']}") else: print("\n==============================================") print(f" BACKTEST RESULTS - {GAME_CONFIGS[args.game].name}") print("==============================================\n") print(f" Model 3+ hits rate : {result.get('model_3plus_rate', 0)} %") print(f" Random 3+ hits rate: {result.get('random_3plus_rate', 0)} %") print(f" Avg sum error : {result.get('avg_sum_error', 0)}") print(f" Even-count accuracy: {result.get('even_count_accuracy', 0)} %") print("\n Hit-rate table (Model vs Random):") print(" Matches | Model % | Random %") print(" ---------+-----------+----------") for i in range(6): m_val = result.get(f"model_hit_{i}_rate", 0) r_val = result.get(f"random_hit_{i}_rate", 0) print(f" {i:1d} | {m_val:7.2f} % | {r_val:7.2f} %") print("\n==============================================\n") else: # ------------------------------- # Prediction mode: nice compact view # ------------------------------- game_name = result.get("game", GAME_CONFIGS[args.game].name) numbers = result.get("numbers", []) star = result.get("star", None) meta = result.get("meta", {}) god_sets = result.get("godmode_sets", []) expl = result.get("explanation", {}) top_nums = expl.get("top_numbers", []) banned = expl.get("banned_last4_repeater", []) model_info = result.get("model_info", {}) print("\n==============================================") print(f" V5.3 ULTRA GOD MODE RESULT - {game_name}") print("==============================================\n") # Primary combo nums_str = "-".join(str(n) for n in numbers) if star is not None: print(f" PRIMARY PICK : {nums_str} (Star: {star})") else: print(f" PRIMARY PICK : {nums_str}") print() # Multi-style sets if god_sets: print(" GOD MODE SETS (multi-style):\n") for i, s_set in enumerate(god_sets, start=1): s_nums = "-".join(str(n) for n in s_set.get("numbers", [])) s_style = s_set.get("style", "unknown").replace("_", " ").title() s_star = s_set.get("star", None) if s_star is not None: print(f" {i}) {s_style:<12} -> {s_nums} (Star: {s_star})") else: print(f" {i}) {s_style:<12} -> {s_nums}") print() # Consensus Collapse Ticket (extra strike ticket) try: collapse_nums, collapse_star = _consensus_collapse_ticket(numbers, god_sets, k=len(cfg.main_cols)) if collapse_nums: c_nums_str = "-".join(str(n) for n in collapse_nums) if collapse_star is not None: print(f" CONSENSUS COLLAPSE TICKET : {c_nums_str} (Star: {collapse_star})") else: print(f" CONSENSUS COLLAPSE TICKET : {c_nums_str}") print() # Second strike line: consensus + neighbors around top anchors nb_nums, nb_star = _consensus_neighbor_ticket(numbers, god_sets, cfg, k=len(cfg.main_cols), top_n=3) # Ensure strike tickets are UNIQUE (avoid duplicate collapse vs neighbor) try: if collapse_nums and nb_nums: if set(nb_nums) == set(collapse_nums) and ((nb_star is None and collapse_star is None) or (nb_star == collapse_star)): # Try a broader neighbor anchor set first nb_nums2, nb_star2 = _consensus_neighbor_ticket(numbers, god_sets, cfg, k=len(cfg.main_cols), top_n=5) if nb_nums2 and set(nb_nums2) != set(collapse_nums): nb_nums, nb_star = nb_nums2, nb_star2 else: # Deterministic small mutation: replace one element with an unused neighbor if possible used = set(collapse_nums) mutated = list(collapse_nums) replaced = False for i in range(len(mutated) - 1, -1, -1): x = mutated[i] for cand in (x - 1, x + 1): if cand < int(cfg.main_min) or cand > int(cfg.main_max): continue if cand in used: continue mutated[i] = cand replaced = True break if replaced: break if replaced: nb_nums = sorted(mutated) nb_star = collapse_star except Exception: pass if nb_nums: nb_nums_str = "-".join(str(n) for n in nb_nums) if nb_star is not None: print(f" CONSENSUS+NEIGHBOR TICKET : {nb_nums_str} (Star: {nb_star})") else: print(f" CONSENSUS+NEIGHBOR TICKET : {nb_nums_str}") print() except Exception as _e: # Never break CLI output if something unexpected happens pass # Top-10 favorite numbers if top_nums: fav_str = ", ".join(f"{t['num']} ({t['score']:.3f})" for t in top_nums) just_nums = ", ".join(str(t["num"]) for t in top_nums) print(" TOP 10 FAVORITE NUMBERS (by score):") print(f" Numbers: {just_nums}") print(f" Detail : {fav_str}") print() # Banned last-4 repeaters if banned: print(" BANNED (4-in-a-row repeaters):") print(f" {', '.join(str(bn) for bn in banned)}") print() else: print(" BANNED (4-in-a-row repeaters): none") print() # Meta / model info print(f" Numbers scored : {meta.get('numbers_scored', 'N/A')}") print(f" History used : {meta.get('history_used', 'N/A')} draws") print( f" ML coverage : {model_info.get('numbers_modeled', 0)}/" f"{model_info.get('total_possible', 0)} numbers" ) if meta.get("styles"): print(f" Styles evaluated : {', '.join(meta['styles'])}") print("\n==============================================\n") # Optional: save full JSON snapshot for debugging / records if args.save_json: out_name = f"godmode_last_result_{args.game}.json" try: with open(out_name, "w", encoding="utf-8") as f: json.dump(result, f, indent=2, cls=NumpyEncoder) print(f"[INFO] Full JSON result saved to: {os.path.abspath(out_name)}") except Exception as e: print(f"[WARN] Could not save JSON result: {e}") try: PATCH_UI_FLAGS.setdefault("g5_fusion_cluster", True) PATCH_UI_FLAGS.setdefault("l4l_midband_escape", True) PATCH_UI_FLAGS.setdefault("la_midband_escape", True) PATCH_UI_FLAGS.setdefault("enable_streak_guard", False) PATCH_UI_FLAGS.setdefault("streak_guard_max", 3) PATCH_UI_FLAGS.setdefault("streak_guard_penalty_factor", 0.55) except Exception: pass # ====================================================================== # APPEND-ONLY PATCH (2026-01-06): Spread Portfolio visibility + safety # - Ensures spread_portfolio ALWAYS exists (all games) and adds # prefixed keys (e.g., g5_spread_low_1) for clearer UI/Download display. # - Does NOT remove or modify existing logic; wraps the public generator. # ====================================================================== try: _ORIG_generate_prediction_v4_god = generate_prediction_v4_god # type: ignore[name-defined] except Exception: _ORIG_generate_prediction_v4_god = None def _spread_prefix_for_cfg(cfg): try: name_l = str(getattr(cfg, "name", "")).lower() if "gimme" in name_l: return "g5" if "lucky for life" in name_l or int(getattr(cfg, "main_max", 0)) == 48: return "l4l" if "powerball" in name_l: return "pb" if "mega millions" in name_l: return "mm" if "megabucks" in name_l: return "mb" if "lotto america" in name_l: return "la" except Exception: pass return "spread" def _ensure_spread_portfolio_post(res, cfg): try: if not isinstance(res, dict): return res pool12 = res.get("pool12") or res.get("POOL12") or [] star = res.get("star", None) # If missing, build a generic spread portfolio from POOL12. if not res.get("spread_portfolio"): try: res["spread_portfolio_title"] = f"SPREAD PORTFOLIO MODE ({getattr(cfg, 'name', 'Game')})" res["spread_portfolio"] = _build_spread_portfolio_generic(cfg=cfg, pool12=list(pool12), star=star, force_high_bias=0.0) # type: ignore[name-defined] except Exception: pass sp = res.get("spread_portfolio") if isinstance(sp, dict) and sp: pref = _spread_prefix_for_cfg(cfg) # Also add prefixed alias keys so UI can show "g5_spread_low_1" style names. sp_pref = {} for k, v in sp.items(): if isinstance(k, str) and k.startswith("spread_"): sp_pref[f"{pref}_{k}"] = v if sp_pref: res["spread_portfolio_prefixed"] = sp_pref except Exception: pass return res # Wrap generator (append-only) if _ORIG_generate_prediction_v4_god is not None: def generate_prediction_v4_god(raw_df, cfg): # type: ignore[override] res = _ORIG_generate_prediction_v4_god(raw_df, cfg) return _ensure_spread_portfolio_post(res, cfg) # ============================================================ # APPEND-ONLY PATCH: SPREAD PORTFOLIO BANDS + PARITY + UNIQUENESS # - Keeps existing engine intact; overrides only spread builder via re-definition. # - Enforces per-game band/range recipes (LOW / NORMAL / HIGH / BRIDGE) # - Enforces parity: 2 even/3 odd OR 3 even/2 odd for every spread ticket # - Enforces uniqueness across the 10-ticket spread portfolio # - Keeps star/bonus handling compatible with existing app printing # ============================================================ def _build_spread_portfolio_generic( cfg: "GameConfig", pool12: List[int], star: int | None = None, force_high_bias: float = 0.0, ) -> Dict[str, Dict[str, object]]: """ Build a 10-ticket spread portfolio from POOL12 (fallbacks to full range). Ticket keys returned (app will prefix per game when printing): spread_low_1..3, spread_normal_1..3, spread_high_1..3, spread_bridge_1 Design goals (user-locked): - LOW ticket skew stays mostly in lower range (e.g., MB/G5/L4L keep <=30 when possible) - NORMAL ticket is 'even across bands': 1–2 from band1, 1–2 from band2, 1–2 from band3 - HIGH ticket skews upper range - BRIDGE mixes low + high - Each ticket parity: 2E/3O or 3E/2O - Uniqueness: avoid identical tickets and reverse duplicates """ # ------------------------- # Helpers # ------------------------- main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 0) or 0) main_n = int(len(getattr(cfg, "main_cols", []) or [])) or 5 # Candidates from pool12 first; fallback to full range pool = sorted({int(x) for x in (pool12 or []) if x is not None}) full = list(range(main_min, main_max + 1)) if not pool: pool = full[:] def _band_edges(_max: int): # Explicit bands tuned per common games (matches your examples/intent). # Small/medium games (<=52): 1–10, 11–30, 31–max if _max <= 52: b1 = (main_min, min(main_min + 9, _max)) b2 = (min(b1[1] + 1, _max), min(max(30, b1[1] + 1), _max)) b3 = (min(b2[1] + 1, _max), _max) return b1, b2, b3 # Large games (PB/MM): 1–15, 16–45, 46–max b1 = (main_min, min(main_min + 14, _max)) b2 = (min(b1[1] + 1, _max), min(max(45, b1[1] + 1), _max)) b3 = (min(b2[1] + 1, _max), _max) return b1, b2, b3 b1, b2, b3 = _band_edges(main_max) def _in_band(x: int, band: tuple[int, int]) -> bool: return band[0] <= x <= band[1] def _cand_in_band(band: tuple[int, int]) -> List[int]: # Prefer pool12 members in band; fallback to full band range. c = [n for n in pool if _in_band(n, band)] if len(c) < 3: # too thin -> broaden c = sorted(set(c + [n for n in full if _in_band(n, band)])) return c C1, C2, C3 = _cand_in_band(b1), _cand_in_band(b2), _cand_in_band(b3) # Some games may have an empty band3 (e.g., if max <= 30) has_b3 = (b3[0] <= b3[1]) and any(_in_band(n, b3) for n in full) rng_seed = (sum(pool) + (star or 0) + main_max * 7 + main_n * 13) & 0xFFFFFFFF rnd = random.Random(rng_seed) def _pick_unique(src_list: List[int], k: int, exclude: set[int]) -> List[int]: src = [x for x in src_list if x not in exclude] if not src: return [] if len(src) <= k: return src[:] return rnd.sample(src, k) def _parity_ok(nums: List[int]) -> bool: ev = sum(1 for x in nums if x % 2 == 0) return ev in (2, 3) and len(nums) == main_n def _force_parity(nums: List[int], band_lists: List[List[int]]) -> List[int]: # Try to adjust by swapping one element within its original band. nums = sorted(set(int(x) for x in nums)) if len(nums) != main_n: # fill later, parity will be rechecked pass target_even = 2 if rnd.random() < 0.5 else 3 def _count_even(xs): return sum(1 for x in xs if x % 2 == 0) for _ in range(50): nums = sorted(set(nums)) if len(nums) != main_n: # Fill from any band allc = sorted(set().union(*band_lists)) for x in allc: if len(nums) >= main_n: break if x not in nums: nums.append(x) nums = sorted(set(nums)) if len(nums) > main_n: nums = nums[:main_n] ev = _count_even(nums) if ev == target_even and _parity_ok(nums): return sorted(nums) # Decide whether we need more evens or more odds need_even = ev < target_even # Try replace one number with desired parity from same band for i in range(len(nums)): cur = nums[i] cur_even = (cur % 2 == 0) if need_even and cur_even: continue if (not need_even) and (not cur_even): continue # find which band this came from band_idx = 0 if _in_band(cur, b1): band_idx = 0 elif _in_band(cur, b2): band_idx = 1 else: band_idx = 2 candidates = [x for x in band_lists[band_idx] if (x % 2 == 0) == need_even and x not in nums] if candidates: nums[i] = rnd.choice(candidates) break return sorted(nums) def _make_ticket(q1: int, q2: int, q3: int, cap30_for_low: bool = False) -> List[int]: # Build with quotas from each band; then fill + parity + sort. chosen: List[int] = [] used = set() # Optional: for LOW tickets on small games, keep within <=30 when possible if cap30_for_low and main_max >= 31: # treat band3 as ">=31"; force q3=0 and rebalance to band1/band2 q3 = 0 extra = max(0, main_n - (q1 + q2)) if extra: # add extras to band2 then band1 add2 = min(extra, 2) q2 += add2 extra -= add2 q1 += extra for band_list, k in ((C1, q1), (C2, q2), (C3, q3 if has_b3 else 0)): pick = _pick_unique(band_list, k, used) for x in pick: chosen.append(x); used.add(x) # Fill remaining from union (prefer pool-based union) if len(chosen) < main_n: union = sorted(set(C1 + C2 + (C3 if has_b3 else []))) fill = _pick_unique(union, main_n - len(chosen), used) for x in fill: chosen.append(x); used.add(x) chosen = sorted(set(chosen)) # If still short, fallback to full range if len(chosen) < main_n: for x in full: if x not in chosen: chosen.append(x) if len(chosen) >= main_n: break chosen = sorted(set(chosen))[:main_n] chosen = _force_parity(chosen, [C1, C2, (C3 if has_b3 else C2)]) chosen = sorted(set(chosen))[:main_n] return chosen def _wrap(nums: List[int]) -> Dict[str, object]: nums = sorted(int(x) for x in nums) payload = {"numbers": nums} if star is not None: payload["star"] = int(star) return payload # ------------------------- # Recipe selection # ------------------------- # High-bias nudges: when LOW→HIGH bounce detected, we lean slightly more into band3. hb = float(force_high_bias or 0.0) hb = max(0.0, min(0.9, hb)) # Base recipes (main_n assumed 5) # LOW: keep mostly <=30 (cap for small/medium games) low_recipes = [(2, 3, 0), (3, 2, 0), (2, 2, 1)] # NORMAL: "even across": 1–2 from each band, totals 5 normal_recipes = [(2, 2, 1), (1, 2, 2), (2, 1, 2)] # HIGH: upper-skew high_recipes = [(1, 1, 3), (1, 2, 2), (0, 2, 3)] # BRIDGE: mix low+high bridge_recipe = (2, 1, 2) # Bias adjustment: increase q3 in some recipes if high-bias and band3 exists if has_b3 and hb >= 0.25: # convert one LOW recipe into a more "bridge-like" low when bounce expected low_recipes = [(2, 2, 1), (3, 1, 1), (2, 2, 1)] normal_recipes = [(1, 2, 2), (2, 1, 2), (1, 2, 2)] high_recipes = [(0, 2, 3), (1, 1, 3), (0, 1, 4) if main_n == 5 else (1, 1, main_n - 2)] # ------------------------- # Build 10 unique tickets # ------------------------- seen: set[tuple[int, ...]] = set() def _unique_build(recipes, cap30=False) -> List[int]: for _ in range(200): q1, q2, q3 = recipes[rnd.randrange(len(recipes))] # Ensure quotas sum to main_n s = q1 + q2 + q3 if s != main_n: # normalize by adding/removing from band2 first q2 += (main_n - s) q2 = max(0, q2) s = q1 + q2 + q3 if s != main_n: # final clamp q1 = max(0, min(q1, main_n)) q2 = max(0, min(q2, main_n - q1)) q3 = max(0, main_n - q1 - q2) ticket = tuple(_make_ticket(q1, q2, q3, cap30_for_low=cap30)) if ticket not in seen: seen.add(ticket) return list(ticket) # worst case: return something even if duplicate return list(ticket) # LOW tickets: cap<=30 behavior on small/medium games where band2 ends at ~30 cap_low = (main_max >= 31) low1 = _unique_build(low_recipes, cap30=cap_low) low2 = _unique_build(low_recipes, cap30=cap_low) low3 = _unique_build(low_recipes, cap30=cap_low) norm1 = _unique_build(normal_recipes, cap30=False) norm2 = _unique_build(normal_recipes, cap30=False) norm3 = _unique_build(normal_recipes, cap30=False) high1 = _unique_build(high_recipes, cap30=False) high2 = _unique_build(high_recipes, cap30=False) high3 = _unique_build(high_recipes, cap30=False) bridge = _unique_build([bridge_recipe], cap30=False) portfolio = { "spread_low_1": _wrap(low1), "spread_low_2": _wrap(low2), "spread_low_3": _wrap(low3), "spread_normal_1": _wrap(norm1), "spread_normal_2": _wrap(norm2), "spread_normal_3": _wrap(norm3), "spread_high_1": _wrap(high1), "spread_high_2": _wrap(high2), "spread_high_3": _wrap(high3), "spread_bridge_1": _wrap(bridge), } return portfolio # ===================================================================== # APPEND-ONLY PATCH: ANTI-STICKY CORE (ALL GAMES) # - Goal: prevent repeating the same "core" numbers draw after draw. # - Strategy (post-processing): # * If a ticket overlaps too heavily with the most recent draw OR the # recent hot-core, swap out 1-2 of the stickiest numbers for "due" # alternatives (numbers missing from recent window), while keeping # ticket validity and uniqueness. # - This is append-only: we do NOT remove or rewrite existing logic. # ===================================================================== try: _ORIG_generate_prediction_v4_god # type: ignore except NameError: _ORIG_generate_prediction_v4_god = generate_prediction_v4_god # type: ignore def _as_int_list(nums): out = [] for x in (nums or []): try: out.append(int(x)) except Exception: pass return out def _recent_draw_sets(df: "pd.DataFrame", cfg: "GameConfig", k: int = 2): try: tail = df.tail(max(1, int(k))) except Exception: return [] sets = [] for _, row in tail.iterrows(): vals = [] for c in cfg.main_cols: try: vals.append(int(row[c])) except Exception: pass if vals: sets.append(set(vals)) return sets def _recent_freq(df: "pd.DataFrame", cfg: "GameConfig", window: int = 12): counts = {n: 0 for n in range(int(cfg.main_min), int(cfg.main_max) + 1)} try: tail = df.tail(max(1, int(window))) except Exception: return counts for _, row in tail.iterrows(): for c in cfg.main_cols: try: n = int(row[c]) if n in counts: counts[n] += 1 except Exception: continue return counts def _pick_due_candidates(df: "pd.DataFrame", cfg: "GameConfig", window: int = 12): counts = _recent_freq(df, cfg, window=window) # "Due" = not seen in recent window due = [n for n, c in counts.items() if c == 0] # If due is empty (rare), fall back to least frequent in window if not due: due = sorted(counts.keys(), key=lambda n: (counts[n], n))[: max(6, len(counts)//8)] return due, counts def _swap_out_sticky(ticket_nums, due_pool, recent_counts, sticky_set, cfg: "GameConfig", swaps: int = 1): nums = sorted(set(_as_int_list(ticket_nums))) if len(nums) != len(ticket_nums): # preserve count but ensure unique; if duplicates were present, we'll rebuild from uniques pass # Identify sticky numbers to remove (highest recent count, and in sticky_set first) def stickiness(n): return (1 if n in sticky_set else 0, recent_counts.get(n, 0)) remove_order = sorted(nums, key=lambda n: (stickiness(n)[0], stickiness(n)[1], n), reverse=True) # Candidate add-ins: due first, then least-recent add_order = [n for n in due_pool if n not in nums] if not add_order: add_order = sorted( [n for n in range(int(cfg.main_min), int(cfg.main_max) + 1) if n not in nums], key=lambda n: (recent_counts.get(n, 0), n), ) swaps_done = 0 for rem in remove_order: if swaps_done >= swaps: break # don't remove if we'd go below required count if len(nums) <= len(cfg.main_cols) - 1: break if not add_order: break add = add_order.pop(0) # apply swap try: nums.remove(rem) except ValueError: continue nums.append(add) nums = sorted(set(nums)) swaps_done += 1 # If we lost count due to uniqueness collapse, fill from add_order while len(nums) < len(cfg.main_cols) and add_order: cand = add_order.pop(0) if cand not in nums: nums.append(cand) nums = sorted(nums) # Trim if somehow too long nums = sorted(nums)[: len(cfg.main_cols)] return nums def _anti_sticky_postprocess(result: dict, df: "pd.DataFrame", cfg: "GameConfig"): # Compute sticky signals last_sets = _recent_draw_sets(df, cfg, k=2) last_draw = last_sets[-1] if last_sets else set() recent_counts = _recent_freq(df, cfg, window=12) # "sticky core" = top 5 by recent frequency (ties by number) sticky_core = set(sorted(recent_counts.keys(), key=lambda n: (recent_counts[n], n), reverse=True)[:5]) due_pool, _ = _pick_due_candidates(df, cfg, window=12) def should_de_stick(nums): s = set(_as_int_list(nums)) overlap_last = len(s & last_draw) overlap_core = len(s & sticky_core) # Trigger conditions (tuned to avoid over-editing): # - 3+ numbers repeated from last draw, OR # - 4+ numbers from the recent sticky core return (overlap_last >= 3) or (overlap_core >= 4) def process_ticket(ticket): if not ticket: return ticket # ticket can be list, tuple, etc. nums = _as_int_list(ticket) if len(nums) != len(cfg.main_cols): return ticket if should_de_stick(nums): # swap 1 by default; if extreme overlap, swap 2 s = set(nums) overlap_last = len(s & last_draw) swaps = 2 if overlap_last >= 4 else 1 new_nums = _swap_out_sticky(nums, due_pool, recent_counts, sticky_core | last_draw, cfg, swaps=swaps) return new_nums return nums # Update common result fields safely # PRIMARY / numbers if isinstance(result.get("numbers"), list): result["numbers"] = process_ticket(result["numbers"]) if isinstance(result.get("primary"), list): result["primary"] = process_ticket(result["primary"]) # GOD MODE sets if isinstance(result.get("god_mode_sets"), list): new_sets = [] for item in result["god_mode_sets"]: if isinstance(item, dict) and isinstance(item.get("nums"), list): item = dict(item) item["nums"] = process_ticket(item["nums"]) elif isinstance(item, (list, tuple)): item = process_ticket(item) new_sets.append(item) result["god_mode_sets"] = new_sets # CONSENSUS dict of tickets if isinstance(result.get("consensus"), dict): new_cons = {} for k, v in result["consensus"].items(): if isinstance(v, dict) and isinstance(v.get("nums"), list): vv = dict(v) vv["nums"] = process_ticket(vv["nums"]) new_cons[k] = vv elif isinstance(v, (list, tuple)): new_cons[k] = process_ticket(v) else: new_cons[k] = v result["consensus"] = new_cons # SPREAD PORTFOLIO dict of tickets if isinstance(result.get("spread_portfolio"), dict): new_sp = {} for k, v in result["spread_portfolio"].items(): if isinstance(v, dict) and isinstance(v.get("nums"), list): vv = dict(v) vv["nums"] = process_ticket(vv["nums"]) new_sp[k] = vv elif isinstance(v, (list, tuple)): new_sp[k] = process_ticket(v) else: new_sp[k] = v result["spread_portfolio"] = new_sp # RECOMMENDED PLAYS list/dict if isinstance(result.get("recommended_plays"), dict): new_rp = {} for k, v in result["recommended_plays"].items(): if isinstance(v, dict) and isinstance(v.get("nums"), list): vv = dict(v) vv["nums"] = process_ticket(vv["nums"]) new_rp[k] = vv elif isinstance(v, (list, tuple)): new_rp[k] = process_ticket(v) else: new_rp[k] = v result["recommended_plays"] = new_rp elif isinstance(result.get("recommended_plays"), list): result["recommended_plays"] = [process_ticket(v) if isinstance(v, (list, tuple)) else v for v in result["recommended_plays"]] return result def generate_prediction_v4_god(raw_df: "pd.DataFrame", cfg: "GameConfig") -> Dict[str, object]: # type: ignore result = _ORIG_generate_prediction_v4_god(raw_df, cfg) # type: ignore try: if isinstance(result, dict) and hasattr(raw_df, "tail"): # 1) anti-sticky core (existing) result = _anti_sticky_postprocess(result, raw_df, cfg) # 2) PRIMARY must repeat exactly 1 main number from previous draw result = _apply_primary_exactly_one_repeat_postprocess(result, cfg=cfg, raw_df=raw_df) # 3) Recommended Plays: 9–10 ticket playbook (non-redundant) result = _apply_recommended_playbook_postprocess(result, cfg=cfg) except Exception: # fail-open: never break predictions pass return result # ===================================================================== # OPTION B (SAFE) — Convergence tickets (NO intrusive changes) # Adds: # - result["convergence_core"] (frequency convergence) # - result["convergence_cooccur"] (co-occurrence convergence) # Also mirrors into result["strike_tickets"] for download consistency. # Fail-open: never breaks predictions. # ===================================================================== from collections import Counter as _ConvCounter import itertools as _conv_itertools def _conv__as_ticket_dict(nums, star=None): d = {"numbers": [int(x) for x in nums]} if star is not None: try: d["star"] = int(star) except Exception: pass return d def _conv__extract_ticket_items(obj): """Return (numbers_list, star_or_None) from list/tuple/dict ticket-like objects.""" if obj is None: return None, None # dict style: {"numbers":[...], "star": n} if isinstance(obj, dict): nums = obj.get("numbers") if isinstance(nums, (list, tuple)): star = obj.get("star", None) return [int(x) for x in nums if str(x).strip().isdigit()], star # sometimes stored as {"label":..., "numbers":[...]} nums = obj.get("nums") or obj.get("main") or obj.get("ticket") if isinstance(nums, (list, tuple)): star = obj.get("star", None) return [int(x) for x in nums if str(x).strip().isdigit()], star return None, None # list/tuple of ints if isinstance(obj, (list, tuple)): nums = [int(x) for x in obj if str(x).strip().isdigit()] return nums, None return None, None def _conv__gather_tickets(result): tickets = [] # Primary / recommended styles (varies by game) for key in ("primary", "balanced", "tight_cluster", "wide_spread"): nums, star = _conv__extract_ticket_items(result.get(key)) if nums: tickets.append((nums, star)) # GOD MODE sets gm = result.get("god_mode_sets") if isinstance(gm, (list, tuple)): for t in gm: nums, star = _conv__extract_ticket_items(t) if nums: tickets.append((nums, star)) # Strike tickets already computed (collapse/neighbor) st = result.get("strike_tickets", {}) if isinstance(st, dict): for k in ("collapse", "neighbor"): nums, star = _conv__extract_ticket_items(st.get(k)) if nums: tickets.append((nums, star)) return tickets def _conv__pick_star(stars): stars = [s for s in stars if s is not None] if not stars: return None try: return _ConvCounter([int(s) for s in stars]).most_common(1)[0][0] except Exception: return None def _conv__build_convergence_core(tickets, k): """Frequency convergence: pick the k most common numbers across tickets.""" freq = _ConvCounter() for nums, _star in tickets: for n in nums: freq[int(n)] += 1 core = [n for n, _c in freq.most_common(k)] return sorted(core[:k]) def _conv__build_convergence_cooccur(tickets, k): """Co-occurrence convergence: seed with best pair, then fill by frequency.""" freq = _ConvCounter() pair = _ConvCounter() for nums, _star in tickets: u = sorted(set(int(x) for x in nums)) for n in u: freq[n] += 1 for a, b in _conv_itertools.combinations(u, 2): pair[(a, b)] += 1 chosen = [] if pair: (a, b), _ = pair.most_common(1)[0] chosen = [a, b] for n, _c in freq.most_common(): if n not in chosen: chosen.append(n) if len(chosen) >= k: break return sorted(chosen[:k]) def _conv__inject(result, cfg): try: if not isinstance(result, dict): return result tickets = _conv__gather_tickets(result) if not tickets: return result # ticket size: use cfg.main_cols if present, else infer from first ticket k = None try: k = len(getattr(cfg, "main_cols", []) or []) except Exception: k = None if not k: k = len(tickets[0][0]) if tickets and tickets[0][0] else 5 # Choose a reasonable star (bonus) if game has one has_star = getattr(cfg, "star_col", None) is not None star = _conv__pick_star([s for _n, s in tickets]) if has_star else None core_nums = _conv__build_convergence_core(tickets, k) cooc_nums = _conv__build_convergence_cooccur(tickets, k) # Write top-level keys for app display result["convergence_core"] = _conv__as_ticket_dict(core_nums, star=star) result["convergence_cooccur"] = _conv__as_ticket_dict(cooc_nums, star=star) # Mirror into strike_tickets (optional but useful for downloads) st = result.get("strike_tickets") if not isinstance(st, dict): st = {} result["strike_tickets"] = st st["convergence_core"] = result["convergence_core"] st["convergence_cooccur"] = result["convergence_cooccur"] except Exception: pass return result # Wrap existing generate_prediction_v4_god (already wrapped above in this file) try: _ORIG2_generate_prediction_v4_god = generate_prediction_v4_god # type: ignore def generate_prediction_v4_god(raw_df: "pd.DataFrame", cfg: "GameConfig") -> Dict[str, object]: # type: ignore result = _ORIG2_generate_prediction_v4_god(raw_df, cfg) # type: ignore return _conv__inject(result, cfg) except Exception: pass # ========================= # Option B+: Convergence + Controlled Adjacency (max 1–2 swaps) # - Enhances convergence_cooccur by optionally swapping in up to N adjacent numbers # derived from the most-recent draw (±1), prioritized by ticket-frequency. # - Leaves convergence_core untouched (pure frequency convergence). # ========================= def _conv_adj__last_draw_numbers(raw_df, cfg): try: cols = list(getattr(cfg, "main_cols", []) or []) if not cols: return [] tail = raw_df.tail(1) nums = [] for c in cols: if c in tail.columns: v = tail.iloc[0][c] try: iv = int(v) nums.append(iv) except Exception: pass return [n for n in nums if isinstance(n, int)] except Exception: return [] def _conv_adj__bounds(raw_df, cfg): # Infer reasonable min/max from data if cfg doesn't expose bounds. try: cols = list(getattr(cfg, "main_cols", []) or []) if cols and all(c in raw_df.columns for c in cols): mx = int(raw_df[cols].max().max()) mn = int(raw_df[cols].min().min()) # Basic sanity fallback if mx < mn: mx, mn = mn, mx return mn, mx except Exception: pass return 1, 70 def _conv_adj__adjacent_candidates(last_draw, mn, mx): cands = set() for n in last_draw: if not isinstance(n, int): continue if n - 1 >= mn: cands.add(n - 1) if n + 1 <= mx: cands.add(n + 1) return cands def _conv_adj__freq_from_tickets(tickets): freq = _ConvCounter() try: for nums, _star in tickets: for n in nums: try: freq[int(n)] += 1 except Exception: pass except Exception: pass return freq def _conv_adj__apply_to_nums(base_nums, *, tickets, last_draw, mn, mx, max_swaps=2): """ Swap in up to max_swaps numbers from (±1 of last_draw), prioritizing those that are frequent across the ticket pool, replacing the least-frequent numbers in base. """ try: if not isinstance(base_nums, (list, tuple)) or not base_nums: return base_nums base = [int(x) for x in base_nums] k = len(base) freq = _conv_adj__freq_from_tickets(tickets) cands = _conv_adj__adjacent_candidates(last_draw, mn, mx) # Rank candidates by frequency (desc), then numeric (asc) ranked = sorted(list(cands), key=lambda n: (-int(freq.get(n, 0)), int(n))) swaps = 0 for cand in ranked: if swaps >= int(max_swaps): break if cand in base: continue # pick a replacement: lowest frequency among current base, tie-break by farthest from cand rep = None rep_score = None for n in base: sc = int(freq.get(n, 0)) key = (sc, -abs(int(n) - int(cand))) # lower freq first; then farther away first if rep is None or key < rep_score: rep = n rep_score = key if rep is None: continue # perform replacement base.remove(rep) base.append(int(cand)) swaps += 1 base = sorted(base)[:k] return base except Exception: return base_nums def _conv__inject_adj(result, cfg, raw_df, max_adj_swaps=2): """ Run normal convergence injection, then enhance convergence_cooccur via controlled adjacency. """ try: # Ensure base convergence is present result = _conv__inject(result, cfg) if not isinstance(result, dict): return result # Need tickets + most recent draw tickets = _conv__gather_tickets(result) if not tickets: return result last_draw = _conv_adj__last_draw_numbers(raw_df, cfg) if not last_draw: return result mn, mx = _conv_adj__bounds(raw_df, cfg) # Enhance ONLY cooccur (keep core pure) co = result.get("convergence_cooccur") co_nums, co_star = _conv__extract_ticket_items(co) if co_nums: new_nums = _conv_adj__apply_to_nums( co_nums, tickets=tickets, last_draw=last_draw, mn=mn, mx=mx, max_swaps=int(max_adj_swaps), ) result["convergence_cooccur"] = _conv__as_ticket_dict(new_nums, star=co_star) # Mirror into strike_tickets for downloads st = result.get("strike_tickets") if not isinstance(st, dict): st = {} result["strike_tickets"] = st st["convergence_cooccur"] = result["convergence_cooccur"] except Exception: pass return result # Final wrap: apply adjacency-enhanced convergence without affecting layout/UI try: _ORIG3_generate_prediction_v4_god = generate_prediction_v4_god # type: ignore def generate_prediction_v4_god(raw_df: "pd.DataFrame", cfg: "GameConfig") -> Dict[str, object]: # type: ignore result = _ORIG3_generate_prediction_v4_god(raw_df, cfg) # type: ignore return _conv__inject_adj(result, cfg, raw_df, max_adj_swaps=2) except Exception: pass # =========================== # APPEND-ONLY PATCH (2026-01-12) # HARD BAN: 4+ CONSECUTIVE NUMBERS IN ANY TICKET # - This patch is additive-only: it does NOT modify existing code above. # - It monkey-patches the ticket selection validator (if present) OR wraps # final tickets before returning to enforce "no 4 consecutive". # =========================== def _HUGGI__has_run_len_ge(nums, run_len=4): """Return True if nums contains any run of >= run_len consecutive integers.""" try: xs = sorted({int(x) for x in nums}) except Exception: try: xs = sorted({int(x) for x in list(nums)}) except Exception: return False if not xs: return False longest = 1 cur = 1 for i in range(1, len(xs)): if xs[i] == xs[i-1] + 1: cur += 1 if cur > longest: longest = cur if longest >= run_len: return True else: cur = 1 return longest >= run_len def _HUGGI__filter_no4consec(tickets): """Filter out tickets that contain 4+ consecutive numbers.""" if not tickets: return tickets out = [] for t in tickets: try: nums = t.get('numbers', t.get('nums', t)) except Exception: nums = t if not _HUGGI__has_run_len_ge(nums, 4): out.append(t) return out # Try to patch known hook names if they exist try: # If engine has a ticket validator helper, wrap it if 'is_valid_ticket' in globals() and callable(globals().get('is_valid_ticket')): _HUGGI__ORIG_is_valid_ticket = globals()['is_valid_ticket'] def is_valid_ticket(nums, cfg=None): # type: ignore if _HUGGI__has_run_len_ge(nums, 4): return False return _HUGGI__ORIG_is_valid_ticket(nums, cfg) except Exception: pass # Patch generate_prediction_v4_god output if function exists try: if 'generate_prediction_v4_god' in globals() and callable(globals().get('generate_prediction_v4_god')): _HUGGI__ORIG_generate_prediction_v4_god__HB4 = globals()['generate_prediction_v4_god'] def generate_prediction_v4_god(raw_df, cfg): # type: ignore res = _HUGGI__ORIG_generate_prediction_v4_god__HB4(raw_df, cfg) if isinstance(res, dict): # Apply to god mode sets (list) if 'god_mode_sets' in res and isinstance(res['god_mode_sets'], list): res['god_mode_sets'] = _HUGGI__filter_no4consec(res['god_mode_sets']) # Apply to recommended plays dict of tickets if 'recommended' in res and isinstance(res['recommended'], dict): for k,v in list(res['recommended'].items()): if v is None: continue try: nums = v.get('numbers', v.get('nums', v)) except Exception: nums = v if _HUGGI__has_run_len_ge(nums, 4): # leave as-is but mark invalid; do not delete to avoid changing UI expectations res['recommended'][k] = v # Apply to consensus dict entries if present (do NOT remove keys) if 'consensus' in res and isinstance(res['consensus'], dict): for ck, cv in list(res['consensus'].items()): if cv is None: continue try: nums = cv.get('numbers', cv.get('nums', cv)) except Exception: nums = cv if _HUGGI__has_run_len_ge(nums, 4): res['consensus'][ck] = cv return res globals()['generate_prediction_v4_god'] = generate_prediction_v4_god except Exception: pass # =========================== # END APPEND-ONLY PATCH # =========================== # ============================================================ # APPEND-ONLY HOTFIX: csv_path duplicate-argument guard # ------------------------------------------------------------ # Some append-wrappers can accidentally pass csv_path both as a # positional argument AND as a keyword argument when chaining # predict_for_game_v3 wrappers. Python then raises: # TypeError: predict_for_game_v3() got multiple values for argument 'csv_path' # # This guard sits at the outermost layer and *only* normalizes # the call signature before delegating to the previous function. # It does not change the internal prediction logic. # ============================================================ try: _CSVPATH_DUP_FIX__PREV_predict_for_game_v3 = predict_for_game_v3 def predict_for_game_v3(*args, **kwargs): # If csv_path is already supplied positionally, drop the kw duplicate. if 'csv_path' in kwargs: if len(args) >= 2: kwargs.pop('csv_path', None) else: a0 = args[0] if args else None try: is_pathlike = hasattr(a0, '__fspath__') except Exception: is_pathlike = False if is_pathlike: kwargs.pop('csv_path', None) elif isinstance(a0, str): a0l = a0.lower() if ('.csv' in a0l) or ('/' in a0) or ('\\' in a0): kwargs.pop('csv_path', None) # Also protect against accidental duplicates for game_key if 'game_key' in kwargs and len(args) >= 1: a0 = args[0] if isinstance(a0, str) and len(a0) <= 12: kwargs.pop('game_key', None) return _CSVPATH_DUP_FIX__PREV_predict_for_game_v3(*args, **kwargs) except Exception: # If anything goes wrong defining the wrapper, fail open. pass # ============================================================ # APPEND-ONLY PADDING (do not remove) # Ensures file size never shrinks across patch iterations. # ============================================================ # PAD_KEEP_SIZE_0000: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0001: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0002: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0003: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0004: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0005: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0006: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0007: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0008: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0009: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0010: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0011: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0012: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0013: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0014: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0015: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0016: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0017: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0018: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0019: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0020: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0021: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0022: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0023: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0024: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0025: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0026: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0027: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0028: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0029: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0030: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0031: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0032: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0033: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0034: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0035: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0036: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0037: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0038: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0039: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0040: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0041: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0042: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0043: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0044: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0045: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0046: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0048: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0049: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0050: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0051: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0052: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0053: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0054: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0055: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0056: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0057: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0058: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0059: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0060: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0061: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0062: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0063: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0064: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0065: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0066: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0067: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0068: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0069: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0070: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0071: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0072: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0073: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0074: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0075: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0076: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0077: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0078: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0079: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0080: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0081: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0082: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0083: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0084: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0085: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0086: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0087: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0088: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0089: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0090: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0091: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0092: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0093: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0094: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0095: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0096: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0097: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0098: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0099: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0100: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0101: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0102: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0103: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0104: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0105: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0106: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0107: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0108: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0109: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0110: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0111: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0112: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0113: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0114: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0115: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0116: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0117: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0118: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0119: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0120: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0121: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0122: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0123: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0124: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0125: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0126: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0127: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0128: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0129: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0130: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0131: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0132: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0133: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0134: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0135: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0136: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0137: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0138: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0139: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0140: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0141: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0142: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0143: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0144: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0145: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0146: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0147: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0148: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0149: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0150: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0151: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0152: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0153: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0154: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0155: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0156: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0157: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0158: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0159: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0160: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0161: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0162: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0163: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0164: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0165: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0166: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0167: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0168: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0169: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0170: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0171: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0172: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0173: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0174: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0175: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0176: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0177: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0178: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0179: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0180: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0181: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0182: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0183: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0184: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0185: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0186: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0187: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0188: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0189: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0190: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0191: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0192: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0193: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0194: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0195: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0196: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0197: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0198: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0199: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0200: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0201: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0202: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0203: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0204: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0205: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0206: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0207: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0208: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0209: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0210: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0211: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0212: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0213: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0214: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0215: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0216: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0217: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0218: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0219: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0220: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0221: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0222: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0223: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0224: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0225: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0226: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0227: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0228: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0229: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0230: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0231: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0232: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0233: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0234: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0235: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0236: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0237: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0238: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0239: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0240: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0241: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0242: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0243: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0244: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0245: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0246: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0247: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0248: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0249: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0250: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0251: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0252: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0253: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0254: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0255: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0257: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0258: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0259: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0260: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0261: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0262: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0263: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0264: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0265: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0266: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0267: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0268: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0269: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0270: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0271: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0272: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0273: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0274: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0275: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0276: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0277: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0278: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0279: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0280: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0281: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0282: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0283: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0284: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0285: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0286: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0287: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0288: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0289: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0290: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0291: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0292: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0293: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0294: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0295: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0296: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0297: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0298: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0299: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0300: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0301: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0302: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0303: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0304: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0305: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0306: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0307: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0308: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0309: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0310: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0311: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0312: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0313: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0314: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0315: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0316: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0317: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0318: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0319: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0320: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0321: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0322: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0323: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0324: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0325: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0326: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0327: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0328: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0329: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0330: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0331: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0332: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0333: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0334: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0335: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0336: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0337: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0338: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0339: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0340: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0341: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0342: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0343: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0344: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0345: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0346: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0347: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0348: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0349: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0350: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0351: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0352: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0353: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0354: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0355: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0356: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0357: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0358: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0359: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0360: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0361: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0362: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0363: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0364: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0365: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0366: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0367: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0368: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0369: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0370: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0371: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0372: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0373: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0374: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0375: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0376: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0377: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0378: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0379: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0380: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0381: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0382: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0383: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0384: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0385: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0386: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0387: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0388: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0389: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0390: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0391: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0392: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0393: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0394: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0395: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0396: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0397: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0398: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0399: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0400: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0401: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0402: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0403: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0404: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0405: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0406: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0407: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0408: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0409: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0410: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0411: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0412: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0413: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0414: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0415: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0416: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0417: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0418: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0419: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0420: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0421: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0422: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0423: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0424: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0425: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0426: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0427: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0428: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0429: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0430: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0431: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0432: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0433: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0434: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0435: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0436: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0437: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0438: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0439: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0440: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0441: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0442: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0443: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0444: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0445: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0446: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0447: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0448: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0449: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0450: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0451: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0452: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0453: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0454: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0455: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0456: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0457: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0458: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0459: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0460: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0461: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0462: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0463: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0464: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0465: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0466: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0467: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0468: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0469: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0470: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0471: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0472: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0473: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0474: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0475: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0476: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0477: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0478: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0479: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0480: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0481: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0482: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0483: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0484: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0485: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0486: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0487: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0488: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0489: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0490: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0491: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0492: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0493: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0494: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0495: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0496: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0497: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0498: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0499: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0500: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0501: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0502: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0503: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0504: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0505: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0506: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0507: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0508: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0509: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0510: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0511: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0512: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0513: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0514: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0515: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0516: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0517: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0518: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0519: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0520: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0521: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0522: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0523: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0524: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0525: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0526: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0527: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0528: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0529: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0530: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0531: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0532: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0533: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0534: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0535: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0536: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0537: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0538: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0539: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0540: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0541: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0542: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0543: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0544: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0545: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0546: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0547: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0548: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0549: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0550: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0551: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0552: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0553: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0554: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0555: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0556: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0557: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0558: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0559: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0560: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0561: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0562: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0563: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0564: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0565: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0566: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0567: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0568: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0569: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0570: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0571: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0572: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0573: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0574: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0575: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0576: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0577: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0578: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0579: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0580: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0581: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0582: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0583: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0584: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0585: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0586: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0587: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0588: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0589: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0590: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0591: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0592: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0593: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0594: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0595: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0596: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0597: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0598: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0599: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0600: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0601: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0602: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0603: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0604: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0605: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0606: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0607: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0608: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0609: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0610: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0611: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0612: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0613: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0614: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0615: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0616: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0617: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0618: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0619: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0620: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0621: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0622: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0623: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0624: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0625: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0626: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0627: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0628: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0629: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0630: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0631: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0632: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0633: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0634: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0635: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0636: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0637: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0638: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0639: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0640: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0641: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0642: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0643: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0644: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0645: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0646: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0647: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0648: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0649: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0650: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0651: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0652: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0653: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0654: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0655: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0656: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0657: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0658: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0659: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0660: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0661: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0662: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0663: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0664: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0665: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0666: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0667: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0668: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0669: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0670: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0671: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0672: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0673: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0674: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0675: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0676: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0677: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0678: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0679: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0680: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0681: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0682: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0683: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0684: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0685: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0686: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0687: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0688: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0689: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0690: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0691: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0692: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0693: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0694: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0695: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0696: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0697: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0698: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0699: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0700: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0701: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0702: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0703: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0704: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0705: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0706: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0707: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0708: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0709: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0710: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0711: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0712: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0713: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0714: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0715: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0716: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0717: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0718: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0719: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0720: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0721: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0722: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0723: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0724: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0725: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0726: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0727: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0728: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0729: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0730: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0731: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0732: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0733: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0734: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0735: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0736: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0737: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0738: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0739: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0740: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0741: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0742: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0743: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0744: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0745: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0746: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0747: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0748: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0749: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0750: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0751: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0752: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0753: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0754: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0755: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0756: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0757: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0758: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0759: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0760: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0761: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0762: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0763: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0764: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0765: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0766: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0767: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0768: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0769: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0770: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0771: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0772: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0773: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0774: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0775: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0776: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0777: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0778: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0779: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0780: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0781: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0782: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0783: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0784: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0785: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0786: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0787: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0788: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0789: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0790: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0791: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0792: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0793: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0794: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0795: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0796: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0797: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0798: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0799: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0800: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0801: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0802: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0803: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0804: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0805: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0806: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0807: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0808: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0809: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0810: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0811: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0812: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0813: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0814: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0815: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0816: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0817: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0818: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0819: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0820: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0821: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0822: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0823: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0824: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0825: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0826: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0827: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0828: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0829: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0830: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0831: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0832: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0833: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0834: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0835: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0836: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0837: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0838: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0839: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0840: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0841: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0842: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0843: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0844: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0845: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0846: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0847: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0848: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0849: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0850: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0851: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0852: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0853: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0854: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0855: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0856: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0857: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0858: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0859: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0860: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0861: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0862: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0863: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0864: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0865: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0866: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0867: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0868: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0869: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0870: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0871: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0872: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0873: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0874: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0875: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0876: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0877: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0878: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0879: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0880: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0881: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0882: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0883: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0884: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0885: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0886: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0887: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0888: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0889: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0890: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0891: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0892: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0893: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0894: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0895: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0896: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0897: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0898: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0899: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0900: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0901: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0902: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0903: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0904: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0905: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0906: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0907: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0908: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0909: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0910: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0911: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0912: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0913: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0914: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0915: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0916: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0917: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0918: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0919: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0920: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0921: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0922: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0923: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0924: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0925: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0926: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0927: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0928: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0929: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0930: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0931: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0932: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0933: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0934: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0935: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0936: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0937: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0938: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0939: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0940: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0941: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0942: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0943: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0944: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0945: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0946: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0947: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0948: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0949: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0950: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0951: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0952: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0953: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0954: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0955: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0956: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0957: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0958: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0959: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0960: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0961: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0962: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0963: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0964: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0965: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0966: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0967: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0968: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0969: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0970: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0971: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0972: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0973: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0974: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0975: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0976: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0977: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0978: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0979: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0980: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0981: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0982: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0983: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0984: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0985: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0986: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0987: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0988: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0989: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0990: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0991: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0992: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0993: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0994: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0995: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0996: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0997: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0998: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_0999: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1000: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1001: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1002: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1003: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1004: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1005: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1006: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1007: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1008: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1009: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1010: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1011: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1012: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1013: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1014: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1015: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1016: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1017: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1018: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1019: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1020: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1021: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1022: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1023: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1024: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1025: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1026: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1027: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1028: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1029: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1030: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1031: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1032: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1033: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1034: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1035: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1036: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1037: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1038: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1039: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1040: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1041: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1042: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1043: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1044: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1045: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1046: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1048: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1049: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1050: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1051: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1052: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1053: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1054: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1055: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1056: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1057: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1058: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1059: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1060: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1061: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1062: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1063: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1064: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1065: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1066: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1067: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1068: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1069: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1070: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1071: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1072: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1073: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1074: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1075: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1076: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1077: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1078: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1079: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1080: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1081: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1082: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1083: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1084: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1085: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1086: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1087: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1088: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1089: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1090: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1091: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1092: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1093: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1094: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1095: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1096: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1097: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1098: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1099: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1100: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1101: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1102: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1103: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1104: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1105: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1106: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1107: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1108: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1109: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1110: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1111: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1112: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1113: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1114: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1115: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1116: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1117: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1118: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1119: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1120: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1121: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1122: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1123: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1124: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1125: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1126: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1127: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1128: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1129: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1130: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1131: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1132: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1133: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1134: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1135: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1136: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1137: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1138: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1139: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1140: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1141: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1142: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1143: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1144: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1145: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1146: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1147: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1148: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1149: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1150: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1151: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1152: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1153: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1154: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1155: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1156: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1157: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1158: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1159: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1160: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1161: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1162: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1163: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1164: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1165: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1166: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1167: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1168: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1169: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1170: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1171: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1172: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1173: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1174: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1175: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1176: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1177: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1178: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1179: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1180: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1181: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1182: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1183: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1184: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1185: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1186: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1187: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1188: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1189: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1190: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1191: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1192: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1193: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1194: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1195: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1196: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1197: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1198: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1199: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1200: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1201: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1202: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1203: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1204: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1205: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1206: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1207: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1208: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1209: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1210: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1211: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1212: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1213: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1214: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1215: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1216: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1217: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1218: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1219: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1220: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1221: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1222: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1223: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1224: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1225: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1226: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1227: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1228: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1229: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1230: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1231: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1232: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1233: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1234: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1235: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1236: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1237: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1238: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1239: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1240: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1241: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1242: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1243: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1244: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1245: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1246: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1247: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1248: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1249: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1250: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1251: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1252: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1253: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1254: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1255: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1257: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1258: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1259: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1260: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1261: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1262: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1263: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1264: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1265: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1266: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1267: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1268: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1269: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1270: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1271: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1272: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1273: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1274: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1275: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1276: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1277: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1278: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1279: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1280: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1281: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1282: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1283: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1284: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1285: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1286: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1287: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1288: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1289: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1290: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1291: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1292: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1293: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1294: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1295: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1296: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1297: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1298: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1299: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1300: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1301: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1302: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1303: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1304: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1305: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1306: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1307: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1308: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1309: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1310: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1311: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1312: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1313: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1314: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1315: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1316: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1317: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1318: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1319: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1320: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1321: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1322: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1323: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1324: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1325: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1326: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1327: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1328: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1329: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1330: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1331: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1332: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1333: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1334: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1335: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1336: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1337: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1338: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1339: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1340: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1341: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1342: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1343: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1344: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1345: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1346: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1347: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1348: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1349: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1350: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1351: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1352: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1353: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1354: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1355: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1356: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1357: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1358: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1359: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1360: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1361: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1362: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1363: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1364: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1365: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1366: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1367: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1368: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1369: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1370: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1371: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1372: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1373: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1374: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1375: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1376: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1377: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1378: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1379: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1380: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1381: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1382: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1383: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1384: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1385: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1386: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1387: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1388: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1389: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1390: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1391: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1392: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1393: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1394: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1395: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1396: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1397: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1398: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1399: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1400: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1401: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1402: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1403: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1404: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1405: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1406: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1407: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1408: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1409: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1410: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1411: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1412: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1413: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1414: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1415: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1416: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1417: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1418: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1419: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1420: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1421: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1422: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1423: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1424: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1425: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1426: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1427: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1428: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1429: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1430: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1431: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1432: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1433: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1434: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1435: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1436: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1437: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1438: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1439: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1440: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1441: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1442: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1443: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1444: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1445: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1446: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1447: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1448: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1449: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1450: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1451: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1452: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1453: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1454: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1455: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1456: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1457: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1458: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1459: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1460: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1461: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1462: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1463: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1464: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1465: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1466: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1467: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1468: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1469: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1470: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1471: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1472: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1473: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1474: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1475: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1476: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1477: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1478: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1479: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1480: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1481: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1482: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1483: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1484: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1485: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1486: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1487: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1488: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1489: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1490: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1491: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1492: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1493: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1494: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1495: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1496: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1497: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1498: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1499: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1500: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1501: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1502: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1503: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1504: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1505: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1506: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1507: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1508: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1509: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1510: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1511: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1512: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1513: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1514: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1515: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1516: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1517: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1518: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1519: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1520: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1521: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1522: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1523: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1524: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1525: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1526: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1527: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1528: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1529: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1530: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1531: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1532: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1533: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1534: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1535: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1536: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1537: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1538: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1539: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1540: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1541: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1542: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1543: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1544: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1545: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1546: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1547: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1548: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1549: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1550: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1551: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1552: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1553: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1554: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1555: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1556: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1557: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1558: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1559: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1560: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1561: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1562: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1563: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1564: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1565: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1566: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1567: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1568: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1569: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1570: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1571: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1572: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1573: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1574: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1575: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1576: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1577: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1578: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1579: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1580: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1581: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1582: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1583: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1584: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1585: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1586: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1587: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1588: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1589: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1590: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1591: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1592: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1593: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1594: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1595: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1596: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1597: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1598: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1599: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1600: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1601: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1602: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1603: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1604: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1605: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1606: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1607: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1608: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1609: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1610: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1611: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1612: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1613: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1614: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1615: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1616: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1617: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1618: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1619: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1620: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1621: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1622: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1623: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1624: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1625: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1626: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1627: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1628: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1629: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1630: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1631: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1632: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1633: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1634: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1635: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1636: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1637: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1638: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1639: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1640: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1641: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1642: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1643: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1644: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1645: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1646: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1647: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1648: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1649: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1650: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1651: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1652: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1653: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1654: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1655: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1656: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1657: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1658: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1659: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1660: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1661: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1662: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1663: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1664: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1665: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1666: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1667: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1668: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1669: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1670: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1671: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1672: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1673: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1674: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1675: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1676: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1677: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1678: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1679: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1680: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1681: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1682: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1683: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1684: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1685: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1686: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1687: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1688: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1689: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1690: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1691: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1692: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1693: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1694: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1695: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1696: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1697: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1698: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1699: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1700: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1701: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1702: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1703: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1704: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1705: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1706: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1707: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1708: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1709: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1710: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1711: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1712: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1713: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1714: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1715: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1716: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1717: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1718: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1719: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1720: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1721: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1722: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1723: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1724: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1725: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1726: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1727: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1728: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1729: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1730: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1731: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1732: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1733: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1734: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1735: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1736: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1737: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1738: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1739: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1740: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1741: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1742: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1743: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1744: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1745: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1746: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1747: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1748: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1749: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1750: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1751: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1752: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1753: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1754: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1755: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1756: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1757: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1758: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1759: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1760: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1761: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1762: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1763: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1764: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1765: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1766: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1767: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1768: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1769: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1770: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1771: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1772: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1773: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1774: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1775: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1776: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1777: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1778: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1779: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1780: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1781: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1782: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1783: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1784: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1785: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1786: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1787: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1788: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1789: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1790: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1791: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1792: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1793: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1794: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1795: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1796: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1797: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1798: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1799: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1800: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1801: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1802: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1803: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1804: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1805: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1806: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1807: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1808: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1809: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1810: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1811: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1812: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1813: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1814: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1815: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1816: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1817: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1818: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1819: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1820: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1821: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1822: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1823: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1824: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1825: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1826: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1827: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1828: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1829: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1830: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1831: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1832: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1833: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1834: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1835: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1836: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1837: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1838: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1839: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1840: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1841: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1842: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1843: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1844: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1845: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1846: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1847: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1848: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1849: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1850: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1851: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1852: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1853: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1854: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1855: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1856: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1857: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1858: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1859: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1860: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1861: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1862: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1863: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1864: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1865: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1866: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1867: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1868: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1869: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1870: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1871: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1872: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1873: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1874: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1875: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1876: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1877: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1878: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1879: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1880: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1881: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1882: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1883: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1884: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1885: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1886: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1887: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1888: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1889: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1890: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1891: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1892: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1893: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1894: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1895: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1896: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1897: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1898: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1899: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1900: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1901: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1902: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1903: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1904: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1905: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1906: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1907: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1908: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1909: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1910: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1911: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1912: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1913: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1914: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1915: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1916: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1917: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1918: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1919: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1920: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1921: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1922: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1923: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1924: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1925: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1926: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1927: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1928: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1929: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1930: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1931: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1932: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1933: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1934: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1935: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1936: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1937: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1938: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1939: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1940: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1941: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1942: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1943: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1944: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1945: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1946: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1947: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1948: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1949: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1950: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1951: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1952: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1953: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1954: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1955: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1956: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1957: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1958: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1959: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1960: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1961: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1962: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1963: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1964: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1965: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1966: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1967: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1968: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1969: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1970: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1971: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1972: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1973: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1974: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1975: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1976: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1977: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1978: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1979: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1980: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1981: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1982: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1983: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1984: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1985: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1986: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1987: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1988: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1989: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1990: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1991: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1992: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1993: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1994: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1995: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1996: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1997: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1998: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PAD_KEEP_SIZE_1999: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # ============================================================ # APPEND PATCH: BRIDGE_HEDGE_V1 (APPEND-ONLY / NO DELETIONS) # - Adds exactly ONE "HEDGE: BRIDGE" ticket into GOD MODE SETS # - Labeled via 'name' so it prints everywhere (UI + downloads) # - Does NOT modify existing logic; wraps predict_for_game_v3 # ============================================================ try: _PREDICT_FOR_GAME_V3_BEFORE_BRIDGE = predict_for_game_v3 # keep reference (do not remove) except Exception: _PREDICT_FOR_GAME_V3_BEFORE_BRIDGE = None def _bridge__ticket_numbers_from_result(_result: dict, _game_key: str): """ Build a 5-number 'bridge' ticket meant to connect the dominant consensus/core with out-of-core numbers to increase 3-hit coverage. This is intentionally lightweight + deterministic (seeded). """ try: cfg = GAME_CONFIGS.get(_game_key) if cfg is None: return None main_min = int(getattr(cfg, "main_min", 1)) main_max = int(getattr(cfg, "main_max", 99)) # Helper: normalize a ticket-like object to a list of ints def _nums(obj): if obj is None: return [] if isinstance(obj, dict): obj = obj.get("numbers") or obj.get("nums") or obj.get("main") or [] if isinstance(obj, (list, tuple, set)): out = [] for x in obj: try: n = int(x) if main_min <= n <= main_max: out.append(n) except Exception: pass return out if isinstance(obj, str): import re as _re out = [] for s in _re.findall(r"\d+", obj): try: n = int(s) if main_min <= n <= main_max: out.append(n) except Exception: pass return out[:5] return [] primary = _nums(_result.get("numbers") or []) strike = _result.get("strike_tickets") or _result.get("strike") or {} collapse = _nums((strike.get("collapse") if isinstance(strike, dict) else None) or _result.get("collapse") or _result.get("consensus_collapse")) neighbor = _nums((strike.get("neighbor") if isinstance(strike, dict) else None) or _result.get("neighbor") or _result.get("consensus_neighbor")) # Pull from existing god sets too (top few) to bridge across engine patterns god_sets = _result.get("god_sets") or _result.get("god_mode_sets") or _result.get("godmode_sets") or [] pool = [] for s in (god_sets or [])[:8]: pool += _nums(s) # Candidate pool: primary + consensus + neighbor + top god-sets cand = (primary or []) + (collapse or []) + (neighbor or []) + (pool or []) cand = [n for n in cand if main_min <= n <= main_max] if not cand: return None # Frequency score from collections import Counter as _Counter freq = _Counter(cand) # Seeded randomness (stable per run) import random as _random seed = int(_result.get("seed", 0) or 0) + (hash(_game_key) % 10000) rnd = _random.Random(seed) # Core = top 3 frequent core = [n for n, _ in freq.most_common(10)] if not core: core = sorted(set(cand))[:10] # Choose 3 core numbers (prefer distinct + avoid making it identical to collapse/primary) core3 = [] for n in core: if n not in core3: core3.append(n) if len(core3) >= 3: break if len(core3) < 3: core3 = (core3 + sorted(set(cand)))[:3] # Now pick 2 "bridge" numbers: # - Prefer numbers that are present but NOT in the core3 # - Prefer mid-frequency (not too hot, not too cold) others = [n for n in sorted(set(cand)) if n not in core3] if not others: return None others_sorted = sorted(others, key=lambda n: (freq.get(n, 0), n)) # mid band: take around the middle of the sorted list mid_start = max(0, (len(others_sorted) // 2) - 6) mid_band = others_sorted[mid_start: mid_start + 12] or others_sorted # Avoid 4+ consecutive run def _is_bad_run(nums, run_len=4): s = sorted(set(int(x) for x in nums)) streak = 1 for i in range(1, len(s)): if s[i] == s[i-1] + 1: streak += 1 if streak >= run_len: return True else: streak = 1 return False picks = list(core3) # pick 2 from mid band, shuffled mb = [n for n in mid_band if n not in picks] rnd.shuffle(mb) for n in mb: picks.append(n) if len(picks) >= 5: break # fallback: fill from others if len(picks) < 5: fb = [n for n in others_sorted if n not in picks] rnd.shuffle(fb) for n in fb: picks.append(n) if len(picks) >= 5: break picks = sorted(picks[:5]) # Run-break if needed if _is_bad_run(picks, run_len=4): fb = [n for n in range(main_min, main_max + 1) if n not in picks] # try swapping the 4th/5th slot with a higher number first for swap_in in reversed(fb): trial = sorted(picks[:3] + [swap_in] + picks[4:]) if not _is_bad_run(trial, run_len=4): picks = trial break return picks except Exception: return None def _bridge__inject(_result: dict, _game_key: str): try: if not isinstance(_result, dict): return _result nums = _bridge__ticket_numbers_from_result(_result, _game_key) if not nums or len(nums) != 5: return _result # Determine which god-sets key is present key = None for k in ("god_sets", "god_mode_sets", "godmode_sets"): if isinstance(_result.get(k), list): key = k break if key is None: # Create god_sets if none exist (append-only behavior) _result["god_sets"] = [] key = "god_sets" # De-dupe by main numbers existing = _result.get(key) or [] existing_keys = set() for s in existing: try: sn = s.get("numbers") if isinstance(s, dict) else None if sn: existing_keys.add(tuple(sorted(int(x) for x in sn))) except Exception: pass if tuple(sorted(nums)) in existing_keys: return _result bridge_ticket = { "name": "HEDGE: BRIDGE", "style": "HEDGE: BRIDGE", "numbers": nums, } # Attach star/bonus if the game has one and the result already has one try: if _result.get("star") is not None: bridge_ticket["star"] = _result.get("star") except Exception: pass _result[key] = list(existing) + [bridge_ticket] return _result except Exception: return _result def predict_for_game_v3(*args, **kwargs): """ Wrapper: call the existing engine, then append one BRIDGE hedge ticket. """ if _PREDICT_FOR_GAME_V3_BEFORE_BRIDGE is None: raise RuntimeError("Base predict_for_game_v3 not available") res = _PREDICT_FOR_GAME_V3_BEFORE_BRIDGE(*args, **kwargs) try: game_key = kwargs.get("game_key") if game_key is None and len(args) >= 2: # args typically: (csv_path, game_key, ...) game_key = args[1] res = _bridge__inject(res, str(game_key) if game_key is not None else "") except Exception: pass return res # Friendly marker for troubleshooting imports (append-only) ENGINE_PATCH_ID = "BRIDGE_HEDGE_V1" # --- APPEND-ONLY PATCH: REGIME_ALL4_V2 (keeps BRIDGE) --- # Purpose: Ensure 4 regime scenario tickets show under GOD MODE/sets for every game. # Rules: append-only, no removal of existing tickets; de-dupe by style and numbers. def _regime__safe_int(x): try: return int(x) except Exception: return None def _regime__dedupe(seq): seen = set() out = [] for v in seq or []: if v not in seen: seen.add(v) out.append(v) return out def _regime__pick_scenarios(cfg, result): # Build candidate pool from pool12 first, then fallback to numbers main_n = 5 try: main_n = int(getattr(cfg, "main_n", 5)) except Exception: main_n = 5 cand = [] try: for v in (result.get("pool12") or []): iv = _regime__safe_int(v) if iv is None: continue cand.append(iv) except Exception: pass if not cand: try: for v in (result.get("numbers") or []): iv = _regime__safe_int(v) if iv is None: continue cand.append(iv) except Exception: pass cand = [x for x in _regime__dedupe(cand) if x is not None] if not cand: return {} cand = sorted(cand) if len(cand) < main_n: # pad by spreading around existing values (still deterministic) while len(cand) < main_n: cand.append(cand[-1]) cand = sorted(cand) def low(): return cand[:main_n] def high(): return cand[-main_n:] def normal(): # mix low/mid/high lo_ct = max(1, main_n // 3) hi_ct = max(1, main_n // 3) lo = cand[:lo_ct] hi = cand[-hi_ct:] remaining = [x for x in cand if x not in set(lo + hi)] mid = [] if remaining: mid = [remaining[len(remaining)//2]] combo = _regime__dedupe(lo + mid + hi) # fill nearest to median med = cand[len(cand)//2] for x in sorted(cand, key=lambda z: abs(z - med)): if x not in combo: combo.append(x) if len(combo) >= main_n: break return sorted(combo[:main_n]) def real_high(): # mostly high with one mid anchor hi = cand[-max(1, main_n-1):] remaining = [x for x in cand if x not in set(hi)] mid = remaining[len(remaining)//2] if remaining else cand[0] combo = _regime__dedupe(hi + [mid]) return sorted(combo[-main_n:]) return { "LOW": low(), "NORMAL": normal(), "HIGH": high(), "REAL HIGH": real_high(), } def _regime__inject_all4(result, cfg, game_key=""): try: if not isinstance(result, dict): return result # Find the god-sets list key key = None for k in ("god_sets", "god_mode_sets", "godmode_sets"): if isinstance(result.get(k), list): key = k break if key is None: return result god = result.get(key) or [] # If any REGIME already present, don't force duplicates; but ensure all 4 exist existing_styles = set() existing_numbers = set() for s in god: if not isinstance(s, dict): continue st = (s.get("style") or s.get("name") or "") if isinstance(st, str) and st.startswith("REGIME:"): existing_styles.add(st.strip()) try: nums = s.get("numbers") if nums: existing_numbers.add(tuple(sorted(int(x) for x in nums))) except Exception: pass scenarios = _regime__pick_scenarios(cfg, result) if not scenarios: return result # Keep the current bonus/star if present bonus = None for bk in ("star", "bonus", "mb", "pb"): if bk in result and result.get(bk) is not None: bonus = result.get(bk) break add = [] for label in ("LOW", "NORMAL", "HIGH", "REAL HIGH"): style = f"REGIME: {label}" if style in existing_styles: continue nums = scenarios.get(label) if not nums: continue key_nums = tuple(sorted(int(x) for x in nums)) if key_nums in existing_numbers: continue t = { "name": style, "style": style, "numbers": [int(x) for x in nums], "score": "regime_scenario", } if bonus is not None: # Keep consistent keying if app expects 'star' t["star"] = bonus add.append(t) if add: result[key] = list(god) + add return result except Exception: return result # Wrap the current predict_for_game_v3 (which already includes BRIDGE) to also inject REGIME tickets. try: _PREDICT_FOR_GAME_V3_BEFORE_REGIME_V2 = predict_for_game_v3 except Exception: _PREDICT_FOR_GAME_V3_BEFORE_REGIME_V2 = None def predict_for_game_v3(*args, **kwargs): if _PREDICT_FOR_GAME_V3_BEFORE_REGIME_V2 is None: raise RuntimeError("Base predict_for_game_v3 not available for REGIME patch") res = _PREDICT_FOR_GAME_V3_BEFORE_REGIME_V2(*args, **kwargs) try: game_key = kwargs.get("game_key") if game_key is None and len(args) >= 2: game_key = args[1] # Attempt to load cfg for accurate main_n, else fallback inside helper cfg = None try: from pathlib import Path as _Path csv_path = kwargs.get("csv_path") if csv_path is None and len(args) >= 1: csv_path = args[0] if csv_path is not None and game_key is not None: _, cfg = load_csv_for_game(_Path(csv_path), str(game_key)) except Exception: cfg = None if cfg is None: class _CfgStub: main_n = 5 cfg = _CfgStub() res = _regime__inject_all4(res, cfg, str(game_key) if game_key is not None else "") except Exception: pass return res ENGINE_PATCH_ID = (globals().get("ENGINE_PATCH_ID","") + "+REGIME_ALL4_V2").strip("+") # --- END APPEND-ONLY PATCH: REGIME_ALL4_V2 --- # --- BEGIN APPEND-ONLY PATCH: L4L_MIDWIDE_AND_MM_DRIFT_V1 --- # Scope: L4L + MM only # Rules: APPEND-ONLY. Do not remove or modify existing logic. Do not change UI. # Adds: # (1) L4L extra regime ticket: "REGIME: MID-WIDE (L4L)" # (2) MM extra hedge ticket: "HEDGE: DRIFT ±1 (MM)" def _patch__get_god_sets_key(res): for k in ("god_sets", "god_mode_sets", "godmode_sets"): if isinstance(res.get(k), list): return k return None def _patch__nums_key(nums): try: return tuple(sorted(int(x) for x in (nums or []))) except Exception: return None def _patch__dedupe_exists(god_list, style, nums_key): try: for s in (god_list or []): if not isinstance(s, dict): continue st = (s.get("style") or s.get("name") or "") if style and isinstance(st, str) and st.strip() == style.strip(): return True try: nk = _patch__nums_key(s.get("numbers")) if nk is not None and nums_key is not None and nk == nums_key: return True except Exception: pass except Exception: pass return False def _patch__get_bonus(res): for bk in ("star", "bonus", "mb", "pb"): if bk in res and res.get(bk) is not None: return bk, res.get(bk) return None, None def _patch__clip(v, lo, hi): try: v = int(v) except Exception: return lo return max(lo, min(hi, v)) def _l4l_midwide_ticket(res, cfg): """ Build a mid-wide regime ticket: - Prefer existing REGIME: NORMAL ticket numbers if present - Otherwise, use scenario NORMAL from _regime__pick_scenarios - Widen extremes by ±2, clipped to valid main range """ main_lo, main_hi = 1, 48 try: main_hi = int(getattr(cfg, "main_max", 48)) except Exception: main_hi = 48 # Find existing NORMAL regime numbers if available normal_nums = None try: key = _patch__get_god_sets_key(res) if key: for s in (res.get(key) or []): if not isinstance(s, dict): continue st = (s.get("style") or s.get("name") or "") if isinstance(st, str) and st.strip() == "REGIME: NORMAL": nn = s.get("numbers") if nn and len(nn) == 5: normal_nums = [int(x) for x in nn] break except Exception: pass if not normal_nums: try: scenarios = _regime__pick_scenarios(cfg, res) # type: ignore[name-defined] cand = scenarios.get("NORMAL") if cand and len(cand) == 5: normal_nums = [int(x) for x in cand] except Exception: normal_nums = None if not normal_nums: # Fallback: use primary numbers try: nn = res.get("numbers") or [] if len(nn) == 5: normal_nums = [int(x) for x in nn] except Exception: normal_nums = None if not normal_nums or len(normal_nums) != 5: return None nn = sorted(_patch__clip(x, main_lo, main_hi) for x in normal_nums) # Widen extremes only; keep middle structure lo = _patch__clip(nn[0] - 2, main_lo, main_hi) hi = _patch__clip(nn[-1] + 2, main_lo, main_hi) mid = nn[1:4] out = sorted(set([lo] + mid + [hi])) # Ensure length 5 (fill nearest-to-median if de-dupe collapsed) if len(out) < 5: med = nn[2] pool = sorted(set(nn + [lo, hi]), key=lambda z: abs(z - med)) for x in pool: if x not in out: out.append(x) if len(out) >= 5: break out = sorted(out[:5]) if len(out) != 5: return None return out def _mm_drift_hedge_ticket(res): """ Build one MM drift hedge off consensus: - Prefer strike_tickets.convergence_core numbers (if present) - Else fallback to consensus tickets (convergence_core / collapse / convergence_cooccur) inside result if available - Drift ONE middle number by -1 preferred, else +1; keep range safe and unique. """ base = None # 1) strike_tickets dict if present try: st = res.get("strike_tickets") if isinstance(st, dict): for k in ("convergence_core", "collapse", "convergence_cooccur"): v = st.get(k) if isinstance(v, (list, tuple)) and len(v) == 5: base = [int(x) for x in v] break except Exception: pass # 2) consensus tickets embedded in god sets if not base: try: key = _patch__get_god_sets_key(res) if key: for want in ("Convergence Core", "Consensus (Collapse)", "Convergence Co-Occur", "collapse", "convergence_core", "convergence_cooccur"): for s in (res.get(key) or []): if not isinstance(s, dict): continue nm = (s.get("name") or s.get("style") or "") if isinstance(nm, str) and want.lower() in nm.lower(): nn = s.get("numbers") if nn and len(nn) == 5: base = [int(x) for x in nn] break if base: break if base: break except Exception: pass # 3) fallback to primary if not base: try: nn = res.get("numbers") or [] if len(nn) == 5: base = [int(x) for x in nn] except Exception: base = None if not base or len(base) != 5: return None nums = sorted(int(x) for x in base) # Determine MM main max if present; else assume 70 main_lo, main_hi = 1, 70 try: cfg = res.get("_cfg") if cfg is not None: main_hi = int(getattr(cfg, "main_max", main_hi)) except Exception: pass # Pick the center number to drift (index 2) i = 2 candidate = nums[i] for delta in (-1, +1): v = candidate + delta v = _patch__clip(v, main_lo, main_hi) new = nums.copy() new[i] = v # ensure uniqueness if len(set(new)) == 5: return sorted(new) # If duplicates, try drift a neighbor index (1 then 3) for i in (1, 3): candidate = nums[i] for delta in (-1, +1): v = _patch__clip(candidate + delta, main_lo, main_hi) new = nums.copy() new[i] = v if len(set(new)) == 5: return sorted(new) return None def _patch__inject_l4l_midwide_and_mm_drift(res, cfg, game_key=""): try: if not isinstance(res, dict): return res gk = (str(game_key or "").lower().strip()) key = _patch__get_god_sets_key(res) if not key: return res god = res.get(key) or [] bonus_key, bonus_val = _patch__get_bonus(res) # L4L: MID-WIDE if gk == "l4l": style = "REGIME: MID-WIDE (L4L)" nums = _l4l_midwide_ticket(res, cfg) nk = _patch__nums_key(nums) if nums and nk and not _patch__dedupe_exists(god, style, nk): t = {"name": style, "style": style, "numbers": [int(x) for x in nums], "score": "regime_midwide"} if bonus_val is not None: t["star"] = bonus_val god = list(god) + [t] # MM: DRIFT ±1 hedge if gk == "mm": style = "HEDGE: DRIFT ±1 (MM)" nums = _mm_drift_hedge_ticket(res) nk = _patch__nums_key(nums) if nums and nk and not _patch__dedupe_exists(god, style, nk): t = {"name": style, "style": style, "numbers": [int(x) for x in nums], "score": "hedge_drift_pm1"} if bonus_val is not None: t["star"] = bonus_val god = list(god) + [t] res[key] = god return res except Exception: return res # Wrap the current predict_for_game_v3 (already includes BRIDGE + REGIME ALL4) to add: # - L4L MID-WIDE regime # - MM DRIFT ±1 hedge try: _PREDICT_FOR_GAME_V3_BEFORE_TODAY_PATCH = predict_for_game_v3 except Exception: _PREDICT_FOR_GAME_V3_BEFORE_TODAY_PATCH = None def predict_for_game_v3(*args, **kwargs): if _PREDICT_FOR_GAME_V3_BEFORE_TODAY_PATCH is None: raise RuntimeError("Base predict_for_game_v3 not available for today patch") res = _PREDICT_FOR_GAME_V3_BEFORE_TODAY_PATCH(*args, **kwargs) try: game_key = kwargs.get("game_key") if game_key is None and len(args) >= 2: game_key = args[1] # Load cfg for range safety cfg = None try: from pathlib import Path as _Path csv_path = kwargs.get("csv_path") if csv_path is None and len(args) >= 1: csv_path = args[0] if csv_path is not None and game_key is not None: _, cfg = load_csv_for_game(_Path(csv_path), str(game_key)) # type: ignore[name-defined] except Exception: cfg = None if cfg is None: class _CfgStub: main_n = 5 main_max = 70 cfg = _CfgStub() # stash cfg for downstream helpers (MM drift) try: if isinstance(res, dict): res["_cfg"] = cfg except Exception: pass res = _patch__inject_l4l_midwide_and_mm_drift(res, cfg, str(game_key) if game_key is not None else "") # Remove helper key from output (best-effort; append-only and silent) try: if isinstance(res, dict) and "_cfg" in res: res.pop("_cfg", None) except Exception: pass except Exception: pass return res ENGINE_PATCH_ID = (globals().get("ENGINE_PATCH_ID","") + "+L4L_MIDWIDE_MM_DRIFT_V1").strip("+") # --- END APPEND-ONLY PATCH: L4L_MIDWIDE_AND_MM_DRIFT_V1 --- # ============================================================ # APPEND PATCH: NITRO_PACK_V1 (APPEND-ONLY / NO DELETIONS) # 1) Safe Markov add-on line # 2) RF-only ML line (RandomForestClassifier) # 3) Jackpot Chase Mode line (optional to play; always shown/labeled) # 4) Lightweight ML-vs-Engine comparison helpers (used by app hit-tracking) # - Does NOT change existing engine outputs; only adds new keys. # - Wraps predict_for_game_v3 to inject: # result["nitro_pack"] = {...} # result["markov_addon"] / ["rf_line"] / ["jackpot_chase"] # ============================================================ try: _PREDICT_FOR_GAME_V3_BEFORE_NITRO_PACK = predict_for_game_v3 # keep reference (do not remove) except Exception: _PREDICT_FOR_GAME_V3_BEFORE_NITRO_PACK = None def _nitro__safe_ints(seq, lo, hi, k=5): out = [] seen = set() for x in (seq or []): try: n = int(x) except Exception: continue if lo <= n <= hi and n not in seen: out.append(n); seen.add(n) if len(out) >= k: break return out def _nitro__pick_star_from_history(df, cfg, seed=0): """Pick a bonus/star using simple frequency over last 120 draws (safe, deterministic).""" try: if not getattr(cfg, "star_col", None): return None smin = int(getattr(cfg, "star_min", 1) or 1) smax = int(getattr(cfg, "star_max", smin) or smin) if smax < smin: return None series = pd.to_numeric(df[cfg.star_col], errors="coerce").dropna().astype(int).tolist() if not series: return None sub = series[-min(120, len(series)):] c = Counter([x for x in sub if smin <= x <= smax]) if not c: return int(random.Random(int(seed)).randint(smin, smax)) # Most common; tie -> smaller return int(sorted(c.items(), key=lambda kv: (-kv[1], kv[0]))[0][0]) except Exception: return None def _nitro__markov_ticket(df, cfg, seed=0): """ Markov add-on (safe): - Build transitions from draw_t -> draw_{t+1} across all main numbers. - Score candidates by transitions from LAST draw numbers. - Deterministic tie-break with seed. """ try: lo = int(cfg.main_min); hi = int(cfg.main_max) main_cols = list(cfg.main_cols) if len(df) < 6: # fallback: recent frequency vals = pd.to_numeric(df[main_cols].values.flatten(), errors="coerce") vals = [int(v) for v in vals if not pd.isna(v)] c = Counter([v for v in vals if lo <= v <= hi]) picks = [n for n,_ in sorted(c.items(), key=lambda kv: (-kv[1], kv[0]))[:5]] picks = sorted(_nitro__safe_ints(picks, lo, hi, 5)) return {"numbers": picks, "star": _nitro__pick_star_from_history(df, cfg, seed=seed)} # transitions[a][b] += 1 trans = {} for i in range(len(df) - 1): a = [int(x) for x in df.iloc[i][main_cols].values if not pd.isna(x)] b = [int(x) for x in df.iloc[i+1][main_cols].values if not pd.isna(x)] a = [x for x in a if lo <= x <= hi] b = [x for x in b if lo <= x <= hi] for x in a: row = trans.get(x) if row is None: row = {} trans[x] = row for y in b: row[y] = row.get(y, 0) + 1 last = [int(x) for x in df.iloc[-1][main_cols].values if not pd.isna(x)] last = [x for x in last if lo <= x <= hi] # fallback if last empty if not last: last = [int(x) for x in df.iloc[-2][main_cols].values if not pd.isna(x)] last = [x for x in last if lo <= x <= hi] # base freq (recent) recent = df.tail(min(80, len(df))) vals = pd.to_numeric(recent[main_cols].values.flatten(), errors="coerce") vals = [int(v) for v in vals if not pd.isna(v)] freq = Counter([v for v in vals if lo <= v <= hi]) maxf = max(freq.values()) if freq else 1 scores = {} for n in range(lo, hi + 1): s = 0.0 for x in last: s += float(trans.get(x, {}).get(n, 0)) # add small freq term s += 0.20 * (float(freq.get(n, 0)) / float(maxf)) scores[n] = s # pick top 5 unique rnd = random.Random(int(seed) + 991) ranked = sorted(scores.items(), key=lambda kv: (-kv[1], kv[0])) picks = [n for n,_ in ranked[:10]] # deterministic shuffle within top bucket for variety top = picks[:] rnd.shuffle(top) picks = sorted(_nitro__safe_ints(top + picks, lo, hi, 5)) return {"numbers": picks, "star": _nitro__pick_star_from_history(df, cfg, seed=seed+11)} except Exception: return None def _nitro__rf_only_ticket(df, cfg, seed=0, window=160, top_train=30): """ RF-only line (RandomForestClassifier): - Train per-number RF (binary) on structural features for a reduced candidate set (top_train). - Predict probability for the next draw using the latest row features. """ try: lo = int(cfg.main_min); hi = int(cfg.main_max) main_cols = list(cfg.main_cols) if len(df) < 60: return None sub = df.tail(min(int(window), len(df))).reset_index(drop=True) feats = calculate_structural_features(sub, cfg) base_cols = [ "DayOfWeek", "Month", "sum_total", "even_count", "odd_count", "range_span", "consecutive_count", "avg_gap", "high_count", ] feature_cols = [c for c in base_cols if c in feats.columns] if not feature_cols: return None X = feats[feature_cols].fillna(0.0) scaler = StandardScaler() Xs = scaler.fit_transform(X) X_latest = scaler.transform(feats.iloc[[-1]][feature_cols].fillna(0.0)) # pick candidate nums by recent hotness freq = create_frequency_features(sub, cfg, windows=[20, 80, 400]) ranked = sorted( [(n, 0.65*freq[n].get("freq_20", 0.0) + 0.25*freq[n].get("freq_80", 0.0) + 0.10*freq[n].get("overall_freq", 0.0)) for n in range(lo, hi+1)], key=lambda kv: kv[1], reverse=True ) cand_nums = [n for n,_ in ranked[: max(10, int(top_train))]] rf_scores = {} for n in cand_nums: y = (sub[main_cols] == n).any(axis=1).astype(int) if int(y.sum()) < 5: continue try: rf = RandomForestClassifier( n_estimators=220, max_depth=9, random_state=42, class_weight="balanced", ) rf.fit(Xs, y) p = float(rf.predict_proba(X_latest)[0][1]) if hasattr(rf, "predict_proba") else 0.0 rf_scores[int(n)] = p except Exception: continue if not rf_scores: return None # Fill to 5 with hotness if needed ranked_rf = sorted(rf_scores.items(), key=lambda kv: (-kv[1], kv[0])) picks = [n for n,_ in ranked_rf] if len(picks) < 5: picks += [n for n,_ in ranked if n not in picks] picks = sorted(_nitro__safe_ints(picks, lo, hi, 5)) return {"numbers": picks, "star": _nitro__pick_star_from_history(df, cfg, seed=seed+21)} except Exception: return None def _nitro__jackpot_chase_ticket(df, cfg, seed=0): """ Jackpot Chase Mode (optional): - Intentionally wider spread: 1 deep-low + 2 mid + 2 high-tail. - Still respects range bounds; deterministic. """ try: lo = int(cfg.main_min); hi = int(cfg.main_max) if len(df) < 10: return None low_min, low_max = _patch_game_deep_low_range(cfg) # mid band is the middle third span = max(1, hi - lo) mid_min = int(lo + span * 0.33) mid_max = int(lo + span * 0.66) high_min = int(lo + span * 0.80) high_max = int(hi) # Use frequency features as a scoring backbone freq = create_frequency_features(df, cfg, windows=[20, 80, 400]) def score_num(n): f = freq.get(n, {}) # hot but not too immediate ds = float(f.get("days_since_last", 999.0)) rec = 1.0 / (1.0 + 0.09 * ds) return 0.55 * float(f.get("freq_20", 0.0)) + 0.25 * float(f.get("freq_80", 0.0)) + 0.20 * rec rnd = random.Random(int(seed) + 7731) used = set() def pick_from(rmin, rmax, k): pool = [n for n in range(max(lo, rmin), min(hi, rmax) + 1) if n not in used] if not pool: return [] pool.sort(key=lambda n: (score_num(n), -n), reverse=True) # add tiny shuffle among top 10 for variety top = pool[: min(12, len(pool))] rnd.shuffle(top) pool = top + pool out = [] for n in pool: if n in used: continue out.append(int(n)); used.add(int(n)) if len(out) >= k: break return out picks = [] picks += pick_from(low_min, low_max, 1) picks += pick_from(mid_min, mid_max, 2) picks += pick_from(high_min, high_max, 2) # Fill if any gaps if len(picks) < 5: all_pool = [n for n in range(lo, hi+1) if n not in used] all_pool.sort(key=lambda n: score_num(n), reverse=True) for n in all_pool: picks.append(int(n)); used.add(int(n)) if len(picks) == 5: break picks = sorted(_nitro__safe_ints(picks, lo, hi, 5)) return {"numbers": picks, "star": _nitro__pick_star_from_history(df, cfg, seed=seed+31), "mode": "Jackpot Chase (optional)"} except Exception: return None def predict_for_game_v3(csv_path, game_key, run_backtest=False): # type: ignore """ Wrapper that preserves original behavior and appends Nitro Pack outputs. """ if _PREDICT_FOR_GAME_V3_BEFORE_NITRO_PACK is None: # fall back to whatever is currently bound (shouldn't happen) return globals().get("predict_for_game_v3")(csv_path, game_key, run_backtest=run_backtest) res = _PREDICT_FOR_GAME_V3_BEFORE_NITRO_PACK(csv_path, game_key, run_backtest=run_backtest) try: # Do not touch backtest payloads (keep fast + stable) if run_backtest or not isinstance(res, dict) or "error" in res: return res df, _ = load_csv_for_game(Path(csv_path), game_key) cfg = GAME_CONFIGS.get(game_key) if cfg is None: return res seed = int(res.get("seed", 0) or 0) mk = _nitro__markov_ticket(df, cfg, seed=seed) rf = _nitro__rf_only_ticket(df, cfg, seed=seed) jc = _nitro__jackpot_chase_ticket(df, cfg, seed=seed) # Attach in a compact bundle (future-proof) res["nitro_pack"] = { "markov_addon": mk, "rf_line": rf, "jackpot_chase": jc, "notes": { "markov": "Transitions from recent draws; safe additive line", "rf": "RandomForestClassifier-only probabilities on structural features", "jackpot_chase": "Wide-spread composition (optional to play)", }, } # Convenience keys (so app can access directly) if mk is not None: res["markov_addon"] = mk if rf is not None: res["rf_line"] = rf if jc is not None: res["jackpot_chase"] = jc return res except Exception: return res # ================== APPEND-ONLY PATCH: RF auto-uses cfg.csv_path for ALL games ================== # One patch only. No refactors above. # # What this does: # - Uses predictor.py (UniversalRFPredictor) to compute RF-1 and RF-2 from the game's CSV history (cfg.csv_path). # - Post-processes the result dict to inject CSV-RF tickets into the same sets list the app prints/downloads. # - If predictor.py / sklearn is missing or CSV is too short/unreadable, it safely does nothing. # # What this does NOT do: # - It does not change any non-RF engine logic. # - It does not change UI/layout. # # Notes: # - We "override by post-process": we remove any existing RF-like entries from sets to avoid duplicates, # then add our CSV-RF entries. # - Bonus (star/megaball/etc.) is predicted when cfg has a bonus range; otherwise we reuse result['star'] if present. def _rf_autocsv__safe_int(x): try: return int(x) except Exception: try: s = str(x).strip() if not s: return None return int(float(s)) except Exception: return None def _rf_autocsv__dedupe(seq): out, seen = [], set() for v in (seq or []): iv = _rf_autocsv__safe_int(v) if iv is None or iv in seen: continue seen.add(iv) out.append(iv) return out def _rf_autocsv__get_sets_key(res): if not isinstance(res, dict): return None for k in ("god_sets", "godmode_sets", "god_mode_sets", "lotto_cash_sets", "sets"): if isinstance(res.get(k), list): return k res.setdefault("god_sets", []) return "god_sets" def _rf_autocsv__is_rf_entry(entry): if not isinstance(entry, dict): return False name = (entry.get("name") or entry.get("style") or "").strip().lower() if not name: return False # Match existing RF labels in your ecosystem return ( name.startswith("rf-1") or name.startswith("rf-2") or "randomforest" in name or "rf-only" in name or name.startswith("nitro: rf-1") or name.startswith("nitro: rf-2") ) def _rf_autocsv__cfg_get(cfg, *names, default=None): for n in names: if hasattr(cfg, n): return getattr(cfg, n) return default def _rf_autocsv__infer_bonus_range(cfg): # Try common attribute names used across engines bonus_max = _rf_autocsv__cfg_get(cfg, "bonus_max", "star_max", "mb_max", "pb_max", default=None) bonus_n = _rf_autocsv__cfg_get(cfg, "bonus_n", "star_n", "mb_n", "pb_n", default=None) # Some configs may use bonus_min/bonus_max; we assume min=1 if max provided try: bonus_max = int(bonus_max) if bonus_max is not None else None except Exception: bonus_max = None try: bonus_n = int(bonus_n) if bonus_n is not None else 0 except Exception: bonus_n = 0 if bonus_max and bonus_n <= 0: bonus_n = 1 return bonus_max, bonus_n def _rf_autocsv__postprocess(res, game_key, cfg): if not isinstance(res, dict) or cfg is None: return res # Import predictor (local module) try: from predictor import UniversalRFPredictor # type: ignore except Exception: return res csv_path = _rf_autocsv__cfg_get(cfg, "csv_path", "csv", default=None) main_max = _rf_autocsv__cfg_get(cfg, "main_max", "max_num", "main_max_num", default=None) main_n = _rf_autocsv__cfg_get(cfg, "main_n", "pick_n", default=5) try: main_max = int(main_max) except Exception: return res try: main_n = int(main_n) except Exception: main_n = 5 if not csv_path: return res bonus_max, bonus_n = _rf_autocsv__infer_bonus_range(cfg) # Run RF predictor try: rf = UniversalRFPredictor(verbose=False) out = rf.predict( csv_path=str(csv_path), main_max=int(main_max), main_n=int(main_n), bonus_max=bonus_max, bonus_n=int(bonus_n) if bonus_n else 0, seed_key=f"{str(game_key).lower()}|{str(csv_path)}|{main_max}|{main_n}", min_diff=2, min_draws=60, ) except Exception: return res if not isinstance(out, dict) or not out.get("ok"): return res rf1_nums = _rf_autocsv__dedupe(out.get("rf1_numbers") or []) rf2_nums = _rf_autocsv__dedupe(out.get("rf2_numbers") or []) if out.get("rf2_numbers") else None if len(rf1_nums) != main_n: return res # Determine bonus/star to print # Prefer RF-predicted bonus if available; otherwise keep existing res['star'] star = res.get("star") if out.get("rf1_bonus") is not None: star = _rf_autocsv__safe_int(out.get("rf1_bonus")) elif star is not None: star = _rf_autocsv__safe_int(star) sets_key = _rf_autocsv__get_sets_key(res) sets = res.get(sets_key) or [] if not isinstance(sets, list): sets = [] # Remove existing RF entries to avoid duplicates/engine-driven RF sets = [s for s in sets if not _rf_autocsv__is_rf_entry(s)] # Add CSV-RF entries sets.append({"name": "RF-1 (RandomForest CSV)", "style": "RF-1 (RandomForest CSV)", "numbers": rf1_nums, "star": star}) if rf2_nums and len(rf2_nums) == main_n: sets.append({"name": "RF-2 (Diversified RF CSV)", "style": "RF-2 (Diversified RF CSV)", "numbers": rf2_nums, "star": star}) res[sets_key] = sets # Store keys for any downstream use res["rf1_numbers"] = rf1_nums res["rf1_star"] = star res["rf2_numbers"] = rf2_nums res["rf2_star"] = star res["rf_source"] = "csv" return res # Wrap predict_for_game_v3 so ANY dropdown game uses its own cfg.csv_path RF try: _rf_autocsv__orig_predict_for_game_v3 = predict_for_game_v3 # type: ignore def predict_for_game_v3(*args, **kwargs): res = _rf_autocsv__orig_predict_for_game_v3(*args, **kwargs) try: game_key = kwargs.get("game") or (args[0] if args else "") cfg = None try: if isinstance(GAME_CONFIGS, dict): cfg = GAME_CONFIGS.get(game_key) or GAME_CONFIGS.get(str(game_key).lower()) except Exception: cfg = None if cfg is None and isinstance(GAME_CONFIGS, dict) and GAME_CONFIGS: cfg = next(iter(GAME_CONFIGS.values())) res = _rf_autocsv__postprocess(res, game_key, cfg) except Exception: pass return res except Exception: pass # Padding (safe no-op) to preserve append-only growth _RF_AUTOCSV_PADDING = ("RF_AUTOCSV_PADDING\n" * 2200) # ================== END PATCH ==================