# Path: sigtools/_util.py
# def get_funcsigs():
#     def __repr__(self):
# def noop(func):
# def qualname(obj):
#     def __init__(self, *args, **kwargs):
#             def cg(func, **kwargs):
#     def __get__(self, instance, owner):
# def safe_get(obj, instance, owner):
# def iter_call(obj):
# def get_introspectable(obj, forged=True, af_hint=True, partial=True):
# def get_ast(func):
# class _Unset(object):
# class OverrideableDataDesc(object):
# UNSET = _Unset()
# 
# Path: sigtools/_specifiers.py
# def forged_signature(obj, auto=True, args=(), kwargs={}):
# 
# Path: sigtools/_signatures.py
# class Signature(_util.funcsigs.Signature):
# class IncompatibleSignatures(ValueError):
# class _Merger(object):
#     def __init__(self, *args, **kwargs):
#     def upgrade(cls, inst, sources):
#     def replace(self, *args, **kwargs):
# def default_sources(sig, obj):
# def set_default_sources(sig, obj):
# def signature(obj):
# def copy_sources(src, func_swap={}, increase=False):
# def sort_params(sig, sources=False):
# def apply_params(sig, posargs, pokargs, varargs, kwoargs, varkwargs,
#                  sources=None):
#     def __init__(self, sig, others):
#     def __str__(self):
# def _add_sources(ret_src, name, *from_sources):
# def _add_all_sources(ret_src, params, from_source):
# def _exclude_from_seq(seq, el):
# def merge_depths(l, r):
#     def __init__(self, left, right):
#     def perform_once(self):
#     def __iter__(self):
#     def _merge(self):
#     def _merge_depths(self):
#     def _add_starargs(self, which, left, right):
#     def _merge_unbalanced_pos(self, existing, src,
#                               convert_from, o_varargs, o_src):
#     def _merge_unbalanced_pok(
#             self, existing, src,
#             o_varargs, o_varkwargs, o_kwargs_limbo, o_src):
#     def _merge_unmatched_kwoargs(self, unmatched_kwoargs, o_varkwargs, from_src):
#     def _concile_meta(self, left, right):
# def merge(*signatures):
# def _check_no_dupes(collect, params):
# def _clear_defaults(ita):
# def _embed(outer, inner, use_varargs=True, use_varkwargs=True, depth=1):
# def embed(use_varargs=True, use_varkwargs=True, *signatures):
# def _pop_chain(*sequences):
# def _remove_from_src(src, ita):
# def _pnames(ita):
# def _mask(sig, num_args, hide_args, hide_kwargs,
#           hide_varargs, hide_varkwargs, named_args, partial_obj):
# def mask(sig, num_args=0,
#          hide_args=False, hide_kwargs=False,
#          hide_varargs=False, hide_varkwargs=False,
#          *named_args):
# def forwards(outer, inner, num_args=0,
#              hide_args=False, hide_kwargs=False,
#              use_varargs=True, use_varkwargs=True,
#              partial=False, *named_args):


from functools import partial, update_wrapper
from sigtools import _util, _specifiers, _signatures
        from sigtools import wrappers
    python3 syntax.

    These two functions are equivalent::

        def py3_func(spam, *, ham, eggs='chicken'):
            return spam, ham, eggs

        @kwoargs('ham', 'eggs')
        def py23_func(spam, ham, eggs='chichen'):
            return spam, ham, eggs

    :param str start: If given and is the name of a parameter, it and all
        parameters after it are made keyword-only
    :param str kwoarg_names: Names of the parameters to convert

    :raises: `ValueError` if end or one of posoarg_names isn't in the
        decorated function's signature.
    """
    assert all(isinstance(s, str) for s in kwoarg_names), \
        "argument names must be strings; forgot to put () after @kwoargs?"
    if start is not None:
        return partial(_kwoargs_start, start, kwoarg_names)
    if not kwoarg_names:
        return _util.noop
    return partial(_PokTranslator, kwoargs=kwoarg_names)
# my syntax highlighter is broken """

def _kwoargs_start(start, _kwoargs, func, *args, **kwargs):
    kwoarg_names = set(_kwoargs)
    found = False

