def find_text(items, keyword):

    keyword = keyword.upper()

    for item in items:

        if item["text"].upper() == keyword:
            return item

    return None


def find_below(items, source, max_y=120):

    best = None
    best_score = 999999

    for item in items:

        if item == source:
            continue

        if item["y"] <= source["y"]:
            continue

        dy = item["y"] - source["y"]

        if dy > max_y:
            continue

        dx = abs(item["x"] - source["x"])

        score = dy + dx

        if score < best_score:
            best_score = score
            best = item

    return best
    
def find_contains(items, keyword):

    keyword = keyword.upper()

    for item in items:

        if keyword in item["text"].upper():
            return item

    return None   