Ran Ginosar

156 papers A* 5A 5B 6C 7Misc 1Journal 82Unranked 49
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Ran Ginosar
2022 J jnl
IEEE Trans. Parallel Distributed Syst.
Leonid Yavits, Roman Kaplan, Ran Ginosar
2021 J jnl
IACR Cryptol. ePrint Arch.
Leonid Azriel, Julian Speith, Nils Albartus, Ran Ginosar, Avi Mendelson, Christof Paar
2021 J jnl
J. Cryptogr. Eng.
Leonid Azriel, Julian Speith, Nils Albartus, Ran Ginosar, Avi Mendelson, Christof Paar
2020 Misc conf
SYSTOR
Roman Kaplan, Leonid Yavits, Ran Ginosar
2020 C conf
ICCD
Leonid Yavits, Lois Orosa, Suyash Mahar, João Dinis Ferreira, Mattan Erez, Ran Ginosar, Onur Mutlu
2020 J jnl
CoRR
Leonid Yavits, Lois Orosa, Suyash Mahar, João Dinis Ferreira, Mattan Erez, Ran Ginosar, Onur Mutlu
2019 J jnl
CoRR
Leonid Yavits, Roman Kaplan, Ran Ginosar
2019 J jnl
Microelectron. J.
Misbah Ramadan, Nicolás Wainstein, Ran Ginosar, Shahar Kvatinsky
2019 J jnl
CoRR
Roman Kaplan, Leonid Yavits, Ran Ginosar
2019 B conf
PACT
Roman Kaplan, Leonid Yavits, Ran Ginosar
2019 B conf
PACT
Leonid Yavits, Roman Kaplan, Ran Ginosar
2019 J jnl
IEEE Micro
Roman Kaplan, Leonid Yavits, Ran Ginosar
2019 conf
ASHES@CCS
Leonid Azriel, Ran Ginosar, Avi Mendelson
2018 J jnl
IEEE Comput. Archit. Lett.
Leonid Yavits, Ran Ginosar
2018 J jnl
IEEE Micro
Leonid Yavits, Roman Kaplan, Ran Ginosar
2018 J jnl
CoRR
Leonid Yavits, Roman Kaplan, Ran Ginosar
2018 J jnl
CoRR
Roman Kaplan, Leonid Yavits, Ran Ginosar
2017 J jnl
Integr.
Y. Zhang, Rostislav (Reuven) Dobkin, Aharon Unikovski, Danniel Nahmanny, Goel Samuel, Michael Moyal, Ran Ginosar
2017 J jnl
CoRR
Roman Kaplan, Leonid Yavits, Ran Ginosar, Uri C. Weiser
2017 J jnl
IEEE Micro
Roman Kaplan, Leonid Yavits, Ran Ginosar, Uri C. Weiser
2017 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2017 J jnl
Supercomput. Front. Innov.
Roman Kaplan, Leonid Yavits, Ran Ginosar
2017 J jnl
CoRR
Leonid Yavits, Amir Morad, Uri C. Weiser, Ran Ginosar
2017 J jnl
IEEE Comput. Archit. Lett.
Leonid Yavits, Uri C. Weiser, Ran Ginosar
2017 conf
ACM Great Lakes Symposium on VLSI
Leonid Azriel, Ran Ginosar, Avi Mendelson
2017 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2017 J jnl
CoRR
Leonid Yavits, Ran Ginosar
2017 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2017 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Leonid Azriel, Ran Ginosar, Shay Gueron, Avi Mendelson
2016 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar, Uri C. Weiser
2016 conf
PATMOS
Roman Kaplan, Leonid Yavits, Amir Morad, Ran Ginosar
2016 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2016 J jnl
Computer
Efraim Rotem, Uri C. Weiser, Avi Mendelson, Ran Ginosar, Eliezer Weissmann, Yoni Aizik
2016 J jnl
ACM Trans. Archit. Code Optim.
Amir Morad, Leonid Yavits, Shahar Kvatinsky, Ran Ginosar
2016 J jnl
IEEE Trans. Computers
Leonid Yavits, Amir Morad, Ran Ginosar
2016 conf
HASP@ISCA
Leonid Azriel, Ran Ginosar, Shay Gueron, Avi Mendelson
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Salomon Beer, Ran Ginosar
2015 conf
PATMOS
Ron Diamant, Ran Ginosar, Christos P. Sotiriou
2015 J jnl
IEEE Trans. Computers
Leonid Yavits, Amir Morad, Ran Ginosar
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Salomon Beer, Ran Ginosar
2015 J jnl
Microelectron. J.
Efraim Rotem, Ran Ginosar, Avi Mendelson, Uri C. Weiser
2015 J jnl
IEEE Comput. Archit. Lett.
Leonid Yavits, Shahar Kvatinsky, Amir Morad, Ran Ginosar
2015 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Marco Cannizzaro, Salomon Beer, Jordi Cortadella, Ran Ginosar, Luciano Lavagno
2015 J jnl
IEEE Trans. Parallel Distributed Syst.
Leonid Yavits, Amir Morad, Ran Ginosar
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Salomon Beer, Jerome Cox, Ran Ginosar, Tom Chaney, David M. Zar
2014 J jnl
IEEE Comput. Archit. Lett.
Leonid Yavits, Amir Morad, Ran Ginosar
2014 J jnl
ACM Trans. Archit. Code Optim.
Jawad Haj-Yihia, Yosi Ben-Asher, Efraim Rotem, Ahmad Yasin, Ran Ginosar
2014 conf
PATMOS
Amir Morad, Leonid Yavits, Ran Ginosar
2014 conf
PATMOS
Amir Morad, Leonid Yavits, Ran Ginosar
2014 J jnl
IEEE Comput. Archit. Lett.
Efraim Rotem, Ran Ginosar, Uri C. Weiser, Avi Mendelson
2014 conf
PATMOS
Efraim Rotem, Uri C. Weiser, Avi Mendelson, Ahmad Yasin, Ran Ginosar
2014 J jnl
ACM Trans. Archit. Code Optim.
Amir Morad, Leonid Yavits, Ran Ginosar
2014 J jnl
IEEE Comput. Archit. Lett.
Amir Morad, Tomer Y. Morad, Leonid Yavits, Ran Ginosar, Uri C. Weiser
2014 J jnl
IEEE Trans. Computers
Ran Ginosar, Karam S. Chatha
2014 conf
MES@ISCA
Itai Avron, Ran Ginosar
2014 conf
ASYNC
Salomon Beer, Marco Cannizzaro, Jordi Cortadella, Ran Ginosar, Luciano Lavagno
2014 J jnl
Integr.
Dmitry Verbitsky, Rostislav (Reuven) Dobkin, Ran Ginosar, Salomon Beer
2014 J jnl
Parallel Comput.
Leonid Yavits, Amir Morad, Ran Ginosar
2013 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2013 conf
3DIC
Leonid Yavits, Amir Morad, Ran Ginosar
2013 conf
ASYNC
Salomon Beer, Ran Ginosar, Rostislav (Reuven) Dobkin, Yoav Weizman
2013 A conf
DATE
Salomon Beer, Ran Ginosar, Jerome Cox, Tom Chaney, David M. Zar
2013 conf
ACM Great Lakes Symposium on VLSI
Eyal-Itzhak Nave, Ran Ginosar
2013 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2013 J jnl
CoRR
Leonid Yavits, Amir Morad, Ran Ginosar
2013 J jnl
Integr.
Ameer Abdelhadi, Ran Ginosar, Avinoam Kolodny, Eby G. Friedman
2012 conf
PATMOS
Salomon Beer, Ran Ginosar
2012 C conf
ISCAS
Inna Vaisband, Eby G. Friedman, Ran Ginosar, Avinoam Kolodny
2012 conf
HPCC-ICESS
Itai Avron, Ran Ginosar
2012 conf
PATMOS
Eyal-Itzhak Nave, Ran Ginosar
2011 C conf
ISCAS
Salomon Beer, Ran Ginosar, Michael Priel, Rostislav (Reuven) Dobkin, Avinoam Kolodny
2011 J jnl
IEEE Des. Test Comput.
Ran Ginosar
2011 ed.
NOCS
Radu Marculescu, Michael Kishinevsky, Ran Ginosar, Karam S. Chatha
2011 J jnl
Microprocess. Microsystems
Dmitri Vainbrand, Ran Ginosar
2010 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Rostislav (Reuven) Dobkin, Michael Moyal, Avinoam Kolodny, Ran Ginosar
2010 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Arkadiy Morgenshtein, Eby G. Friedman, Ran Ginosar, Avinoam Kolodny
2010 conf
NOCS
Dmitri Vainbrand, Ran Ginosar
2010 C conf
VLSI-SoC
Amit Berman, Ran Ginosar, Idit Keidar
2010 conf
ASYNC
Salomon Beer, Ran Ginosar, Michael Priel, Rostislav (Reuven) Dobkin, Avinoam Kolodny
2010 conf
ACM Great Lakes Symposium on VLSI
Ameer Abdelhadi, Ran Ginosar, Avinoam Kolodny, Eby G. Friedman
2010 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Arkadiy Morgenshtein, Eby G. Friedman, Ran Ginosar, Avinoam Kolodny
2009 A* conf
MICRO
Efraim Rotem, Avi Mendelson, Ran Ginosar, Uri C. Weiser
2009 conf
ACM Great Lakes Symposium on VLSI
Inna Vaisband, Ran Ginosar, Avinoam Kolodny, Eby G. Friedman
2009 J jnl
Integr.
Rostislav (Reuven) Dobkin, Ran Ginosar, Avinoam Kolodny
2009 A* conf
INFOCOM
Asaf Baron, Ran Ginosar, Isaac Keslassy
2009 J jnl
Integr.
Rostislav (Reuven) Dobkin, Ran Ginosar
2008 conf
PATMOS
Rostislav (Reuven) Dobkin, Ran Ginosar
2008 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
A. Elyada, Ran Ginosar, Uri C. Weiser
2008 conf
SLIP
Rostislav (Reuven) Dobkin, Arkadiy Morgenshtein, Avinoam Kolodny, Ran Ginosar
2008 conf
SLIP
Arkadiy Morgenshtein, Eby G. Friedman, Ran Ginosar, Avinoam Kolodny
2007 conf
NOCS
Isask'har Walter, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2007 J jnl
IEEE Trans. Neural Networks
Rami Rom, Jacob Erel, Michael Glikson, Randy A. Lieberman, Kobi Rosenblum, Ofer Binah, Ran Ginosar, David L. Hayes
2007 J jnl
IEEE Trans. Biomed. Eng.
Yevgeny Perelman, Ran Ginosar
2007 conf
ASYNC
Rostislav (Reuven) Dobkin, Yevgeny Perelman, Tuvia Liran, Ran Ginosar, Avinoam Kolodny
2007 J jnl
VLSI Design
Zvika Guz, Isask'har Walter, Evgeny Bolotin, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2007 conf
NOCS
Rostislav (Reuven) Dobkin, Ran Ginosar, Israel Cidon
2007 A conf
DATE
Evgeny Bolotin, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2007 conf
NOCS
Evgeny Bolotin, Zvika Guz, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2006 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Yevgeny Perelman, Ran Ginosar
2006 J jnl
Formal Methods Syst. Des.
Uri Frank, Tsachy Kapschitz, Ran Ginosar
2006 A conf
DATE
Zvika Guz, Isask'har Walter, Evgeny Bolotin, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2006 conf
ASYNC
Rostislav (Reuven) Dobkin, Ran Ginosar, Avinoam Kolodny
2006 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Rostislav (Reuven) Dobkin, Ran Ginosar, Christos P. Sotiriou
2006 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Ilya Obridko, Ran Ginosar
2005 conf
ASYNC
Rostislav (Reuven) Dobkin, Victoria Vishnyakov, Eyal Friedman, Ran Ginosar
2005 conf
CHARME
Tsachy Kapschitz, Ran Ginosar
2005 conf
ISCAS (5)
Ilya Obridko, Ran Ginosar
2005 conf
ISCAS (1)
Arkadiy Morgenshtein, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2005 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Rostislav (Reuven) Dobkin, Michael Peleg, Ran Ginosar
2004 conf
PATMOS
Uri Frank, Ran Ginosar
2004 A conf
DATE
Alex Branover, Rakefet Kol, Ran Ginosar
2004 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Arkadiy Morgenshtein, Michael Moreinis, Ran Ginosar
2004 conf
ICECS
Evgeny Bolotin, Arkadiy Morgenshtein, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2004 conf
SoC
Arkadiy Morgenshtein, Israel Cidon, Avinoam Kolodny, Ran Ginosar
2004 J jnl
Integr.
Evgeny Bolotin, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2004 conf
ASYNC
Rostislav (Reuven) Dobkin, Ran Ginosar, Christos P. Sotiriou
2004 conf
ICECS
Ilya Obridko, Ran Ginosar
2004 conf
ICECS
Arkadiy Morgenshtein, Evgeny Bolotin, Israel Cidon, Avinoam Kolodny, Ran Ginosar
2004 J jnl
J. Syst. Archit.
Evgeny Bolotin, Israel Cidon, Ran Ginosar, Avinoam Kolodny
2003 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Y. Elboim, Avinoam Kolodny, Ran Ginosar
2003 conf
ASYNC
Ran Ginosar
2003 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Ken S. Stevens, Ran Ginosar, Shai Rotem
2003 conf
ASYNC
Yaron Semiat, Ran Ginosar
2002 B conf
PIMRC
Rostislav (Reuven) Dobkin, Michael Peleg, Ran Ginosar
2001 J jnl
IEEE J. Solid State Circuits
Yevgeny Perelman, Ran Ginosar
2001 J jnl
IEEE J. Solid State Circuits
Kenneth S. Stevens, Shai Rotem, Ran Ginosar, Peter A. Beerel, Chris J. Myers, Kenneth Y. Yun, Rakefet Kol, Charles Dike, Marly Roncken
1999 A* conf
DAC
Ken S. Stevens, Shai Rotem, Steven M. Burns, Jordi Cortadella, Ran Ginosar, Michael Kishinevsky, Marly Roncken
1999 conf
ASYNC
Shai Rotem, Ken S. Stevens, Charles Dike, Marly Roncken, Boris Agapiev, Ran Ginosar, Rakefet Kol, Peter A. Beerel, Chris J. Myers, Kenneth Y. Yun
1999 conf
ASYNC
Ken S. Stevens, Shai Rotem, Ran Ginosar
1998 A conf
ISLPED
Uzi Zangi, Ran Ginosar
1998 C conf
ICCD
Ran Ginosar, Rakefet Kol
1998 conf
ASYNC
Wei-Chun Chou, Peter A. Beerel, Ran Ginosar, Rakefet Kol, Chris J. Myers, Shai Rotem, Ken S. Stevens, Kenneth Y. Yun
1998 J jnl
J. Vis. Commun. Image Represent.
Stuart G. Wolf, Ran Ginosar, Yehoshua Y. Zeevi
1997 C conf
ICCD
Rakefet Kol, Ran Ginosar
1996 conf
ASYNC
Rakefet Kol, Ran Ginosar, Goel Samuel
1995 J jnl
J. Electron. Test.
Ilana David, Ran Ginosar, Michael Yoeli
1994 conf
ICPR (3)
Sarit Chen, Ran Ginosar
1994 conf
ICPR (1)
Stuart G. Wolf, Ran Ginosar, Yehoshua Y. Zeevi
1993 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Alan Rotman, Ran Ginosar
1993 conf
Asynchronous Design Methodologies
Ilana David, Ran Ginosar, Michael Yoeli
1992 J jnl
IEEE Trans. Computers
Ilana David, Ran Ginosar, Michael Yoeli
1992 J jnl
IEEE Trans. Computers
Ilana David, Ran Ginosar, Michael Yoeli
1991 B conf
ICLP
Arie Harsat, Ran Ginosar
1990 B conf
ICLP
Arie Harsat, Ran Ginosar
1990 J jnl
New Gener. Comput.
Arie Harsat, Ran Ginosar
1990 C conf
VCIP
Yehoshua Y. Zeevi, Ran Ginosar
1990 J jnl
SIGARCH Comput. Archit. News
Ran Ginosar, Nick Michell
1989 J jnl
SIGARCH Comput. Archit. News
Llana David, Ran Ginosar, Michael Yoeli
1989 J jnl
Int. J. Parallel Program.
Ran Ginosar, David Egozi
1988 conf
FGCS
Arie Harsat, Ran Ginosar
1985 B conf
ICPP
Ran Ginosar, Dwight D. Hill
1983 conf
AFIPS National Computer Conference
Bruce W. Arden, Ran Ginosar
1982 J jnl
IEEE Trans. Computers
Bruce W. Arden, Ran Ginosar
1981 A* conf
ISCA
Bruce W. Arden, Ran Ginosar
1981 A* conf
ISCA
Bruce W. Arden, Ran Ginosar
redb/extractors/js_extractors/js_patterns.py
← Index redb/extractors/js_extractors/js_patterns.py python
"""Canonical, compiled JavaScript regex patterns shared across JS extractors.

All suspicious-API patterns and the few feature-only patterns live here so each
expression is compiled exactly once per Python process and so any pattern that
was previously duplicated across `js_features.py` and `js_suspicious_apis.py`
now resolves to a single shared compiled object.

JavaScript is case-sensitive at runtime, but every suspicious-API pattern matches
either a literal-case identifier (`\\beval\\s*\\(`, `String\\.fromCharCode`, etc.)
or a string-quoted token (`"powershell"`). Compiling them with `re.IGNORECASE`
matches the historical behaviour of `JSSuspiciousAPIsExtractor` and is safe for
the patterns that historically came from `JSFeaturesExtractor` — those literals
are spelled in real-world JS exactly as written.

`scan_source()` is the entry point used by extractors: it walks the source once
per pattern using the pre-compiled regexes and returns a flat
`{name: {"count": N, "lines": [unique_line_numbers_sorted]}}` dict. Both
`JSFeaturesExtractor` and `JSSuspiciousAPIsExtractor` consume the same dict so
the per-pattern × per-line loops they used to run independently collapse to a
single shared scan.
"""

