code: def _identifier_characters():
      """See https://docs.python.org/3/reference/lexical_analysis.html#identifiers"""
      # Start by computing the set of special characters
      chars = {"Other_ID_Start": "", "Other_ID_Continue": ""}
      for line in _PROPLIST.splitlines():
          if m := re.match(r"([0-9A-F.]+) +; (\w+) # ", line):
              codes, prop = m.groups()
              span = range(
                  int(codes[:4], base=16), int(codes[-4:], base=16) + 1
              )
              chars[prop] += "".join(chr(x) for x in span)
  
      # Then get the basic set by Unicode category and known extras
      id_start = charmap.query(
          categories=("Lu", "Ll", "Lt", "Lm", "Lo", "Nl"),
          include_characters="_" + chars["Other_ID_Start"],
      )
      id_start -= IntervalSet.from_string(
          # Magic value: the characters which NFKC-normalize to be invalid identifiers.
          # Conveniently they're all in `id_start`, so we only need to do this once.
          "\u037a\u0e33\u0eb3\u2e2f\u309b\u309c\ufc5e\ufc5f\ufc60\ufc61\ufc62\ufc63"
          "\ufdfa\ufdfb\ufe70\ufe72\ufe74\ufe76\ufe78\ufe7a\ufe7c\ufe7e\uff9e\uff9f"
      )
      id_continue = id_start | charmap.query(
          categories=("Mn", "Mc", "Nd", "Pc"),
          include_characters=chars["Other_ID_Continue"],
      )
      return id_start, id_continue
  
imports: import copy
  import re
  import warnings
  from functools import lru_cache
  from hypothesis.errors import HypothesisWarning, InvalidArgument
  from hypothesis.internal import charmap
  from hypothesis.internal.intervalsets import IntervalSet
  from hypothesis.strategies._internal.collections import ListStrategy
  from hypothesis.strategies._internal.lazy import unwrap_strategies
  from hypothesis.strategies._internal.strategies import SearchStrategy
label_desc: Use image node_id 1 for calling a global function with example usage: _identifier_characters() and returns: id_start,  id_continue