from _typeshed import Incomplete
from collections.abc import Generator
from docassemble.base import __version__ as da_version
from docassemble.base.astparser import myvisitnode as myvisitnode
from docassemble.base.error import BackgroundResponseActionError as BackgroundResponseActionError, BackgroundResponseError as BackgroundResponseError, CodeExecute as CodeExecute, CommandError as CommandError, DAAttributeError as DAAttributeError, DAError as DAError, DAErrorMissingVariable as DAErrorMissingVariable, DAErrorNoEndpoint as DAErrorNoEndpoint, DAIndexError as DAIndexError, DANotFoundError as DANotFoundError, DAValidationError as DAValidationError, ForcedNameError as ForcedNameError, ForcedReRun as ForcedReRun, LazyNameError as LazyNameError, MandatoryQuestion as MandatoryQuestion, QuestionError as QuestionError, ResponseError as ResponseError
from docassemble.base.functions import RawValue as RawValue, get_config as get_config, get_language as get_language, pickleable_objects as pickleable_objects, word as word
from docassemble.base.logger import logmessage as logmessage
from docassemble.base.mako.exceptions import CompileException as CompileException, SyntaxException as SyntaxException
from docassemble.base.pandoc import MyPandoc as MyPandoc
from html.parser import HTMLParser
from jinja2 import ChainableUndefined, FileSystemLoader
from jinja2.environment import Environment
from jinja2.ext import Extension
from jinja2.runtime import StrictUndefined
from typing import NamedTuple, Set, List, Dict, Any
from re import Pattern

equals_byte: Incomplete
RangeType: Incomplete
NoneType: Incomplete
da_arch: Incomplete
standard_types: Set[int]
DEBUG: bool
import_core: Incomplete
import_util: Incomplete
import_process_action: Incomplete
run_process_action: Incomplete
match_process_action: Pattern
match_mako: Pattern
emoji_match: Pattern
valid_variable_match: Pattern
nameerror_match: Pattern
document_match: Pattern
remove_trailing_dots: Pattern
fix_tabs: Pattern
dot_split: Pattern
match_brackets_at_end: Pattern
match_inside_brackets: Pattern
match_brackets: Pattern
match_brackets_or_dot: Pattern
complications: Pattern
list_of_indices: List[int]
extension_of_doc_format: Dict[str, str]
DO_NOT_TRANSLATE: str

def process_audio_video_list(the_list, the_user_dict) -> List[Dict[str, Any]]: ...
def textify(data, the_user_dict) -> list: ...

INITIAL_DICT: Dict

def set_initial_dict(the_dict) -> None: ...
def get_initial_dict() -> Dict: ...

class DAFileSystemLoader(FileSystemLoader):
    def get_source(self, environment, template): ...

class PackageImage:
    filename: Incomplete
    attribution: Incomplete
    setname: Incomplete
    package: Incomplete
    def __init__(self, **kwargs) -> None: ...
    def get_filename(self): ...
    def get_reference(self): ...

class InterviewSource:
    package: Incomplete
    language: Incomplete
    dialect: Incomplete
    testing: Incomplete
    translating: Incomplete
    def __init__(self, **kwargs) -> None: ...
    def __le__(self, other) -> bool: ...
    def __ge__(self, other) -> bool: ...
    def __gt__(self, other) -> bool: ...
    def __lt__(self, other) -> bool: ...
    def __eq__(self, other) -> bool: ...
    def __ne__(self, other) -> bool: ...
    def __str__(self) -> str: ...
    def __hash__(self): ...
    path: Incomplete
    def set_path(self, path) -> None: ...
    def get_name(self): ...
    def get_index(self): ...
    def update_index(self) -> None: ...
    filepath: Incomplete
    def set_filepath(self, filepath) -> None: ...
    directory: Incomplete
    def set_directory(self, directory) -> None: ...
    content: Incomplete
    def set_content(self, content) -> None: ...
    def set_language(self, language) -> None: ...
    def set_dialect(self, dialect) -> None: ...
    def set_testing(self, testing) -> None: ...
    def set_package(self, package) -> None: ...
    def update(self, **kwargs): ...
    def get_modtime(self): ...
    def get_language(self): ...
    def get_dialect(self): ...
    def get_package(self): ...
    def get_testing(self): ...
    def get_interview(self): ...
    def append(self, path) -> None: ...