import bisect
import re
from typing import Dict, Iterable, List, Mapping

_FLAGS = re.IGNORECASE

# Canonical compiled patterns, keyed by their human-readable name. The name is
# also the value emitted into `redb_js_suspicious_apis.api_name`.
PATTERNS = {
    # ---- code execution ----
    "eval": re.compile(r"\beval\s*\(", _FLAGS),
    "Function constructor": re.compile(r"\bnew\s+Function\s*\(", _FLAGS),
    "execScript": re.compile(r"\bexecScript\s*\(", _FLAGS),
    "document.write": re.compile(r"\bdocument\.write(?:ln)?\s*\(", _FLAGS),
    "innerHTML assignment": re.compile(r"\.innerHTML\s*=", _FLAGS),
    "outerHTML assignment": re.compile(r"\.outerHTML\s*=", _FLAGS),
    "insertAdjacentHTML": re.compile(r"\.insertAdjacentHTML\s*\(", _FLAGS),
    # ---- network ----
    "XMLHttpRequest": re.compile(r"\bnew\s+XMLHttpRequest\b", _FLAGS),
    "fetch": re.compile(r"\bfetch\s*\(", _FLAGS),
    "WebSocket": re.compile(r"\bnew\s+WebSocket\s*\(", _FLAGS),
    "navigator.sendBeacon": re.compile(r"\bnavigator\.sendBeacon\s*\(", _FLAGS),
    "ActiveXObject XMLHTTP": re.compile(
        r"ActiveXObject\s*\(\s*[\"\'](?:MSXML2\.XMLHTTP|Microsoft\.XMLHTTP)", _FLAGS
    ),
    "require network module": re.compile(
        r"require\s*\(\s*[\"\'](?:http|https|net|dgram)[\"\']", _FLAGS
    ),
    "axios": re.compile(r"\baxios\b", _FLAGS),
    # ---- filesystem ----
    "require fs": re.compile(r"require\s*\(\s*[\"\']fs[\"\']", _FLAGS),
    "require path": re.compile(r"require\s*\(\s*[\"\']path[\"\']", _FLAGS),
    "FileSystemObject": re.compile(r"Scripting\.FileSystemObject", _FLAGS),
    "ADODB.Stream": re.compile(r"ADODB\.Stream", _FLAGS),
    "Shell.Application": re.compile(r"Shell\.Application", _FLAGS),
    "WScript.CreateObject": re.compile(r"WScript\.CreateObject", _FLAGS),
    # ---- process ----
    "require child_process": re.compile(r"require\s*\(\s*[\"\']child_process[\"\']", _FLAGS),
    "child_process exec": re.compile(r"child_process\.(?:exec|spawn|execFile|fork)\s*\(", _FLAGS),
    "WScript.Shell": re.compile(r"WScript\.Shell", _FLAGS),
    "WScript.Shell.Run": re.compile(r"\.Run\s*\(", _FLAGS),
    "WScript.Shell.Exec": re.compile(r"\.Exec\s*\(", _FLAGS),
    "ShellExecute": re.compile(r"\bShellExecute\b", _FLAGS),
    "PowerShell reference": re.compile(r"[\"\']powershell[\"\']", _FLAGS),
    "cmd.exe reference": re.compile(r"[\"\']cmd\.exe[\"\']", _FLAGS),
    "require os": re.compile(r"require\s*\(\s*[\"\']os[\"\']", _FLAGS),
    # ---- registry ----
    "RegRead": re.compile(r"\.RegRead\s*\(", _FLAGS),
    "RegWrite": re.compile(r"\.RegWrite\s*\(", _FLAGS),
    "RegDelete": re.compile(r"\.RegDelete\s*\(", _FLAGS),
    "StdRegProv": re.compile(r"StdRegProv", _FLAGS),
    # ---- crypto / encoding ----
    "atob": re.compile(r"\batob\s*\(", _FLAGS),
    "btoa": re.compile(r"\bbtoa\s*\(", _FLAGS),
    "String.fromCharCode": re.compile(r"String\.fromCharCode\s*\(", _FLAGS),
    "unescape": re.compile(r"\bunescape\s*\(", _FLAGS),
    "decodeURIComponent": re.compile(r"\bdecodeURIComponent\s*\(", _FLAGS),
    "Buffer.from": re.compile(r"Buffer\.from\s*\(", _FLAGS),
    "crypto module": re.compile(r"crypto\.create(?:Cipher|Decipher|Hash|Hmac)", _FLAGS),
    # ---- DOM manipulation ----
    "document.forms": re.compile(r"document\.forms", _FLAGS),
    "document.cookie": re.compile(r"document\.cookie", _FLAGS),
    "querySelector sensitive input": re.compile(
        r"document\.querySelector\s*\([^)]*(?:password|credit|card|cvv|ssn)", _FLAGS
    ),
    "submit event listener": re.compile(r"addEventListener\s*\(\s*[\"\']submit", _FLAGS),
    "createElement script/iframe": re.compile(
        r"\.createElement\s*\(\s*[\"\'](?:script|iframe)", _FLAGS
    ),
    "dynamic script src": re.compile(r"\.src\s*=\s*[\"\'](?:https?://|//)", _FLAGS),
}

