U /�XR � @ s d Z ddlZejd dkZdd� ZesteZefZefZ dd� Z dd� Zdd� Zdd l mZ d-d d�ZeZd.dd �ZnPeZeefZeefZ dd� Z dd� Zdd� Zdd lmZ ed� dd� Zed� dd� ZdZeed��rLG dd� de�Zz0ze� � e� �W 5 Q R X W n � Y nX W n. ek �r6 dZY n ek �rJ Y nX zddlmZ W n� ek �r� ddl m!Z! G dd� de"e!�Zd d!� Z#d"d#� Z$d$d%� Z%d&d'� Z&e!j'Z'e!j(Z(e!j)Z)e!j*Z*e!j+Z+e!j Z e!jZe!jZY nX zdd(l,m-Z- W n( ek �r d)d*� Z.d/d+d,�Z-Y nX dS )0z� Compatibility layer. Some py2/py3 compatibility support based on a stripped down version of six so we don't have to depend on a specific version of it. :copyright: (c) 2014 by Armin Ronacher. :license: BSD � N� c C s | S �N� ��xr r � /compat.py�<lambda> � r c C s t | �� �S r )�iter�keys��dr r r r r c C s t | �� �S r )r �valuesr r r r r r c C s t | �� �S r )r �itemsr r r r r r )�StringIOc C s |j |k r|�|��|�d S r )� __traceback__�with_traceback)�tp�value�tbr r r �reraise s r c C s* t | t�rt| dddd�} t| ||� d S )Nz<string>�execT)�dont_inherit)� isinstance�str�compiler )�codeZglobZlocr r r �exec_in"