SYMBOL INDEX (329 symbols across 28 files) FILE: examples/batch_dry_run_example.py function main (line 21) | def main() -> int: FILE: examples/batch_processing_example.py function create_sample_documents (line 31) | def create_sample_documents(): function demonstrate_basic_batch_processing (line 109) | def demonstrate_basic_batch_processing(): function demonstrate_async_batch_processing (line 188) | async def demonstrate_async_batch_processing(): function demonstrate_rag_integration (line 235) | async def demonstrate_rag_integration(): function demonstrate_directory_processing (line 317) | def demonstrate_directory_processing(): function demonstrate_error_handling (line 400) | def demonstrate_error_handling(): function main (line 487) | async def main(): FILE: examples/enhanced_markdown_example.py function create_sample_markdown_content (line 29) | def create_sample_markdown_content(): function demonstrate_basic_conversion (line 372) | def demonstrate_basic_conversion(): function demonstrate_backend_comparison (line 420) | def demonstrate_backend_comparison(): function demonstrate_custom_styling (line 500) | def demonstrate_custom_styling(): function demonstrate_content_conversion (line 717) | def demonstrate_content_conversion(): function demonstrate_error_handling (line 808) | def demonstrate_error_handling(): function main (line 955) | def main(): FILE: examples/image_format_test.py function check_pillow_installation (line 23) | def check_pillow_installation(): function get_image_info (line 38) | def get_image_info(image_path: Path): function test_image_format_parsing (line 55) | async def test_image_format_parsing(file_path: str): function main (line 194) | def main(): FILE: examples/insert_content_list_example.py function configure_logging (line 34) | def configure_logging(): function create_sample_content_list (line 92) | def create_sample_content_list(): function demo_insert_content_list (line 177) | async def demo_insert_content_list( function main (line 378) | def main(): FILE: examples/lmstudio_integration_example.py function lmstudio_llm_model_func (line 45) | async def lmstudio_llm_model_func( function lmstudio_embedding_async (line 63) | async def lmstudio_embedding_async(texts: List[str]) -> List[List[float]]: class LMStudioRAGIntegration (line 76) | class LMStudioRAGIntegration: method __init__ (line 79) | def __init__(self): method test_connection (line 102) | async def test_connection(self) -> bool: method test_chat_completion (line 134) | async def test_chat_completion(self) -> bool: method embedding_func_factory (line 167) | def embedding_func_factory(self): method initialize_rag (line 175) | async def initialize_rag(self): method process_document_example (line 199) | async def process_document_example(self, file_path: str): method query_examples (line 217) | async def query_examples(self): method simple_query_example (line 239) | async def simple_query_example(self): function main (line 292) | async def main(): FILE: examples/modalprocessors_example.py function get_llm_model_func (line 22) | def get_llm_model_func(api_key: str, base_url: str = None): function get_vision_model_func (line 39) | def get_vision_model_func(api_key: str, base_url: str = None): function process_image_example (line 84) | async def process_image_example(lightrag: LightRAG, vision_model_func): function process_table_example (line 111) | async def process_table_example(lightrag: LightRAG, llm_model_func): function process_equation_example (line 143) | async def process_equation_example(lightrag: LightRAG, llm_model_func): function initialize_rag (line 166) | async def initialize_rag(api_key: str, base_url: str = None): function main (line 205) | def main(): function main_async (line 220) | async def main_async(api_key: str, base_url: str = None): FILE: examples/office_document_test.py function check_libreoffice_installation (line 23) | def check_libreoffice_installation(): function test_office_document_parsing (line 49) | async def test_office_document_parsing(file_path: str): function main (line 156) | def main(): FILE: examples/raganything_example.py function configure_logging (line 33) | def configure_logging(): function process_with_rag (line 89) | async def process_with_rag( function main (line 269) | def main(): FILE: examples/text_format_test.py function check_reportlab_installation (line 23) | def check_reportlab_installation(): function test_text_format_parsing (line 38) | async def test_text_format_parsing(file_path: str): function main (line 158) | def main(): FILE: examples/vllm_integration_example.py function vllm_llm_model_func (line 59) | async def vllm_llm_model_func( function vllm_embedding_async (line 80) | async def vllm_embedding_async(texts: List[str]) -> List[List[float]]: class VLLMRAGIntegration (line 96) | class VLLMRAGIntegration: method __init__ (line 99) | def __init__(self): method test_connection (line 124) | async def test_connection(self) -> bool: method test_chat_completion (line 157) | async def test_chat_completion(self) -> bool: method embedding_func_factory (line 188) | def embedding_func_factory(self): method initialize_rag (line 196) | async def initialize_rag(self): method process_document_example (line 219) | async def process_document_example(self, file_path: str): method query_examples (line 237) | async def query_examples(self): method simple_query_example (line 259) | async def simple_query_example(self): function main (line 314) | async def main(): FILE: raganything/__init__.py function get_version (line 114) | def get_version() -> str: FILE: raganything/base.py class DocStatus (line 4) | class DocStatus(str, Enum): FILE: raganything/batch.py class BatchMixin (line 19) | class BatchMixin: method _ensure_lightrag_initialized (line 27) | async def _ensure_lightrag_initialized(self) -> None: ... method process_document_complete (line 28) | async def process_document_complete(self, file_path: str, **kwargs) ->... method process_folder_complete (line 34) | async def process_folder_complete( method process_documents_batch (line 174) | def process_documents_batch( method process_documents_batch_async (line 226) | async def process_documents_batch_async( method get_supported_file_extensions (line 278) | def get_supported_file_extensions(self) -> List[str]: method filter_supported_files (line 283) | def filter_supported_files( method process_documents_with_rag_batch (line 302) | async def process_documents_with_rag_batch( FILE: raganything/batch_parser.py class BatchProcessingResult (line 22) | class BatchProcessingResult: method success_rate (line 34) | def success_rate(self) -> float: method summary (line 40) | def summary(self) -> str: class BatchParser (line 53) | class BatchParser: method __init__ (line 61) | def __init__( method get_supported_extensions (line 101) | def get_supported_extensions(self) -> List[str]: method filter_supported_files (line 110) | def filter_supported_files( method process_single_file (line 158) | def process_single_file( method process_batch (line 203) | def process_batch( method process_batch_async (line 339) | async def process_batch_async( function main (line 376) | def main(): FILE: raganything/callbacks.py class ProcessingEvent (line 35) | class ProcessingEvent: method to_dict (line 47) | def to_dict(self) -> Dict[str, Any]: class ProcessingCallback (line 61) | class ProcessingCallback: method on_parse_start (line 72) | def on_parse_start(self, file_path: str, parser: str = "", **kwargs: A... method on_parse_complete (line 75) | def on_parse_complete( method on_parse_error (line 85) | def on_parse_error( method on_text_insert_start (line 91) | def on_text_insert_start( method on_text_insert_complete (line 96) | def on_text_insert_complete( method on_multimodal_start (line 102) | def on_multimodal_start( method on_multimodal_item_complete (line 107) | def on_multimodal_item_complete( method on_multimodal_complete (line 117) | def on_multimodal_complete( method on_query_start (line 127) | def on_query_start(self, query: str, mode: str = "", **kwargs: Any) ->... method on_query_complete (line 130) | def on_query_complete( method on_query_error (line 140) | def on_query_error( method on_document_complete (line 150) | def on_document_complete( method on_document_error (line 159) | def on_document_error( method on_batch_start (line 169) | def on_batch_start(self, file_count: int = 0, **kwargs: Any) -> None: method on_batch_complete (line 172) | def on_batch_complete( class MetricsCallback (line 183) | class MetricsCallback(ProcessingCallback): method __init__ (line 196) | def __init__(self) -> None: method on_parse_complete (line 210) | def on_parse_complete( method on_text_insert_complete (line 220) | def on_text_insert_complete( method on_multimodal_complete (line 225) | def on_multimodal_complete( method on_document_complete (line 235) | def on_document_complete(self, file_path: str, **kw: Any) -> None: method on_document_error (line 238) | def on_document_error( method on_query_complete (line 250) | def on_query_complete( method on_query_error (line 256) | def on_query_error( method summary (line 263) | def summary(self) -> str: method reset (line 285) | def reset(self) -> None: class CallbackManager (line 290) | class CallbackManager: method __init__ (line 298) | def __init__(self) -> None: method register (line 304) | def register(self, callback: ProcessingCallback) -> None: method unregister (line 320) | def unregister(self, callback: ProcessingCallback) -> None: method enable_event_log (line 325) | def enable_event_log(self, enabled: bool = True) -> None: method event_log (line 335) | def event_log(self) -> List[ProcessingEvent]: method clear_event_log (line 340) | def clear_event_log(self) -> None: method dispatch (line 345) | def dispatch(self, event_name: str, **kwargs: Any) -> None: FILE: raganything/config.py class RAGAnythingConfig (line 13) | class RAGAnythingConfig: method __post_init__ (line 111) | def __post_init__(self): method mineru_parse_method (line 126) | def mineru_parse_method(self) -> str: method mineru_parse_method (line 143) | def mineru_parse_method(self, value: str): FILE: raganything/enhanced_markdown.py class MarkdownConfig (line 46) | class MarkdownConfig: class EnhancedMarkdownConverter (line 72) | class EnhancedMarkdownConverter: method __init__ (line 82) | def __init__(self, config: Optional[MarkdownConfig] = None): method _check_backends (line 96) | def _check_backends(self) -> Dict[str, bool]: method _get_default_css (line 113) | def _get_default_css(self) -> str: method _process_markdown_content (line 228) | def _process_markdown_content(self, content: str) -> str: method convert_with_weasyprint (line 286) | def convert_with_weasyprint(self, markdown_content: str, output_path: ... method convert_with_pandoc (line 310) | def convert_with_pandoc( method convert_markdown_to_pdf (line 370) | def convert_markdown_to_pdf( method convert_file_to_pdf (line 403) | def convert_file_to_pdf( method get_backend_info (line 446) | def get_backend_info(self) -> Dict[str, Any]: method _get_recommended_backend (line 460) | def _get_recommended_backend(self) -> str: function main (line 470) | def main(): FILE: raganything/modalprocessors.py class ContextConfig (line 34) | class ContextConfig: method __post_init__ (line 44) | def __post_init__(self): class ContextExtractor (line 49) | class ContextExtractor: method __init__ (line 52) | def __init__(self, config: ContextConfig = None, tokenizer=None): method extract_context (line 62) | def extract_context( method _extract_from_content_list (line 114) | def _extract_from_content_list( method _extract_page_context (line 133) | def _extract_page_context( method _extract_chunk_context (line 173) | def _extract_chunk_context( method _extract_text_from_item (line 206) | def _extract_text_from_item(self, item: Dict) -> str: method _extract_from_dict_source (line 238) | def _extract_from_dict_source( method _extract_from_text_source (line 265) | def _extract_from_text_source( method _extract_from_text_chunks (line 279) | def _extract_from_text_chunks( method _truncate_context (line 308) | def _truncate_context(self, context: str) -> str: class BaseModalProcessor (line 360) | class BaseModalProcessor: method __init__ (line 363) | def __init__( method set_content_source (line 406) | def set_content_source(self, content_source: Any, content_format: str ... method _get_context_for_item (line 417) | def _get_context_for_item(self, item_info: Dict[str, Any]) -> str: method generate_description_only (line 442) | async def generate_description_only( method _create_entity_and_chunk (line 465) | async def _create_entity_and_chunk( method _robust_json_parse (line 547) | def _robust_json_parse(self, response: str) -> dict: method _extract_all_json_candidates (line 573) | def _extract_all_json_candidates(self, response: str) -> list: method _try_parse_json (line 618) | def _try_parse_json(self, json_str: str) -> dict: method _basic_json_cleanup (line 628) | def _basic_json_cleanup(self, json_str: str) -> str: method _progressive_quote_fix (line 642) | def _progressive_quote_fix(self, json_str: str) -> str: method _extract_fields_with_regex (line 657) | def _extract_fields_with_regex(self, response: str) -> dict: method _extract_json_from_response (line 690) | def _extract_json_from_response(self, response: str) -> str: method _fix_json_escapes (line 695) | def _fix_json_escapes(self, json_str: str) -> str: method _process_chunk_for_extraction (line 699) | async def _process_chunk_for_extraction( class ImageModalProcessor (line 796) | class ImageModalProcessor(BaseModalProcessor): method __init__ (line 799) | def __init__( method _encode_image_to_base64 (line 814) | def _encode_image_to_base64(self, image_path: str) -> str: method generate_description_only (line 824) | async def generate_description_only( method process_multimodal_content (line 930) | async def process_multimodal_content( method _parse_response (line 993) | def _parse_response( class TableModalProcessor (line 1032) | class TableModalProcessor(BaseModalProcessor): method generate_description_only (line 1035) | async def generate_description_only( method process_multimodal_content (line 1125) | async def process_multimodal_content( method _parse_table_response (line 1187) | def _parse_table_response( class EquationModalProcessor (line 1226) | class EquationModalProcessor(BaseModalProcessor): method generate_description_only (line 1229) | async def generate_description_only( method process_multimodal_content (line 1313) | async def process_multimodal_content( method _parse_equation_response (line 1371) | def _parse_equation_response( class GenericModalProcessor (line 1410) | class GenericModalProcessor(BaseModalProcessor): method generate_description_only (line 1413) | async def generate_description_only( method process_multimodal_content (line 1487) | async def process_multimodal_content( method _parse_generic_response (line 1533) | def _parse_generic_response( FILE: raganything/parser.py class MineruExecutionError (line 50) | class MineruExecutionError(Exception): method __init__ (line 53) | def __init__(self, return_code, error_msg): class Parser (line 61) | class Parser: method __init__ (line 76) | def __init__(self) -> None: method _unique_output_dir (line 81) | def _unique_output_dir( method convert_office_to_pdf (line 103) | def convert_office_to_pdf( method convert_text_to_pdf (line 243) | def convert_text_to_pdf( method _process_inline_markdown (line 480) | def _process_inline_markdown(cls, text: str) -> str: method parse_pdf (line 523) | def parse_pdf( method parse_image (line 547) | def parse_image( method parse_document (line 572) | def parse_document( method check_installation (line 596) | def check_installation(self) -> bool: class MineruParser (line 609) | class MineruParser(Parser): method __init__ (line 624) | def __init__(self) -> None: method _run_mineru_command (line 629) | def _run_mineru_command( method _read_output_files (line 860) | def _read_output_files( method parse_pdf (line 976) | def parse_pdf( method parse_image (line 1049) | def parse_image( method parse_office_doc (line 1200) | def parse_office_doc( method parse_text_file (line 1237) | def parse_text_file( method parse_document (line 1271) | def parse_document( method check_installation (line 1321) | def check_installation(self) -> bool: class DoclingParser (line 1355) | class DoclingParser(Parser): method __init__ (line 1366) | def __init__(self) -> None: method parse_pdf (line 1370) | def parse_pdf( method parse_document (line 1426) | def parse_document( method _run_docling_command (line 1469) | def _run_docling_command( method _read_output_files (line 1549) | def _read_output_files( method read_from_block_recursive (line 1599) | def read_from_block_recursive( method read_from_block (line 1637) | def read_from_block( method parse_office_doc (line 1697) | def parse_office_doc( method parse_html (line 1756) | def parse_html( method check_installation (line 1815) | def check_installation(self) -> bool: class PaddleOCRParser (line 1849) | class PaddleOCRParser(Parser): method __init__ (line 1852) | def __init__(self, default_lang: str = "en") -> None: method _require_paddleocr (line 1857) | def _require_paddleocr(self): method _get_ocr (line 1870) | def _get_ocr(self, lang: Optional[str] = None): method _extract_text_lines (line 1896) | def _extract_text_lines(self, result: Any) -> List[str]: method _ocr_input (line 1982) | def _ocr_input( method _extract_pdf_page_inputs (line 2002) | def _extract_pdf_page_inputs(self, pdf_path: Path) -> Iterator[Tuple[i... method _ocr_rendered_page (line 2034) | def _ocr_rendered_page( method parse_pdf (line 2055) | def parse_pdf( method parse_image (line 2087) | def parse_image( method parse_office_doc (line 2114) | def parse_office_doc( method parse_text_file (line 2126) | def parse_text_file( method parse_document (line 2138) | def parse_document( method check_installation (line 2166) | def check_installation(self) -> bool: function _normalize_parser_name (line 2174) | def _normalize_parser_name(name: str) -> str: function register_parser (line 2190) | def register_parser(name: str, parser_class: type) -> None: function unregister_parser (line 2247) | def unregister_parser(name: str) -> None: function list_parsers (line 2265) | def list_parsers() -> Dict[str, str]: function get_supported_parsers (line 2285) | def get_supported_parsers() -> tuple: function get_parser (line 2290) | def get_parser(parser_type: str) -> Parser: function main (line 2322) | def main(): FILE: raganything/processor.py class ProcessorMixin (line 26) | class ProcessorMixin: method _get_file_reference (line 29) | def _get_file_reference(self, file_path: str) -> str: method _generate_cache_key (line 44) | def _generate_cache_key( method _generate_content_based_doc_id (line 94) | def _generate_content_based_doc_id(self, content_list: List[Dict[str, ... method _get_cached_result (line 133) | async def _get_cached_result( method _store_cached_result (line 212) | async def _store_cached_result( method parse_document (line 280) | async def parse_document( method _process_multimodal_content (line 501) | async def _process_multimodal_content( method _process_multimodal_content_individual (line 614) | async def _process_multimodal_content_individual( method _process_multimodal_content_batch_type_aware (line 769) | async def _process_multimodal_content_batch_type_aware( method _convert_to_lightrag_chunks_type_aware (line 946) | def _convert_to_lightrag_chunks_type_aware( method _apply_chunk_template (line 994) | def _apply_chunk_template( method _store_chunks_to_lightrag_storage_type_aware (line 1069) | async def _store_chunks_to_lightrag_storage_type_aware( method _store_multimodal_main_entities (line 1086) | async def _store_multimodal_main_entities( method _store_multimodal_entities_to_full_entities (line 1180) | async def _store_multimodal_entities_to_full_entities( method _batch_extract_entities_lightrag_style_type_aware (line 1239) | async def _batch_extract_entities_lightrag_style_type_aware( method _batch_add_belongs_to_relations_type_aware (line 1268) | async def _batch_add_belongs_to_relations_type_aware( method _batch_merge_lightrag_style_type_aware (line 1332) | async def _batch_merge_lightrag_style_type_aware( method _update_doc_status_with_chunks_type_aware (line 1367) | async def _update_doc_status_with_chunks_type_aware( method _mark_multimodal_processing_complete (line 1408) | async def _mark_multimodal_processing_complete(self, doc_id: str): method is_document_fully_processed (line 1431) | async def is_document_fully_processed(self, doc_id: str) -> bool: method get_document_processing_status (line 1457) | async def get_document_processing_status(self, doc_id: str) -> Dict[st... method process_document_complete (line 1507) | async def process_document_complete( method process_document_complete_lightrag_api (line 1642) | async def process_document_complete_lightrag_api( method insert_content_list (line 1867) | async def insert_content_list( FILE: raganything/query.py class QueryMixin (line 23) | class QueryMixin: method _generate_multimodal_cache_key (line 26) | def _generate_multimodal_cache_key( method aquery (line 101) | async def aquery( method aquery_with_multimodal (line 194) | async def aquery_with_multimodal( method aquery_vlm_enhanced (line 334) | async def aquery_vlm_enhanced( method _process_multimodal_query_content (line 403) | async def _process_multimodal_query_content( method _generate_query_content_description (line 456) | async def _generate_query_content_description( method _describe_image_for_query (line 486) | async def _describe_image_for_query( method _describe_table_for_query (line 517) | async def _describe_table_for_query( method _describe_equation_for_query (line 534) | async def _describe_equation_for_query( method _describe_generic_for_query (line 551) | async def _describe_generic_for_query( method _process_image_paths_for_vlm (line 570) | async def _process_image_paths_for_vlm( method _build_vlm_messages_with_images (line 689) | def _build_vlm_messages_with_images( method _call_vlm_with_multimodal_content (line 773) | async def _call_vlm_with_multimodal_content(self, messages: List[Dict]... method query (line 807) | def query(self, query: str, mode: str = "mix", **kwargs) -> str: method query_with_multimodal (line 825) | def query_with_multimodal( FILE: raganything/raganything.py class RAGAnything (line 51) | class RAGAnything(QueryMixin, ProcessorMixin, BatchMixin): method __post_init__ (line 105) | def __post_init__(self): method close (line 140) | def close(self): method _create_context_config (line 158) | def _create_context_config(self) -> ContextConfig: method _create_context_extractor (line 169) | def _create_context_extractor(self) -> ContextExtractor: method _initialize_processors (line 181) | def _initialize_processors(self): method update_config (line 226) | def update_config(self, **kwargs): method _ensure_lightrag_initialized (line 235) | async def _ensure_lightrag_initialized(self): method finalize_storages (line 375) | async def finalize_storages(self): method check_parser_installation (line 421) | def check_parser_installation(self) -> bool: method verify_parser_installation_once (line 430) | def verify_parser_installation_once(self) -> bool: method get_config_info (line 441) | def get_config_info(self) -> Dict[str, Any]: method set_content_source_for_context (line 497) | def set_content_source_for_context( method update_context_config (line 525) | def update_context_config(self, **context_kwargs): method get_processor_info (line 557) | def get_processor_info(self) -> Dict[str, Any]: FILE: raganything/utils.py function separate_content (line 13) | def separate_content( function encode_image_to_base64 (line 59) | def encode_image_to_base64(image_path: str) -> str: function validate_image_file (line 78) | def validate_image_file(image_path: str, max_size_mb: int = 50) -> bool: function insert_text_content (line 146) | async def insert_text_content( function insert_text_content_with_multimodal_content (line 181) | async def insert_text_content_with_multimodal_content( function get_processor_for_type (line 228) | def get_processor_for_type(modal_processors: Dict[str, Any], content_typ... function get_processor_supports (line 251) | def get_processor_supports(proc_type: str) -> List[str]: FILE: setup.py function read_long_description (line 6) | def read_long_description(): function retrieve_metadata (line 14) | def retrieve_metadata(): function read_requirements (line 43) | def read_requirements(): FILE: tests/testpaddleocr_parser.py function test_supported_parsers_include_paddleocr (line 10) | def test_supported_parsers_include_paddleocr(): function test_get_parser_returns_paddleocr_parser (line 14) | def test_get_parser_returns_paddleocr_parser(): function test_get_parser_rejects_unknown_parser (line 19) | def test_get_parser_rejects_unknown_parser(): function test_parser_module_import_does_not_import_paddleocr (line 24) | def test_parser_module_import_does_not_import_paddleocr(): function test_check_installation_false_when_dependency_missing (line 30) | def test_check_installation_false_when_dependency_missing(monkeypatch): function test_check_installation_true_when_pdf_renderer_missing (line 40) | def test_check_installation_true_when_pdf_renderer_missing(monkeypatch): function test_parse_pdf_raises_import_error_when_pdf_renderer_missing (line 59) | def test_parse_pdf_raises_import_error_when_pdf_renderer_missing(monkeyp... function test_parse_image_raises_import_error_with_install_hint (line 81) | def test_parse_image_raises_import_error_with_install_hint(monkeypatch, ... function test_parse_image_returns_content_list_schema (line 95) | def test_parse_image_returns_content_list_schema(monkeypatch, tmp_path): function test_parse_image_preserves_repeated_ocr_lines (line 119) | def test_parse_image_preserves_repeated_ocr_lines(monkeypatch, tmp_path): function test_parse_pdf_assigns_page_index (line 143) | def test_parse_pdf_assigns_page_index(monkeypatch, tmp_path): FILE: tests/testparser_kwargs.py function mineru_parser (line 25) | def mineru_parser(): function docling_parser (line 30) | def docling_parser(): function dummy_path (line 35) | def dummy_path(): function test_mineru_env_propagation (line 42) | def test_mineru_env_propagation( function test_docling_env_propagation (line 68) | def test_docling_env_propagation(mock_run, docling_parser, dummy_path): function test_mineru_unknown_kwargs (line 82) | def test_mineru_unknown_kwargs(mineru_parser, dummy_path): function test_docling_unknown_kwargs (line 90) | def test_docling_unknown_kwargs(mock_run, docling_parser, dummy_path): function test_invalid_env_type (line 97) | def test_invalid_env_type(mineru_parser, docling_parser, dummy_path): function test_invalid_env_contents (line 106) | def test_invalid_env_contents(mineru_parser, docling_parser, dummy_path): FILE: tests/testparser_wiring.py function test_batch_parser_uses_paddleocr_parser (line 6) | def test_batch_parser_uses_paddleocr_parser(): function test_raganything_initializes_selected_parser (line 15) | def test_raganything_initializes_selected_parser(monkeypatch, tmp_path): function test_processor_parse_document_uses_selected_parser (line 45) | async def test_processor_parse_document_uses_selected_parser(monkeypatch...