class InterviewSourceString(InterviewSource):
    _modtime: Incomplete
    def __init__(self, **kwargs) -> None: ...

class InterviewSourceFile(InterviewSource):
    playground: Incomplete
    playground_file: Incomplete
    filepath: Incomplete
    def __init__(self, **kwargs) -> None: ...
    path: Incomplete
    package: Incomplete
    basename: Incomplete
    def set_path(self, path) -> None: ...
    directory: Incomplete
    def set_filepath(self, filepath) -> None: ...
    def reset_modtime(self) -> None: ...
    def update(self, **kwargs): ...
    _modtime: Incomplete
    def get_modtime(self): ...
    def append(self, path): ...

def dummy_embed_input(status, variable): ...

class InterviewStatus:
    current_info: Incomplete
    attributions: Incomplete
    seeking: Incomplete
    tracker: Incomplete
    maps: Incomplete
    extra_scripts: Incomplete
    extra_css: Incomplete
    using_screen_reader: bool
    can_go_back: bool
    attachments: Incomplete
    linkcounter: int
    embedded: Incomplete
    extras: Incomplete
    followed_mc: bool
    tentatively_answered: Incomplete
    checkin: bool
    def __init__(self, current_info: Incomplete | None = ..., **kwargs) -> None: ...
    def get_all_fields_used(self, user_dict): ...
    def get_fields_and_sub_fields_and_collect_fields(self, user_dict): ...
    def is_empty_mc(self, field): ...
    def get_field_info(self): ...
    def do_sleep(self) -> None: ...
    def get_field_list(self): ...
    def mark_tentative_as_answered(self, the_user_dict) -> None: ...
    screen_reader_text: Incomplete
    screen_reader_links: Incomplete
    def initialize_screen_reader(self) -> None: ...
    question: Incomplete
    questionText: Incomplete
    subquestionText: Incomplete
    continueLabel: Incomplete
    decorations: Incomplete
    audiovideo: Incomplete
    helpText: Incomplete
    interviewHelpText: Incomplete
    selectcompute: Incomplete
    defaults: Incomplete
    other_defaults: Incomplete
    hints: Incomplete
    helptexts: Incomplete
    labels: Incomplete
    sought: Incomplete
    orig_sought: Incomplete
    def populate(self, question_result) -> None: ...
    def set_tracker(self, tracker) -> None: ...
    def get_history(self): ...
    def convert_help(self, help_text, encode, debug): ...
    def as_data(self, the_user_dict, encode: bool = ...): ...
    def get_choices(self, field, the_user_dict): ...
    def icon_url(self, name): ...
    def get_choices_data(self, field, defaultvalue, the_user_dict, encode: bool = ...): ...
    def flush_left(self): ...

class TextObject:
    def __deepcopy__(self, memo): ...
    original_text: Incomplete
    other_lang: Incomplete
    template: Incomplete
    uses_mako: bool
    language: Incomplete
    def __init__(self, x, question: Incomplete | None = ..., translate: bool = ...) -> None: ...
    def text(self, the_user_dict): ...

def myb64quote(text): ...
def safeid(text): ...
def from_safeid(text): ...
def repad(text): ...

class Field:
    number: Incomplete
    saveas: Incomplete
    saveas_code: Incomplete
    showif_code: Incomplete
    action: Incomplete
    label: Incomplete
    datatype: Incomplete
    choicetype: Incomplete
    disableothers: Incomplete
    uncheckothers: Incomplete
    checkothers: Incomplete
    default: Incomplete
    combobox_action: Incomplete
    hint: Incomplete
    data: Incomplete
    helptext: Incomplete
    validate: Incomplete
    validation_messages: Incomplete
    address_autocomplete: Incomplete
    label_above_field: Incomplete
    floating_label: Incomplete
    max_image_size: Incomplete
    image_type: Incomplete
    accept: Incomplete
    permissions: Incomplete
    rows: Incomplete
    object_labeler: Incomplete
    help_generator: Incomplete
    image_generator: Incomplete
    extras: Incomplete
    selections: Incomplete
    sign: Incomplete
    inputtype: Incomplete
    fieldtype: str
    choices: Incomplete
    has_code: bool
    shuffle: Incomplete
    aota: Incomplete
    nota: Incomplete
    required: Incomplete
    def __init__(self, data) -> None: ...
    def validation_message(self, validation_type, status, default_message, parameters: Incomplete | None = ...): ...