# Pattern name -> category (one of code_execution / network / filesystem /
# process / registry / crypto_encoding / dom_manipulation).
CATEGORIES = {
    "eval": "code_execution",
    "Function constructor": "code_execution",
    "execScript": "code_execution",
    "document.write": "code_execution",
    "innerHTML assignment": "code_execution",
    "outerHTML assignment": "code_execution",
    "insertAdjacentHTML": "code_execution",
    "XMLHttpRequest": "network",
    "fetch": "network",
    "WebSocket": "network",
    "navigator.sendBeacon": "network",
    "ActiveXObject XMLHTTP": "network",
    "require network module": "network",
    "axios": "network",
    "require fs": "filesystem",
    "require path": "filesystem",
    "FileSystemObject": "filesystem",
    "ADODB.Stream": "filesystem",
    "Shell.Application": "filesystem",
    "WScript.CreateObject": "filesystem",
    "require child_process": "process",
    "child_process exec": "process",
    "WScript.Shell": "process",
    "WScript.Shell.Run": "process",
    "WScript.Shell.Exec": "process",
    "ShellExecute": "process",
    "PowerShell reference": "process",
    "cmd.exe reference": "process",
    "require os": "process",
    "RegRead": "registry",
    "RegWrite": "registry",
    "RegDelete": "registry",
    "StdRegProv": "registry",
    "atob": "crypto_encoding",
    "btoa": "crypto_encoding",
    "String.fromCharCode": "crypto_encoding",
    "unescape": "crypto_encoding",
    "decodeURIComponent": "crypto_encoding",
    "Buffer.from": "crypto_encoding",
    "crypto module": "crypto_encoding",
    "document.forms": "dom_manipulation",
    "document.cookie": "dom_manipulation",
    "querySelector sensitive input": "dom_manipulation",
    "submit event listener": "dom_manipulation",
    "createElement script/iframe": "dom_manipulation",
    "dynamic script src": "dom_manipulation",
}

