def _get_token_possibilities(cls, token, mode):
        """
        Returns all possible component types of a token without regard to its context. For example "26" could be year,
        date or minute, but can't be a month or an hour.
        :param token: the token to classify
        :param mode: the parse mode
        :return: the dict of possible types and values if token was of that type
        """
        token = token.lower().strip()
        possibilities = {}
        try:
            as_int = int(token)

            if mode != Mode.TIME:
                if 1 <= as_int <= 9999 and (len(token) == 2 or len(token) == 4):
                    possibilities[Component.YEAR] = as_int
                if 1 <= as_int <= 12:
                    possibilities[Component.MONTH] = as_int
                if 1 <= as_int <= 31:
                    possibilities[Component.DAY] = as_int

            if mode != Mode.DATE:
                if 0 <= as_int <= 23:
                    possibilities[Component.HOUR] = as_int
                if 0 <= as_int <= 59:
                    possibilities[Component.MINUTE] = as_int
                if 0 <= as_int <= 59:
                    possibilities[Component.SECOND] = as_int
                if len(token) == 3 or len(token) == 6 or len(token) == 9:
                    nano = 0
                    if len(token) == 3:  # millisecond precision
                        nano = as_int * 1000000
                    elif len(token) == 6:  # microsecond precision
                        nano = as_int * 1000
                    elif len(token) == 9:
                        nano = as_int
                    possibilities[Component.NANO] = nano
                if len(token) == 4:
                    hour = as_int // 100
                    minute = as_int - (hour * 100)
                    if 1 <= hour <= 24 and 1 <= minute <= 59:
                        possibilities[Component.HOUR_AND_MINUTE] = as_int

        except ValueError:
            if mode != Mode.TIME:
                # could it be a month alias?
                month = MONTHS_BY_ALIAS.get(token, None)
                if month is not None:
                    possibilities[Component.MONTH] = month

            if mode != Mode.DATE:
                # could it be an AM/PM marker?
                is_am_marker = token == "am"
                is_pm_marker = token == "pm"
                if is_am_marker or is_pm_marker:
                    possibilities[Component.AM_PM] = cls.AM if is_am_marker else cls.PM

                # offset parsing is limited to Z meaning UTC for now
                if token == "z":
                    possibilities[Component.OFFSET] = 0

        return possibilities
Returns all possible component types of a token without regard to its context. For example "26" could be year,
        date or minute, but can't be a month or an hour.
        :param token: the token to classify
        :param mode: the parse mode
        :return: the dict of possible types and values if token was of that type