def recursive_eval_dataobject(target, the_user_dict): ...
def recursive_eval_data_from_code(target, the_user_dict): ...
def recursive_textobject(target, question): ...
def recursive_eval_textobject(target, the_user_dict, question, tpl, skip_undefined): ...
def recursive_textobject_or_primitive(target, question): ...
def recursive_eval_textobject_or_primitive(target, the_user_dict): ...
def fix_quotes(match): ...
def docx_variable_fix(variable): ...
def url_sanitize(url): ...

class FileInPackage:
    fileref: Incomplete
    is_code: bool
    code: Incomplete
    area: Incomplete
    package: Incomplete
    def __init__(self, fileref, area, package) -> None: ...
    def path(self, the_user_dict: Incomplete | None = ...): ...
    def paths(self, the_user_dict: Incomplete | None = ...): ...

class FileOnServer:
    fileref: Incomplete
    question: Incomplete
    def __init__(self, fileref, question) -> None: ...
    def path(self): ...

def evaluate_image_in_item(data, user_dict): ...
def process_js_vars(expr) -> list: ...

class Question:
    def idebug(self, data): ...
    from_source: Incomplete
    package: Incomplete
    interview: Incomplete
    source_code: Incomplete
    fields: Incomplete
    attachments: Incomplete
    is_generic: bool
    name: Incomplete
    role: Incomplete
    condition: Incomplete
    terms: Incomplete
    autoterms: Incomplete
    need: Incomplete
    need_post: Incomplete
    scan_for_variables: bool
    embeds: bool
    helptext: Incomplete
    subcontent: Incomplete
    breadcrumb: Incomplete
    reload_after: Incomplete
    continuelabel: Incomplete
    continuecolor: Incomplete
    backbuttonlabel: Incomplete
    cornerbackbuttonlabel: Incomplete
    helplabel: Incomplete
    helpheading: Incomplete
    progress: Incomplete
    section: Incomplete
    script: Incomplete
    css: Incomplete
    checkin: Incomplete
    target: Incomplete
    decorations: Incomplete
    audiovideo: Incomplete
    compute_attachment: Incomplete
    can_go_back: bool
    other_fields_used: Incomplete
    fields_used: Incomplete
    fields_for_invalidation: Incomplete
    fields_for_onchange: Incomplete
    names_used: Incomplete
    mako_names: Incomplete
    reconsider: Incomplete
    undefine: Incomplete
    action_buttons: Incomplete
    validation_code: Incomplete
    language: Incomplete
    back_button: Incomplete
    allowed_to_set: Incomplete
    skip_undefined: bool
    list_collect: Incomplete
    list_collect_label: Incomplete
    list_collect_is_final: Incomplete
    list_collect_allow_append: Incomplete
    list_collect_allow_delete: Incomplete
    list_collect_add_another_label: Incomplete
    is_mandatory: bool
    mandatory_code: Incomplete
    is_initial: bool
    initial_code: Incomplete
    question_type: Incomplete
    content: Incomplete
    use_objects: Incomplete
    gathered: Incomplete
    objects: Incomplete
    id: Incomplete
    ga_id: Incomplete
    segment: Incomplete
    generic_object: Incomplete
    module_list: Incomplete
    reset_list: Incomplete
    require_list: Incomplete
    or_else_question: Incomplete
    allow_emailing: Incomplete
    allow_downloading: Incomplete
    email_subject: Incomplete
    email_body: Incomplete
    email_template: Incomplete
    email_default: Incomplete
    always_include_editable_files: Incomplete
    attachment_notice: Incomplete
    download_tab: Incomplete
    manual_attachment_list: Incomplete
    zip_filename: Incomplete
    action: Incomplete
    backgroundresponse: Incomplete
    binaryresponse: Incomplete
    all_variables: bool
    include_internal: Incomplete
    response_file: Incomplete
    content_type: Incomplete
    sleep: Incomplete
    response_code: Incomplete
    css_class: Incomplete
    table_css_class: Incomplete
    question_metadata: Incomplete
    undertext: Incomplete
    pretext: Incomplete
    posttext: Incomplete
    righttext: Incomplete
    question_variety: str
    review_saveas: Incomplete
    compute: Incomplete
    sourcecode: Incomplete
    fields_saveas: Incomplete
    number: Incomplete
    data_for_debug: Incomplete
    def __init__(self, orig_data, caller, **kwargs) -> None: ...
    def get_old_values(self, user_dict): ...
    def invalidate_dependencies_of_variable(self, the_user_dict, field_name, old_value) -> None: ...
    def invalidate_dependencies(self, the_user_dict, old_values) -> None: ...
    def post_exec(self, the_user_dict) -> None: ...
    def exec_setup(self, is_generic, the_x, iterators, the_user_dict) -> None: ...
    def recursive_data_from_code(self, target, objects: bool = ..., plain: bool = ...): ...
    def recursive_dataobject(self, target): ...
    def find_fields_in(self, code) -> None: ...
    def yes(self): ...
    def no(self): ...
    def maybe(self): ...
    def back(self): ...
    def cornerback(self): ...
    def help(self): ...
    def process_attachment_code(self, sourcecode) -> None: ...
    def process_attachment_list(self, target): ...
    def process_attachment(self, orig_target): ...
    def get_question_for_field_with_sub_fields(self, field, user_dict): ...
    def get_fields_and_sub_fields_used(self, user_dict): ...
    def get_fields_and_sub_fields(self, user_dict): ...
    def ask(self, user_dict, old_user_dict, the_x, iterators, sought, orig_sought, process_list_collect: bool = ..., test_for_objects: bool = ...): ...
    def processed_attachments(self, the_user_dict, **kwargs): ...
    def parse_fields(self, the_list, register_target, uses_field): ...
    def mark_as_answered(self, the_user_dict) -> None: ...
    def sub_fields_used(self): ...
    def extended_question_name(self, the_user_dict): ...
    def follow_multiple_choice(self, the_user_dict, interview_status, is_generic, the_x, iterators): ...
    def finalize_attachment(self, attachment, result, the_user_dict): ...
    def prepare_attachment(self, attachment, the_user_dict): ...
    def process_selections_manual(self, data): ...