# Path: sigtools/_util.py
# def get_funcsigs():
#     def __repr__(self):
# def noop(func):
# def qualname(obj):
#     def __init__(self, *args, **kwargs):
#             def cg(func, **kwargs):
#     def __get__(self, instance, owner):
# def safe_get(obj, instance, owner):
# def iter_call(obj):
# def get_introspectable(obj, forged=True, af_hint=True, partial=True):
# def get_ast(func):
# class _Unset(object):
# class OverrideableDataDesc(object):
# UNSET = _Unset()
# 
# Path: sigtools/_specifiers.py
# def forged_signature(obj, auto=True, args=(), kwargs={}):
# 
# Path: sigtools/_signatures.py
# class Signature(_util.funcsigs.Signature):
# class IncompatibleSignatures(ValueError):
# class _Merger(object):
#     def __init__(self, *args, **kwargs):
#     def upgrade(cls, inst, sources):
#     def replace(self, *args, **kwargs):
# def default_sources(sig, obj):
# def set_default_sources(sig, obj):
# def signature(obj):
# def copy_sources(src, func_swap={}, increase=False):
# def sort_params(sig, sources=False):
# def apply_params(sig, posargs, pokargs, varargs, kwoargs, varkwargs,
#                  sources=None):
#     def __init__(self, sig, others):
#     def __str__(self):
# def _add_sources(ret_src, name, *from_sources):
# def _add_all_sources(ret_src, params, from_source):
# def _exclude_from_seq(seq, el):
# def merge_depths(l, r):
#     def __init__(self, left, right):
#     def perform_once(self):
#     def __iter__(self):
#     def _merge(self):
#     def _merge_depths(self):
#     def _add_starargs(self, which, left, right):
#     def _merge_unbalanced_pos(self, existing, src,
#                               convert_from, o_varargs, o_src):
#     def _merge_unbalanced_pok(
#             self, existing, src,
#             o_varargs, o_varkwargs, o_kwargs_limbo, o_src):
#     def _merge_unmatched_kwoargs(self, unmatched_kwoargs, o_varkwargs, from_src):
#     def _concile_meta(self, left, right):
# def merge(*signatures):
# def _check_no_dupes(collect, params):
# def _clear_defaults(ita):
# def _embed(outer, inner, use_varargs=True, use_varkwargs=True, depth=1):
# def embed(use_varargs=True, use_varkwargs=True, *signatures):
# def _pop_chain(*sequences):
# def _remove_from_src(src, ita):
# def _pnames(ita):
# def _mask(sig, num_args, hide_args, hide_kwargs,
#           hide_varargs, hide_varkwargs, named_args, partial_obj):
# def mask(sig, num_args=0,
#          hide_args=False, hide_kwargs=False,
#          hide_varargs=False, hide_varkwargs=False,
#          *named_args):
# def forwards(outer, inner, num_args=0,
#              hide_args=False, hide_kwargs=False,
#              use_varargs=True, use_varkwargs=True,
#              partial=False, *named_args):


# Path: sigtools/modifiers.py
from functools import partial, update_wrapper
from sigtools import _util, _specifiers, _signatures
        from sigtools import wrappers

    python3 syntax.

    These two functions are equivalent::

        def py3_func(spam, *, ham, eggs='chicken'):
            return spam, ham, eggs

        @kwoargs('ham', 'eggs')
        def py23_func(spam, ham, eggs='chichen'):
            return spam, ham, eggs

    :param str start: If given and is the name of a parameter, it and all
        parameters after it are made keyword-only
    :param str kwoarg_names: Names of the parameters to convert

    :raises: `ValueError` if end or one of posoarg_names isn't in the
        decorated function's signature.
    """
    assert all(isinstance(s, str) for s in kwoarg_names), \
        "argument names must be strings; forgot to put () after @kwoargs?"
    if start is not None:
        return partial(_kwoargs_start, start, kwoarg_names)
    if not kwoarg_names:
        return _util.noop
    return partial(_PokTranslator, kwoargs=kwoarg_names)
# my syntax highlighter is broken """

def _kwoargs_start(start, _kwoargs, func, *args, **kwargs):
    kwoarg_names = set(_kwoargs)
    found = False

    sig = _specifiers.forged_signature(func, auto=False).parameters.values()