function createMultiScroller(baseElementsForScrolling = [], getPointerPosition) {
    printDebug(() => "creating multi-scroller");
    const scrollingContainersSet = findRelevantScrollContainers(baseElementsForScrolling);
    const scrollingContainersDeepToShallow = Array.from(scrollingContainersSet).sort((dz1, dz2) => getDepth(dz2) - getDepth(dz1));
    const {scrollIfNeeded, resetScrolling} = makeScroller();

    /**
     * @return {boolean} - was any container scrolled
     */
    function tick() {
        const mousePosition = getPointerPosition();
        if (!mousePosition || !scrollingContainersDeepToShallow) {
            return false;
        }
        const scrollContainersUnderCursor = scrollingContainersDeepToShallow.filter(
            el => isPointInsideRect(mousePosition, el.getBoundingClientRect()) || el === document.scrollingElement
        );
        for (let i = 0; i < scrollContainersUnderCursor.length; i++) {
            const scrolled = scrollIfNeeded(mousePosition, scrollContainersUnderCursor[i]);
            if (scrolled) {
                return true;
            }
        }
        return false;
    }
    return {
        multiScrollIfNeeded: scrollingContainersSet.size > 0 ? tick : () => false,
        destroy: () => resetScrolling()
    };
}
@typedef {Object} MultiScroller
 @property {function():boolean} multiScrollIfNeeded - call this on every "tick" to scroll containers if needed, returns true if anything was scrolled
/**
Creates a scroller than can scroll any of the provided containers or any of their scrollable parents (including the document's scrolling element)
@param {HTMLElement[]} baseElementsForScrolling
@param {function():Point} getPointerPosition
@return {MultiScroller}