def emoji_matcher_insert(obj): ...
def emoji_matcher_html(obj): ...
def question_path_options(path): ...
def interview_source_from_string(path, **kwargs): ...
def is_boolean(field_data): ...
def is_threestate(field_data): ...

class TableInfo: ...

def recursive_update(base, target): ...
def recursive_add_classes(class_list, the_class) -> None: ...
def unqualified_name(variable, the_user_dict): ...
def make_backup_vars(the_user_dict): ...
def restore_backup_vars(the_user_dict, backups) -> None: ...
def illegal_variable_name(var): ...
def double_to_single(text): ...
def variables_equivalent(a, b): ...
def normalize_background_response(response): ...

class Interview:
    source: Incomplete
    questions: Incomplete
    generic_questions: Incomplete
    questions_by_id: Incomplete
    questions_by_name: Incomplete
    questions_list: Incomplete
    all_questions: Incomplete
    progress_points: Incomplete
    ids_in_use: Incomplete
    id_orderings: Incomplete
    invalidation: Incomplete
    invalidation_todo: Incomplete
    onchange: Incomplete
    onchange_todo: Incomplete
    orderings: Incomplete
    orderings_by_question: Incomplete
    images: Incomplete
    metadata: Incomplete
    helptext: Incomplete
    defs: Incomplete
    terms: Incomplete
    mlfields: Incomplete
    autoterms: Incomplete
    includes: Incomplete
    reconsider: Incomplete
    reconsider_generic: Incomplete
    question_index: int
    block_index: int
    translating: bool
    default_role: Incomplete
    default_validation_messages: Incomplete
    default_screen_parts: Incomplete
    title: Incomplete
    debug: Incomplete
    use_progress_bar: bool
    question_back_button: bool
    question_help_button: bool
    navigation_back_button: bool
    force_fullscreen: bool
    use_pdf_a: Incomplete
    use_tagged_pdf: Incomplete
    loop_limit: Incomplete
    recursion_limit: Incomplete
    cache_documents: bool
    use_navigation: bool
    use_navigation_on_small_screens: bool
    flush_left: bool
    wide_side_by_side: bool
    max_image_size: Incomplete
    image_type: Incomplete
    bootstrap_theme: Incomplete
    sections: Incomplete
    names_used: Incomplete
    attachment_options: Incomplete
    attachment_index: int
    external_files: Incomplete
    options: Incomplete
    calls_process_action: bool
    uses_action: bool
    imports_util: bool
    table_width: int
    success: bool
    translation_dict: Incomplete
    translations: Incomplete
    scan_for_emojis: bool
    consolidated_metadata: Incomplete
    issue: Incomplete
    custom_data_types: Incomplete
    default_language: Incomplete
    def __init__(self, **kwargs) -> None: ...
    def cross_reference_dependencies(self): ...
    def invalidate_dependencies(self, field_name, the_user_dict, old_values, history=None, force=False) -> None: ...
    def get_ml_store(self): ...
    ml_store: Incomplete
    def set_ml_store(self, ml_store) -> None: ...
    def standard_ml_store(self): ...
    def get_bootstrap_theme(self): ...
    def get_tags(self, the_user_dict): ...
    def get_title(self, the_user_dict, status: Incomplete | None = ..., converter: Incomplete | None = ..., adapted: bool = ...): ...
    def allowed_to_access(self, is_anonymous: bool = ..., has_roles: Incomplete | None = ...): ...
    def allowed_to_initiate(self, is_anonymous: bool = ..., has_roles: Incomplete | None = ...): ...
    def allowed_to_see_listed(self, is_anonymous: bool = ..., has_roles: Incomplete | None = ...): ...
    def is_unlisted(self): ...
    def next_attachment_number(self): ...
    def next_number(self): ...
    def next_block_number(self): ...
    sorter: Incomplete
    default_title: Incomplete
    def read_from(self, source) -> None: ...
    obj: Incomplete
    lookup: Incomplete
    def make_sorter(self): ...
    def sort_with_orderings(self, the_list): ...
    def processed_helptext(self, the_user_dict, language): ...
    def populate_non_pickleable(self, user_dict_copy) -> None: ...
    def assemble(self, user_dict, interview_status: Incomplete | None = ..., old_user_dict: Incomplete | None = ..., force_question: Incomplete | None = ...) -> None: ...
    def load_util(self, the_user_dict) -> None: ...
    def askfor(self, missingVariable, user_dict, old_user_dict, interview_status, **kwargs): ...

