# Path: tabun_api/compat.py
# PY2 = sys.version_info.major == 2


import re
import sys
import time
import random
import logging
import platform
import mimetypes
import lxml
import lxml.html
import lxml.etree
import iso8601
    import warnings
        import Image
        import imp
        import importlib
        import importlib.util
    import socks
from hashlib import md5
from .compat import text, text_types, binary, urequest, PY2, BaseCookie
        from PIL import Image
    from io import BytesIO
        from urlparse import urlparse
        from urllib.parse import urlparse
        process_br = getattr(self, 'process_br', None)
        process_a = getattr(self, 'process_a', None)
        process_span = getattr(self, 'process_span', None)
        default_process = self.default_process
        format_item_tail = self.format_item_tail

        cut_stop = False

        while True:
            # Проверяем, что очередь не пуста
            while full_queue and not full_queue[-1]:
                full_queue.pop()
                depth.pop()
            if not full_queue or not depth:
                assert not depth
                assert not full_queue
                break

            # Берём следующий элемент (может быть любой вложенности — избегаем рекурсии зазря)
            item = full_queue[-1].pop()

            # С помощью специального значения избегаем лишних переносов на границах блоков
            if item == self.NEWLINE:
                sdata = data[-1].rstrip(' ')
                if not sdata.endswith('\n'):
                    data[-1] = sdata
                    data.append('\n')
                continue

            # Это может быть просто текст между элементами (добавляется ниже в format_item_tail)

# Path: tabun_api/compat.py
# PY2 = sys.version_info.major == 2


# Path: tabun_api/utils.py
import re
import sys
import time
import random
import logging
import platform
import mimetypes
import lxml
import lxml.html
import lxml.etree
import iso8601
    import warnings
        import Image
        import imp
        import importlib
        import importlib.util
    import socks
from hashlib import md5
from .compat import text, text_types, binary, urequest, PY2, BaseCookie
        from PIL import Image
    from io import BytesIO
        from urlparse import urlparse
        from urllib.parse import urlparse

        process_br = getattr(self, 'process_br', None)
        process_a = getattr(self, 'process_a', None)
        process_span = getattr(self, 'process_span', None)
        default_process = self.default_process
        format_item_tail = self.format_item_tail

        cut_stop = False

        while True:
            # Проверяем, что очередь не пуста
            while full_queue and not full_queue[-1]:
                full_queue.pop()
                depth.pop()
            if not full_queue or not depth:
                assert not depth
                assert not full_queue
                break

            # Берём следующий элемент (может быть любой вложенности — избегаем рекурсии зазря)
            item = full_queue[-1].pop()

            # С помощью специального значения избегаем лишних переносов на границах блоков
            if item == self.NEWLINE:
                sdata = data[-1].rstrip(' ')
                if not sdata.endswith('\n'):
                    data[-1] = sdata
                    data.append('\n')
                continue

            # Это может быть просто текст между элементами (добавляется ниже в format_item_tail)

            if isinstance(item, text_types):