# Patterns consumed only by JSFeaturesExtractor (no category, never surfaced as
# a suspicious-API row). Kept here so every JS regex is compiled in one place.
FEATURE_PATTERNS = {
    "hex_escape": re.compile(r"\\x[0-9a-fA-F]{2}"),
    "unicode_escape": re.compile(r"\\u[0-9a-fA-F]{4}"),
    "base64_string": re.compile(r"[A-Za-z0-9+/]{40,}={0,2}"),
    # decodeURI matches BOTH decodeURI and decodeURIComponent. The latter is also
    # a suspicious-API pattern in PATTERNS; this broader form is what the
    # `decodeuri_count` feature column has historically counted.
    "decodeURI": re.compile(r"\b(?:decodeURI|decodeURIComponent)\s*\(", _FLAGS),
    "settimeout_setinterval": re.compile(r"\b(?:setTimeout|setInterval)\s*\(", _FLAGS),
    "function_decl": re.compile(r"\bfunction\s+\w+\s*\(|\bfunction\s*\("),
    "var_decl": re.compile(r"\b(?:var|let|const)\s+"),
    "string_concat": re.compile(r"[\"\'][\s]*\+[\s]*[\"\']"),
    "comment": re.compile(r"//.*?$|/\*[\s\S]*?\*/", re.MULTILINE),
    "long_string": re.compile(r"[\"\']([^\"\']{256,})[\"\']"),
    "array_function_call": re.compile(r"\[(?:0x[0-9a-f]+|[\d]+)\]\s*\(", _FLAGS),
}