def substitute_vars(var, is_generic: bool, the_x, iterators, last_only: bool = ...): ...
def substitute_vars_action(action, is_generic: bool, the_x, iterators): ...
def substitute_vars_from_user_dict(var, the_user_dict, is_generic: bool = ...) -> str: ...
def reproduce_basics(interview, new_interview) -> None: ...
def unpack_list(item, target_list: Incomplete | None = ...): ...
def process_selections(data, exclude: Incomplete | None = ...): ...
def extract_missing_name(the_error): ...
def auto_determine_type(field_info, the_value: Incomplete | None = ...) -> None: ...
def get_mimetype(filename): ...
def interpret_label(text): ...
def recurse_indices(expression_array, variable_list, pre_part, final_list, var_subs_dict, var_subs, generic_dict, generic) -> None: ...
def ensure_object_exists(saveas, datatype, the_user_dict, commands: Incomplete | None = ...) -> None: ...
def invalid_variable_name(varname): ...
def exec_with_trap(the_question, the_dict, old_variable: Incomplete | None = ...) -> None: ...

ok_outside_string: Incomplete
ok_inside_string: Incomplete

def parse_var_name(var): ...

class DAExtension(Extension):
    def parse(self, parser): ...
    def filter_stream(self, stream) -> Generator[Incomplete, None, None]: ...

class DAEnvironment(Environment):
    def from_string(self, source, **kwargs): ...
    def getitem(self, obj, argument): ...
    def getattr(self, obj, attribute): ...

def ampersand_filter(value): ...

class DAStrictUndefined(StrictUndefined):
    __slots__: Incomplete
    _undefined_hint: Incomplete
    _undefined_obj: Incomplete
    _undefined_name: Incomplete
    _undefined_exception: Incomplete
    _undefined_type: Incomplete
    def __init__(self, hint: Incomplete | None = ..., obj=..., name: Incomplete | None = ..., exc=..., accesstype: Incomplete | None = ...) -> None: ...
    def __getattr__(self, name): ...
    def __getitem__(self, index): ...
    def _fail_with_undefined_error(self, *args, **kwargs): ...
    __add__: Incomplete
    __radd__: Incomplete
    __mul__: Incomplete
    __rmul__: Incomplete
    __div__: Incomplete
    __rdiv__: Incomplete
    __truediv__: Incomplete
    __rtruediv__: Incomplete
    __floordiv__: Incomplete
    __rfloordiv__: Incomplete
    __mod__: Incomplete
    __rmod__: Incomplete
    __pos__: Incomplete
    __neg__: Incomplete
    __call__: Incomplete
    __lt__: Incomplete
    __le__: Incomplete
    __gt__: Incomplete
    __ge__: Incomplete
    __int__: Incomplete
    __float__: Incomplete
    __complex__: Incomplete
    __pow__: Incomplete
    __rpow__: Incomplete
    __sub__: Incomplete
    __rsub__: Incomplete
    __iter__: Incomplete
    __str__: Incomplete
    __len__: Incomplete
    __nonzero__: Incomplete
    __eq__: Incomplete
    __ne__: Incomplete
    __bool__: Incomplete
    __hash__: Incomplete

class DASkipUndefined(ChainableUndefined):
    def __init__(self, *pargs, **kwargs) -> None: ...
    def __str__(self) -> str: ...
    def __call__(self, *pargs, **kwargs): ... # type: ignore
    __getitem__: Incomplete
    __getattr__: Incomplete
    def __eq__(self, *pargs) -> bool: ...
    __bool__: Incomplete
    __ne__: Incomplete
    __le__: Incomplete
    __lt__: Incomplete
    __gt__: Incomplete
    __ge__: Incomplete
    __nonzero__: Incomplete
    def __iter__(self, *pargs) -> DASkipUndefined: ...
    def __next__(self, *pargs) -> None: ...
    def __int__(self, *pargs): ... # type: ignore
    __len__: Incomplete
    # need to fix types upstream in Jinja or just not extend.
    def __float__(self, *pargs): ... # type: ignore
    def __complex__(self, *pargs): ... # type: ignore
    def __add__(self, *pargs, **kwargs): ... # type: ignore
    __radd__: Incomplete
    __mul__: Incomplete
    __rmul__: Incomplete
    __div__: Incomplete
    __rdiv__: Incomplete
    __truediv__: Incomplete
    __rtruediv__: Incomplete
    __floordiv__: Incomplete
    __rfloordiv__: Incomplete
    __mod__: Incomplete
    __rmod__: Incomplete
    __pos__: Incomplete
    __neg__: Incomplete
    __pow__: Incomplete
    __rpow__: Incomplete
    __sub__: Incomplete
    __rsub__: Incomplete
    __hash__: Incomplete

def mygetattr(y, attr): ...
def str_or_original(y, case_sensitive): ...
def dictsort_filter(dictionary, case_sensitive: bool = ..., by: str = ..., reverse: bool = ...): ...
def sort_filter(the_array, reverse: bool = ..., case_sensitive: bool = ..., attribute: Incomplete | None = ...): ...

class _GroupTuple(NamedTuple):
    grouper: Incomplete
    list: Incomplete

def groupby_filter(the_array, attr_name): ...
def max_filter(the_array, case_sensitive: bool = ..., attribute: Incomplete | None = ...): ...
def min_filter(the_array, case_sensitive: bool = ..., attribute: Incomplete | None = ...): ...
def sum_filter(the_array, attribute: Incomplete | None = ..., start: int = ...): ...
def unique_filter(the_array, case_sensitive: bool = ..., attribute: Incomplete | None = ...) -> Generator[Incomplete, None, None]: ...
def join_filter(the_array, d: str = ..., attribute: Incomplete | None = ...): ...
def attr_filter(var, attr_name): ...
def selectattr_filter(*pargs, **kwargs) -> Generator[Incomplete, None, Incomplete]: ...
def rejectattr_filter(*pargs, **kwargs) -> Generator[Incomplete, None, Incomplete]: ...
def chain_filter(*pargs, **kwargs): ...
def map_filter(*pargs, **kwargs) -> Generator[Incomplete, None, None]: ...
def markdown_filter(text): ...
def inline_markdown_filter(text): ...

def get_builtin_jinja_filters() -> dict[str, Incomplete]: ...

registered_jinja_filters: Incomplete

def custom_jinja_env(skip_undefined: bool = ...): ...
def register_jinja_filter(filter_name, func) -> None: ...
def get_docx_variables(the_path): ...
def allow_users_list(obj): ...
def allow_privileges_list(obj): ...

class MLStripper(HTMLParser):
    strict: bool
    convert_charrefs: bool
    text: Incomplete
    def __init__(self) -> None: ...
    def handle_data(self, data) -> None: ...
    def get_data(self): ...

def strip_tags(html): ...