# Patterns consumed only by JSStringsExtractor for encoded-string discovery.
# Scoped to *hidden* strings only — patterns whose decoded form is not visible
# to a substring search over the raw text. Plain long literals are not
# extracted here because they're already preserved in code_text_content and
# scraped by the IOC pipeline over text_raw / text_normalized.
#
# Distinct from FEATURE_PATTERNS even where the names rhyme:
#   FEATURE_PATTERNS["hex_escape"] / ["unicode_escape"]   -> single escape
#   STRING_PATTERNS["hex_escape_seq"] / ["unicode_escape_seq"] -> 4+ / 3+ in a row
#   FEATURE_PATTERNS["base64_string"]                     -> bare base64 token
#   STRING_PATTERNS["base64_quoted"]                      -> base64 inside JS quotes
# These do not share match objects with the suspicious-API or feature scans, so
# they are not folded into JSContext.scan; the strings extractor walks them
# itself (one finditer per pattern, with shared line-offset bisect in #4b).
STRING_PATTERNS = {
    "hex_escape_seq": re.compile(r"(?:\\x[0-9a-fA-F]{2}){4,}"),
    "unicode_escape_seq": re.compile(r"(?:\\u[0-9a-fA-F]{4}){3,}"),
    "charcode_call": re.compile(r"String\.fromCharCode\s*\(\s*([\d,\s]+)\s*\)"),
    "base64_quoted": re.compile(r"[\"\']([A-Za-z0-9+/]{40,}={0,2})[\"\']"),
    "concat_chain": re.compile(r"(?:[\"\'][^\"\']+[\"\']\s*\+\s*){3,}[\"\'][^\"\']+[\"\']"),
}


def line_offsets(source: str) -> List[int]:
    """Sorted list of byte offsets for every newline in `source`, plus a final
    sentinel of len(source). Used to translate match offsets into 1-indexed
    line numbers via bisect.
    """
    offsets = [-1]  # so that bisect_right of offset 0 returns line 1
    push = offsets.append
    idx = source.find("\n")
    while idx != -1:
        push(idx)
        idx = source.find("\n", idx + 1)
    return offsets


def _scan_one(
    pattern: "re.Pattern[str]", source: str, offsets: List[int]
) -> Dict[str, object]:
    """Run a single compiled pattern over `source` and return count + unique lines."""
    count = 0
    seen_lines: "set[int]" = set()
    for m in pattern.finditer(source):
        count += 1
        seen_lines.add(bisect.bisect_right(offsets, m.start()))
    if not count:
        return None  # type: ignore[return-value]
    return {"count": count, "lines": sorted(seen_lines)}


def scan_source(
    source: str,
    patterns: Iterable[Mapping[str, "re.Pattern[str]"]] = (PATTERNS, FEATURE_PATTERNS),
) -> Dict[str, Dict[str, object]]:
    """Scan `source` against every compiled pattern in `patterns`.

    Returns a dict keyed by pattern name. Each entry has:
        "count": total number of matches in the source
        "lines": sorted list of unique 1-indexed line numbers where the pattern
                 matched (deduplicated — multiple matches on the same line
                 collapse to one entry, preserving the historical
                 line-set semantics of JSSuspiciousAPIsExtractor)
    Patterns with zero matches are absent from the dict; callers should default
    to {"count": 0, "lines": []}.
    """
    if not source:
        return {}
    offsets = line_offsets(source)
    results: Dict[str, Dict[str, object]] = {}
    for table in patterns:
        for name, pat in table.items():
            entry = _scan_one(pat, source, offsets)
            if entry is not None:
                results[name] = entry
    return results