Your IP : 216.73.216.61


Current Path : /home/w/u/e/wuectly/www/03cbe/
Upload File :
Current File : /home/w/u/e/wuectly/www/03cbe/lib.tar

loading.gif000060400000014120152455615120006650 0ustar00GIF89a00���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}}|||{{{zzzxxxwwwvvvuuutttrrrqqqlllkkkjjjiiihhhfffeeedddccc___^^^]]]\\\[[[YYYXXXWWWVVVUUUSSSRRRQQQOOOMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBB@@@???>>>===<<<:::888777666444333222111000...---,,,+++)))'''%%%$$$###!!!





���!�NETSCAPE2.0!�	
�,+-�[	H� �U���ʠÇ
"�Q!A�
;E�ȱ�B�|���ɂ�\	����'M�`�r�)����F�KBS��'�k�)`
P��nTp�@B
9��X2���D4Kւ<�(�g +T�8��A�n�2���I`)F}�HR�P�u�`Q�S����y󆎤�i��)�V�`����9���}XF3��<Y�9�#Gv�szrT�Hp݀��U����EQÁ��>�(�'�-:��;�Jm��c�(�O���)}�Uk:P[���0#u�c���m��{��`G��aX �܁EbCTX�B��'���(=T(�"��@��1����#����F8~�Q1��B''J�8��
�=n�c�Ci�I�x��D�a�1�x�@)�آ@Rh!�[
�a�%�`��	рn�)'A�dR�xs:�2�P m�$J$��ґ%<���	-��_OD��'���	)dzBxv$JJ��>���fzi��	J0���Z��*O�����TI���E�ɡB��N��'
�F*h̪��F$��b�C$9�:<�A���EǑ(r8��T�8ԋ��GJ��B�@�a/AT�'A�1��<|:ԫ���Y�TP1��r�S!�	
�,+,�[	H� AR�̐��ɠÇ
2�Q��	)�D�ȱ�"
B��Ц�ɂ�l�\���ɗ�
Ud�A���*
TI��U�
�a@S���vTH��C;�1��!���-�@G+6����lt����z"pm@���x4��p��5��ӪS
�L�ț�E)�>�T�83YB9t�1^P
����V��p�ڠ�Pj<�����lM�ĥ�)�Le�=V�~$�"��*�fP�CQ'������B���p�3�:B!�JDNj����c�����Q�e����X(P�i0��
"Y���g*�TBJ��I3�` fX+�4'P%<���	-�%bA�0�����
(��Ž'q��r�o�AG$�����;�(C%@
�Io�A�����<�^���Q%�}�G
L�8��@�H�U*"(R��#�D9�'�Q�!�JMA%ztJ'����c�F*餔V*�';5�!*���G�8�CO4�`&q�a� &BT�8ě���DJ]�E!U��81�K���k�p8�&D{�&�{�����9��@�@B	��q���T�Q+A�t�DhxbP&p���I��KP(](�/p|:*��"���@�L(��(�T��+�ź��bF�J8�G�y�F]��*Ȫ��c�!�	
�,-+�[	H��Q„�#ʠÇF��a�> E��q`'Cn����ɇk:���a�ɗUY򈪁���IS�LU�
��A�b�U�V�Q!��8���2�^)��5�+bGQST�8���F��H�,��U�c�6��3��)R���J�*3"D�8����c+���	��gd��'A��l��Xh"�Br9�Y	���)�U9L�u@f���O�Q���l��c��L��;�'���ȀQ�Ҏ��<��kA��T�,7�	����o8Д?���Cf
����	 ���G�'y�D(al��&�� �F �@p�@��a�X4��@�,��p�:�`#�����/Jh�%�Pa��:�b=~�!�L1$:�"IJ�d+r�0��m�E���
)&q�#+���`��݅��*ET�@]i>ԉ��@�yB�I@�]�]r����褭�BI$�8�'���	Q@��[/yv B�I�����v���I���ƭr02�F�d��>�K��!DZo�G�p��QP��'v����r��2�Ʋ�I$
	U���1�I��хp|bP&m���T
#}�!ɮ&�B
+�Gw!��g��'c$��]Rj�(fHlF�Ċ _ �� w\0"�"R���0}!�	
�,,+�[	H�`AU�*\Ȱ!(8M���԰�E����8q"HC2��
�R�\)PU�&M����%�SF`�<!�AQ}���#J�*M�Fsr�R!�A� -�RC$�F+��ȱş��jT]��'�qp���SAHRd�0�'�@5�V�����)sq�d0եJP�"x�U
'^U��U�`nwn]�V@k��U��`E"Qل��G��Te&[hF��j,���;��)N�T6�ު�1i
��R�4��pCAT� }�NPM���X$Г(P�d��C��7���L(a`�q���W!�d�:�{=4�f��ńF1	w�ܠ�x�ъM��v�Iqb��
*}p����J ��B��"�������Y ����{(~���1���]`IPO`@@ ��b���)'
�q)�DRTwC��'�5�	`���%!!���s��p�G�v!�)e���P��'cT��vY�æs*��B��!��\�t*�q��+�|A��@**�x��@��
@�
�b�p�iA�BG�(Պ��:�B�k�)�!��`�J��J]'t���}<ۉ����'u���϶�	���l�X����A�ر�!0�W�"}���m.��t�!�	
�,+-�[	H�`AS�*\Ȑ!)9S��)հ�Ł���CǚUC.�d�#G#�D�$X)�IB*)L�je)R ���˨��� q"G�ET~�d��ɠ�':t@iTҎ'N��b��'J�0A�ʠ�A�:L%%k
�*�T,�E,%Q(��$��۷'��t�Ů(�DZ���%���s7�P"Ki�5���Dy���?-�f�!��)J�0�\��H�SL��-�T�LeyN�����/�Bt凑5j��)x�V�̐����ĭP	�23&N�����~C����t�߆TrTAڳ��G՛��q���{a�`&W�܅�J|��q��w �7yr\�^���CW���IB�rF	�yp�n�)�
sA�'5�H�*�(*�H��](�@�8QAP:�G��I'����@�e��P)��A���ȓ_z�B�1"�sbv�d�C[(��m~)����s��@�����i���|�P* ��M����i��pi�i4$	oЖ�H*U!���
����YHC�D�G����%�k|�*U��)��A����G*�"���m��ɑ�8P��F�B*�y�h-o�/ "�)+��¾5����
���@l<�k���@��`�
X��!�h	!�X�H!�	
�,+,�[	H�`�R�T\Ȱ!CT~�dy�ɡŋ�4Q���TC2,ť#%P(�\Ip��(!�d�j�'�U�9ɱ˧��L�D%��8�zB�I�Iř2%)���t����I�~�T��,5
�z�u+�H+51���&�����v%� t������Q+Ga��e�ES�̌�sif�'9r<iRU�NBg��4hP'ѨS�^ͺ5�Si	����끕�i�R���S�5�(N�H!�w�Er�D�su*)�Q$O��>ң�����ڵ�h��ԟ�o�_])��'�؎D�tDթF��mG�@�D�G�8��-(��Tl���2� T�5D
%�ض�*�d�Y �a�u2���C��*�\�6	�qtf�=�y
Q!��O`��$h`%5�X&<$���dj�b�Q��6`�l�D�d~��Bc�f����)�HqC\��	t���Bk�gk��
T�h�rh�V���!�	�<�@��6PAw��),�T
��`J����i}��hh�Gl6���������	dzp�����|B�F+;$���b�A��ƒ
(`������ӋjURZ%�u���@�{C)ԆɊ�H�ɑ�8P�
�@L�'{�a!�!�	
�,-+�[	H��A��R\Ȱ�AT�޼AdʡŋY
�ҥ˗A�0�\8�LǎfD�\I�Ә�]�xb�0UE����� �Q�V���Ϣ�3��M&���h����EIt$�1�� )I��<���%O�`L��9o�|Y)�&f��m���۷t8�����,�.�bW�S#Eu9{�*��١h��H]�DA3W��O�z���j��E�:�f�K�W�Yq@@�����
ȓ�!�8CD�K�HH�*i��j���9�wt%ȑ5�+U�.=@➞�CN�A	�K�A�����QQ
~�%�_n����W uZ�'}���]��W�k�"t�Uwv�l2�@�}'@�9��n���ùȐ)��Ax�Sҕ���AH6`���&�9$�I&��]��E�0��X�I
UVYA ��	l��C%�!A�UJqQ)E��žz��PtV�É�p�I�U��{�pB����"�B|�A�1d&20ʧ�-TH�:�E+��!��n� �ץ"�|��C��Pi���H	��Z"Eƒ�'�0�J1"��!�{A�����Z��
�6 �
r\�
��
Đ�R*F��F|�����jĉD�F�v`m�ubC�6t��A���������a���J!�	
�,-+�[	H��A��P\Ȱ�AT���YTʡE���c��Ht޼�SH�E�~X ��*���3RΛ:1O2d��ϟ\th�OM9t��<hЧCL�bdS�SMZT�#�S�
	��@��2�!�
+Y��4�@T�8�%�jЗ.]�b�p��@y\e0�2�
F�S��Ncw�s�\�>�Z4%G3���zE��%7`���d�)�:EE�D�$O�/�.�re�����SL!�h���64�^�	(�K�X��N�'X�T5��@O)ʗ�H=AOp�p�w���Ia�@����J4�@dh�v7h��$Q(�ā\Td���0`+�8a�Y�FH��Ň�t���o�4�
)rɇ�@�P���@��`j�(�'�P�Z+�܀b���F.TJ!i���pU�t
'���%C��,�G*c���ĩAfPy�(�hb'C�� ��$�T#Xa��YtşZ�S'O� )�9�J���Ò
�ä8Dg���9��R�%��)��:����rP�@��aD2Hq#A��Z�C�ܐi
��G'4{��DhD z$=��<��
)F��¸�a�z.%�`xч(Q"���p�b�)&4�Kn{�y�͒�°�	)4���%\P%d$G�tJ�;background.png000060400000000246152455615120007375 0ustar00�PNG


IHDR22?��tEXtSoftwareAdobe ImageReadyq�e<HIDATx���1 ��nj��AN5-p[BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD�'�D���y�IEND�B`�mediaelement-and-player.min.js000060400000226241152455615120012360 0ustar00/*!
* MediaElement.js
* HTML5 <video> and <audio> shim and player
* http://mediaelementjs.com/
*
* Creates a JavaScript object that mimics HTML5 MediaElement API
* for browsers that don't understand HTML5 or can't play the provided codec
* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
*
* Copyright 2010-2014, John Dyer (http://j.hn)
* License: MIT
*
*/
var myjQuery = false;
if (typeof jQuery == 'function')
	myjQuery = jQuery;
else if (typeof $j == 'function')
	myjQuery = $j;
else if (typeof $ == 'function' && typeof $.fn == 'function')
	myjQuery = $;

(function(jQuery){
	if (jQuery == false)
	{
		console.warn('SUDesign, Audio shortcode : jQuery not found !');
		return;
	}
	
var mejs=mejs||{};mejs.version="2.15.1";mejs.meIndex=0;
mejs.plugins={silverlight:[{version:[3,0],types:["video/mp4","video/m4v","video/mov","video/wmv","audio/wma","audio/m4a","audio/mp3","audio/wav","audio/mpeg"]}],flash:[{version:[9,0,124],types:["video/mp4","video/m4v","video/mov","video/flv","video/rtmp","video/x-flv","audio/flv","audio/x-flv","audio/mp3","audio/m4a","audio/mpeg","video/youtube","video/x-youtube","application/x-mpegURL"]}],youtube:[{version:null,types:["video/youtube","video/x-youtube","audio/youtube","audio/x-youtube"]}],vimeo:[{version:null,
types:["video/vimeo","video/x-vimeo"]}]};
mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&amp;").split("<").join("&lt;").split('"').join("&quot;")},absolutizeUrl:function(a){var b=document.createElement("div");b.innerHTML='<a href="'+this.escapeHTML(a)+'">x</a>';return b.firstChild.href},getScriptPath:function(a){for(var b=0,c,d="",e="",g,f,i=document.getElementsByTagName("script"),k=i.length,h=a.length;b<k;b++){g=i[b].src;c=g.lastIndexOf("/");if(c>-1){f=g.substring(c+
1);g=g.substring(0,c+1)}else{f=g;g=""}for(c=0;c<h;c++){e=a[c];e=f.indexOf(e);if(e>-1){d=g;break}}if(d!=="")break}return d},secondsToTimeCode:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d=="undefined")d=25;var e=Math.floor(a/3600)%24,g=Math.floor(a/60)%60,f=Math.floor(a%60);a=Math.floor((a%1*d).toFixed(3));return(b||e>0?(e<10?"0"+e:e)+":":"")+(g<10?"0"+g:g)+":"+(f<10?"0"+f:f)+(c?":"+(a<10?"0"+a:a):"")},timeCodeToSeconds:function(a,b,c,d){if(typeof c=="undefined")c=false;else if(typeof d==
"undefined")d=25;a=a.split(":");b=parseInt(a[0],10);var e=parseInt(a[1],10),g=parseInt(a[2],10),f=0,i=0;if(c)f=parseInt(a[3])/d;return i=b*3600+e*60+g+f},convertSMPTEtoSeconds:function(a){if(typeof a!="string")return false;a=a.replace(",",".");var b=0,c=a.indexOf(".")!=-1?a.split(".")[1].length:0,d=1;a=a.split(":").reverse();for(var e=0;e<a.length;e++){d=1;if(e>0)d=Math.pow(60,e);b+=Number(a[e])*d}return Number(b.toFixed(c))},removeSwf:function(a){var b=document.getElementById(a);if(b&&/object|embed/i.test(b.nodeName))if(mejs.MediaFeatures.isIE){b.style.display=
"none";(function(){b.readyState==4?mejs.Utility.removeObjectInIE(a):setTimeout(arguments.callee,10)})()}else b.parentNode.removeChild(b)},removeObjectInIE:function(a){if(a=document.getElementById(a)){for(var b in a)if(typeof a[b]=="function")a[b]=null;a.parentNode.removeChild(a)}}};
mejs.PluginDetector={hasPluginVersion:function(a,b){var c=this.plugins[a];b[1]=b[1]||0;b[2]=b[2]||0;return c[0]>b[0]||c[0]==b[0]&&c[1]>b[1]||c[0]==b[0]&&c[1]==b[1]&&c[2]>=b[2]?true:false},nav:window.navigator,ua:window.navigator.userAgent.toLowerCase(),plugins:[],addPlugin:function(a,b,c,d,e){this.plugins[a]=this.detectPlugin(b,c,d,e)},detectPlugin:function(a,b,c,d){var e=[0,0,0],g;if(typeof this.nav.plugins!="undefined"&&typeof this.nav.plugins[a]=="object"){if((c=this.nav.plugins[a].description)&&
!(typeof this.nav.mimeTypes!="undefined"&&this.nav.mimeTypes[b]&&!this.nav.mimeTypes[b].enabledPlugin)){e=c.replace(a,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(a=0;a<e.length;a++)e[a]=parseInt(e[a].match(/\d+/),10)}}else if(typeof window.ActiveXObject!="undefined")try{if(g=new ActiveXObject(c))e=d(g)}catch(f){}return e}};
mejs.PluginDetector.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(a){var b=[];if(a=a.GetVariable("$version")){a=a.split(" ")[1].split(",");b=[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]}return b});
mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(a){var b=[0,0,0,0],c=function(d,e,g,f){for(;d.isVersionSupported(e[0]+"."+e[1]+"."+e[2]+"."+e[3]);)e[g]+=f;e[g]-=f};c(a,b,0,1);c(a,b,1,1);c(a,b,2,1E4);c(a,b,2,1E3);c(a,b,2,100);c(a,b,2,10);c(a,b,2,1);c(a,b,3,1);return b});
mejs.MediaFeatures={init:function(){var a=this,b=document,c=mejs.PluginDetector.nav,d=mejs.PluginDetector.ua.toLowerCase(),e,g=["source","track","audio","video"];a.isiPad=d.match(/ipad/i)!==null;a.isiPhone=d.match(/iphone/i)!==null;a.isiOS=a.isiPhone||a.isiPad;a.isAndroid=d.match(/android/i)!==null;a.isBustedAndroid=d.match(/android 2\.[12]/)!==null;a.isBustedNativeHTTPS=location.protocol==="https:"&&(d.match(/android [12]\./)!==null||d.match(/macintosh.* version.* safari/)!==null);a.isIE=c.appName.toLowerCase().indexOf("microsoft")!=
-1||c.appName.toLowerCase().match(/trident/gi)!==null;a.isChrome=d.match(/chrome/gi)!==null;a.isChromium=d.match(/chromium/gi)!==null;a.isFirefox=d.match(/firefox/gi)!==null;a.isWebkit=d.match(/webkit/gi)!==null;a.isGecko=d.match(/gecko/gi)!==null&&!a.isWebkit&&!a.isIE;a.isOpera=d.match(/opera/gi)!==null;a.hasTouch="ontouchstart"in window;a.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect;for(c=0;c<g.length;c++)e=document.createElement(g[c]);
a.supportsMediaTag=typeof e.canPlayType!=="undefined"||a.isBustedAndroid;try{e.canPlayType("video/mp4")}catch(f){a.supportsMediaTag=false}a.hasSemiNativeFullScreen=typeof e.webkitEnterFullscreen!=="undefined";a.hasNativeFullscreen=typeof e.requestFullscreen!=="undefined";a.hasWebkitNativeFullScreen=typeof e.webkitRequestFullScreen!=="undefined";a.hasMozNativeFullScreen=typeof e.mozRequestFullScreen!=="undefined";a.hasMsNativeFullScreen=typeof e.msRequestFullscreen!=="undefined";a.hasTrueNativeFullScreen=
a.hasWebkitNativeFullScreen||a.hasMozNativeFullScreen||a.hasMsNativeFullScreen;a.nativeFullScreenEnabled=a.hasTrueNativeFullScreen;if(a.hasMozNativeFullScreen)a.nativeFullScreenEnabled=document.mozFullScreenEnabled;else if(a.hasMsNativeFullScreen)a.nativeFullScreenEnabled=document.msFullscreenEnabled;if(a.isChrome)a.hasSemiNativeFullScreen=false;if(a.hasTrueNativeFullScreen){a.fullScreenEventName="";if(a.hasWebkitNativeFullScreen)a.fullScreenEventName="webkitfullscreenchange";else if(a.hasMozNativeFullScreen)a.fullScreenEventName=
"mozfullscreenchange";else if(a.hasMsNativeFullScreen)a.fullScreenEventName="MSFullscreenChange";a.isFullScreen=function(){if(a.hasMozNativeFullScreen)return b.mozFullScreen;else if(a.hasWebkitNativeFullScreen)return b.webkitIsFullScreen;else if(a.hasMsNativeFullScreen)return b.msFullscreenElement!==null};a.requestFullScreen=function(i){if(a.hasWebkitNativeFullScreen)i.webkitRequestFullScreen();else if(a.hasMozNativeFullScreen)i.mozRequestFullScreen();else a.hasMsNativeFullScreen&&i.msRequestFullscreen()};
a.cancelFullScreen=function(){if(a.hasWebkitNativeFullScreen)document.webkitCancelFullScreen();else if(a.hasMozNativeFullScreen)document.mozCancelFullScreen();else a.hasMsNativeFullScreen&&document.msExitFullscreen()}}if(a.hasSemiNativeFullScreen&&d.match(/mac os x 10_5/i)){a.hasNativeFullScreen=false;a.hasSemiNativeFullScreen=false}}};mejs.MediaFeatures.init();
mejs.HtmlMediaElement={pluginType:"native",isFullScreen:false,setCurrentTime:function(a){this.currentTime=a},setMuted:function(a){this.muted=a},setVolume:function(a){this.volume=a},stop:function(){this.pause()},setSrc:function(a){for(var b=this.getElementsByTagName("source");b.length>0;)this.removeChild(b[0]);if(typeof a=="string")this.src=a;else{var c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.src=c.src;break}}}},setVideoSize:function(a,b){this.width=a;this.height=b}};
mejs.PluginMediaElement=function(a,b,c){this.id=a;this.pluginType=b;this.src=c;this.events={};this.attributes={}};
mejs.PluginMediaElement.prototype={pluginElement:null,pluginType:"",isFullScreen:false,playbackRate:-1,defaultPlaybackRate:-1,seekable:[],played:[],paused:true,ended:false,seeking:false,duration:0,error:null,tagName:"",muted:false,volume:1,currentTime:0,play:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.playVideo():this.pluginApi.playMedia();this.paused=false}},load:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType==
"vimeo"||this.pluginApi.loadMedia();this.paused=false}},pause:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.pauseVideo():this.pluginApi.pauseMedia();this.paused=true}},stop:function(){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.stopVideo():this.pluginApi.stopMedia();this.paused=true}},canPlayType:function(a){var b,c,d,e=mejs.plugins[this.pluginType];for(b=0;b<e.length;b++){d=e[b];if(mejs.PluginDetector.hasPluginVersion(this.pluginType,
d.version))for(c=0;c<d.types.length;c++)if(a==d.types[c])return"probably"}return""},positionFullscreenButton:function(a,b,c){this.pluginApi!=null&&this.pluginApi.positionFullscreenButton&&this.pluginApi.positionFullscreenButton(Math.floor(a),Math.floor(b),c)},hideFullscreenButton:function(){this.pluginApi!=null&&this.pluginApi.hideFullscreenButton&&this.pluginApi.hideFullscreenButton()},setSrc:function(a){if(typeof a=="string"){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(a));this.src=mejs.Utility.absolutizeUrl(a)}else{var b,
c;for(b=0;b<a.length;b++){c=a[b];if(this.canPlayType(c.type)){this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(c.src));this.src=mejs.Utility.absolutizeUrl(a);break}}}},setCurrentTime:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"||this.pluginType=="vimeo"?this.pluginApi.seekTo(a):this.pluginApi.setCurrentTime(a);this.currentTime=a}},setVolume:function(a){if(this.pluginApi!=null){this.pluginType=="youtube"?this.pluginApi.setVolume(a*100):this.pluginApi.setVolume(a);this.volume=a}},
setMuted:function(a){if(this.pluginApi!=null){if(this.pluginType=="youtube"){a?this.pluginApi.mute():this.pluginApi.unMute();this.muted=a;this.dispatchEvent("volumechange")}else this.pluginApi.setMuted(a);this.muted=a}},setVideoSize:function(a,b){if(this.pluginElement&&this.pluginElement.style){this.pluginElement.style.width=a+"px";this.pluginElement.style.height=b+"px"}this.pluginApi!=null&&this.pluginApi.setVideoSize&&this.pluginApi.setVideoSize(a,b)},setFullscreen:function(a){this.pluginApi!=null&&
this.pluginApi.setFullscreen&&this.pluginApi.setFullscreen(a)},enterFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(true)},exitFullScreen:function(){this.pluginApi!=null&&this.pluginApi.setFullscreen&&this.setFullscreen(false)},addEventListener:function(a,b){this.events[a]=this.events[a]||[];this.events[a].push(b)},removeEventListener:function(a,b){if(!a){this.events={};return true}var c=this.events[a];if(!c)return true;if(!b){this.events[a]=[];return true}for(var d=
0;d<c.length;d++)if(c[d]===b){this.events[a].splice(d,1);return true}return false},dispatchEvent:function(a){var b,c,d=this.events[a];if(d){c=Array.prototype.slice.call(arguments,1);for(b=0;b<d.length;b++)d[b].apply(null,c)}},hasAttribute:function(a){return a in this.attributes},removeAttribute:function(a){delete this.attributes[a]},getAttribute:function(a){if(this.hasAttribute(a))return this.attributes[a];return""},setAttribute:function(a,b){this.attributes[a]=b},remove:function(){mejs.Utility.removeSwf(this.pluginElement.id);
mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id)}};
mejs.MediaPluginBridge={pluginMediaElements:{},htmlMediaElements:{},registerPluginElement:function(a,b,c){this.pluginMediaElements[a]=b;this.htmlMediaElements[a]=c},unregisterPluginElement:function(a){delete this.pluginMediaElements[a];delete this.htmlMediaElements[a]},initPlugin:function(a){var b=this.pluginMediaElements[a],c=this.htmlMediaElements[a];if(b){switch(b.pluginType){case "flash":b.pluginElement=b.pluginApi=document.getElementById(a);break;case "silverlight":b.pluginElement=document.getElementById(b.id);
b.pluginApi=b.pluginElement.Content.MediaElementJS}b.pluginApi!=null&&b.success&&b.success(b,c)}},fireEvent:function(a,b,c){var d,e;if(a=this.pluginMediaElements[a]){b={type:b,target:a};for(d in c){a[d]=c[d];b[d]=c[d]}e=c.bufferedTime||0;b.target.buffered=b.buffered={start:function(){return 0},end:function(){return e},length:1};a.dispatchEvent(b.type,b)}}};
mejs.MediaElementDefaults={mode:"auto",plugins:["flash","silverlight","youtube","vimeo"],enablePluginDebug:false,httpsBasicAuthSite:false,type:"",pluginPath:mejs.Utility.getScriptPath(["mediaelement.js","mediaelement.min.js","mediaelement-and-player.js","mediaelement-and-player.min.js"]),flashName:"flashmediaelement.swf",flashStreamer:"",enablePluginSmoothing:false,enablePseudoStreaming:false,pseudoStreamingStartQueryParam:"start",silverlightName:"silverlightmediaelement.xap",defaultVideoWidth:480,
defaultVideoHeight:270,pluginWidth:-1,pluginHeight:-1,pluginVars:[],timerRate:250,startVolume:0.8,success:function(){},error:function(){}};mejs.MediaElement=function(a,b){return mejs.HtmlMediaElementShim.create(a,b)};
mejs.HtmlMediaElementShim={create:function(a,b){var c=mejs.MediaElementDefaults,d=typeof a=="string"?document.getElementById(a):a,e=d.tagName.toLowerCase(),g=e==="audio"||e==="video",f=g?d.getAttribute("src"):d.getAttribute("href");e=d.getAttribute("poster");var i=d.getAttribute("autoplay"),k=d.getAttribute("preload"),h=d.getAttribute("controls"),j;for(j in b)c[j]=b[j];f=typeof f=="undefined"||f===null||f==""?null:f;e=typeof e=="undefined"||e===null?"":e;k=typeof k=="undefined"||k===null||k==="false"?
"none":k;i=!(typeof i=="undefined"||i===null||i==="false");h=!(typeof h=="undefined"||h===null||h==="false");j=this.determinePlayback(d,c,mejs.MediaFeatures.supportsMediaTag,g,f);j.url=j.url!==null?mejs.Utility.absolutizeUrl(j.url):"";if(j.method=="native"){if(mejs.MediaFeatures.isBustedAndroid){d.src=j.url;d.addEventListener("click",function(){d.play()},false)}return this.updateNative(j,c,i,k)}else if(j.method!=="")return this.createPlugin(j,c,e,i,k,h);else{this.createErrorMessage(j,c,e);return this}},
determinePlayback:function(a,b,c,d,e){var g=[],f,i,k,h={method:"",url:"",htmlMediaElement:a,isVideo:a.tagName.toLowerCase()!="audio"},j;if(typeof b.type!="undefined"&&b.type!=="")if(typeof b.type=="string")g.push({type:b.type,url:e});else for(f=0;f<b.type.length;f++)g.push({type:b.type[f],url:e});else if(e!==null){k=this.formatType(e,a.getAttribute("type"));g.push({type:k,url:e})}else for(f=0;f<a.childNodes.length;f++){i=a.childNodes[f];if(i.nodeType==1&&i.tagName.toLowerCase()=="source"){e=i.getAttribute("src");
k=this.formatType(e,i.getAttribute("type"));i=i.getAttribute("media");if(!i||!window.matchMedia||window.matchMedia&&window.matchMedia(i).matches)g.push({type:k,url:e})}}if(!d&&g.length>0&&g[0].url!==null&&this.getTypeFromFile(g[0].url).indexOf("audio")>-1)h.isVideo=false;if(mejs.MediaFeatures.isBustedAndroid)a.canPlayType=function(m){return m.match(/video\/(mp4|m4v)/gi)!==null?"maybe":""};if(mejs.MediaFeatures.isChromium)a.canPlayType=function(m){return m.match(/video\/(webm|ogv|ogg)/gi)!==null?"maybe":
""};if(c&&(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="native")&&!(mejs.MediaFeatures.isBustedNativeHTTPS&&b.httpsBasicAuthSite===true)){if(!d){f=document.createElement(h.isVideo?"video":"audio");a.parentNode.insertBefore(f,a);a.style.display="none";h.htmlMediaElement=a=f}for(f=0;f<g.length;f++)if(g[f].type=="video/m3u8"||a.canPlayType(g[f].type).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/mp3/,"mpeg")).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/m4a/,"mp4")).replace(/no/,
"")!==""){h.method="native";h.url=g[f].url;break}if(h.method==="native"){if(h.url!==null)a.src=h.url;if(b.mode!=="auto_plugin")return h}}if(b.mode==="auto"||b.mode==="auto_plugin"||b.mode==="shim")for(f=0;f<g.length;f++){k=g[f].type;for(a=0;a<b.plugins.length;a++){e=b.plugins[a];i=mejs.plugins[e];for(c=0;c<i.length;c++){j=i[c];if(j.version==null||mejs.PluginDetector.hasPluginVersion(e,j.version))for(d=0;d<j.types.length;d++)if(k==j.types[d]){h.method=e;h.url=g[f].url;return h}}}}if(b.mode==="auto_plugin"&&
h.method==="native")return h;if(h.method===""&&g.length>0)h.url=g[0].url;return h},formatType:function(a,b){return a&&!b?this.getTypeFromFile(a):b&&~b.indexOf(";")?b.substr(0,b.indexOf(";")):b},getTypeFromFile:function(a){a=a.split("?")[0];a=a.substring(a.lastIndexOf(".")+1).toLowerCase();return(/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(a)?"video":"audio")+"/"+this.getTypeFromExtension(a)},getTypeFromExtension:function(a){switch(a){case "mp4":case "m4v":case "m4a":return"mp4";case "webm":case "webma":case "webmv":return"webm";
case "ogg":case "oga":case "ogv":return"ogg";default:return a}},createErrorMessage:function(a,b,c){var d=a.htmlMediaElement,e=document.createElement("div");e.className="me-cannotplay";try{e.style.width=d.width+"px";e.style.height=d.height+"px"}catch(g){}e.innerHTML=b.customError?b.customError:c!==""?'<a href="'+a.url+'"><img src="'+c+'" width="100%" height="100%" /></a>':'<a href="'+a.url+'"><span>'+mejs.i18n.t("Download File")+"</span></a>";d.parentNode.insertBefore(e,d);d.style.display="none";b.error(d)},
createPlugin:function(a,b,c,d,e,g){c=a.htmlMediaElement;var f=1,i=1,k="me_"+a.method+"_"+mejs.meIndex++,h=new mejs.PluginMediaElement(k,a.method,a.url),j=document.createElement("div"),m;h.tagName=c.tagName;for(m=0;m<c.attributes.length;m++){var q=c.attributes[m];q.specified==true&&h.setAttribute(q.name,q.value)}for(m=c.parentNode;m!==null&&m.tagName.toLowerCase()!=="body"&&m.parentNode!=null;){if(m.parentNode.tagName.toLowerCase()==="p"){m.parentNode.parentNode.insertBefore(m,m.parentNode);break}m=
m.parentNode}if(a.isVideo){f=b.pluginWidth>0?b.pluginWidth:b.videoWidth>0?b.videoWidth:c.getAttribute("width")!==null?c.getAttribute("width"):b.defaultVideoWidth;i=b.pluginHeight>0?b.pluginHeight:b.videoHeight>0?b.videoHeight:c.getAttribute("height")!==null?c.getAttribute("height"):b.defaultVideoHeight;f=mejs.Utility.encodeUrl(f);i=mejs.Utility.encodeUrl(i)}else if(b.enablePluginDebug){f=320;i=240}h.success=b.success;mejs.MediaPluginBridge.registerPluginElement(k,h,c);j.className="me-plugin";j.id=
k+"_container";a.isVideo?c.parentNode.insertBefore(j,c):document.body.insertBefore(j,document.body.childNodes[0]);d=["id="+k,"isvideo="+(a.isVideo?"true":"false"),"autoplay="+(d?"true":"false"),"preload="+e,"width="+f,"startvolume="+b.startVolume,"timerrate="+b.timerRate,"flashstreamer="+b.flashStreamer,"height="+i,"pseudostreamstart="+b.pseudoStreamingStartQueryParam];if(a.url!==null)a.method=="flash"?d.push("file="+mejs.Utility.encodeUrl(a.url)):d.push("file="+a.url);b.enablePluginDebug&&d.push("debug=true");
b.enablePluginSmoothing&&d.push("smoothing=true");b.enablePseudoStreaming&&d.push("pseudostreaming=true");g&&d.push("controls=true");if(b.pluginVars)d=d.concat(b.pluginVars);switch(a.method){case "silverlight":j.innerHTML='<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="'+k+'" name="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="initParams" value="'+d.join(",")+'" /><param name="windowless" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.0.0" /><param name="autoUpgrade" value="true" /><param name="source" value="'+
b.pluginPath+b.silverlightName+'" /></object>';break;case "flash":if(mejs.MediaFeatures.isIE){a=document.createElement("div");j.appendChild(a);a.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+k+'" width="'+f+'" height="'+i+'" class="mejs-shim"><param name="movie" value="'+b.pluginPath+b.flashName+"?x="+new Date+'" /><param name="flashvars" value="'+d.join("&amp;")+'" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="scale" value="default" /></object>'}else j.innerHTML=
'<embed id="'+k+'" name="'+k+'" play="true" loop="false" quality="high" bgcolor="#000000" wmode="transparent" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" src="'+b.pluginPath+b.flashName+'" flashvars="'+d.join("&")+'" width="'+f+'" height="'+i+'" scale="default"class="mejs-shim"></embed>';break;case "youtube":if(a.url.lastIndexOf("youtu.be")!=-1){a=a.url.substr(a.url.lastIndexOf("/")+1);if(a.indexOf("?")!=
-1)a=a.substr(0,a.indexOf("?"))}else a=a.url.substr(a.url.lastIndexOf("=")+1);youtubeSettings={container:j,containerId:j.id,pluginMediaElement:h,pluginId:k,videoId:a,height:i,width:f};mejs.PluginDetector.hasPluginVersion("flash",[10,0,0])?mejs.YouTubeApi.createFlash(youtubeSettings):mejs.YouTubeApi.enqueueIframe(youtubeSettings);break;case "vimeo":b=k+"_player";h.vimeoid=a.url.substr(a.url.lastIndexOf("/")+1);j.innerHTML='<iframe src="//player.vimeo.com/video/'+h.vimeoid+"?api=1&portrait=0&byline=0&title=0&player_id="+
b+'" width="'+f+'" height="'+i+'" frameborder="0" class="mejs-shim" id="'+b+'"></iframe>';if(typeof $f=="function"){var l=$f(j.childNodes[0]);l.addEvent("ready",function(){function o(n,p,r,s){n={type:r,target:p};if(r=="timeupdate"){p.currentTime=n.currentTime=s.seconds;p.duration=n.duration=s.duration}p.dispatchEvent(n.type,n)}$.extend(l,{playVideo:function(){l.api("play")},stopVideo:function(){l.api("unload")},pauseVideo:function(){l.api("pause")},seekTo:function(n){l.api("seekTo",n)},setVolume:function(n){l.api("setVolume",
n)},setMuted:function(n){if(n){l.lastVolume=l.api("getVolume");l.api("setVolume",0)}else{l.api("setVolume",l.lastVolume);delete l.lastVolume}}});l.addEvent("play",function(){o(l,h,"play");o(l,h,"playing")});l.addEvent("pause",function(){o(l,h,"pause")});l.addEvent("finish",function(){o(l,h,"ended")});l.addEvent("playProgress",function(n){o(l,h,"timeupdate",n)});h.pluginElement=j;h.pluginApi=l;mejs.MediaPluginBridge.initPlugin(k)})}else console.warn("You need to include froogaloop for vimeo to work")}c.style.display=
"none";c.removeAttribute("autoplay");return h},updateNative:function(a,b){var c=a.htmlMediaElement,d;for(d in mejs.HtmlMediaElement)c[d]=mejs.HtmlMediaElement[d];b.success(c,c);return c}};
mejs.YouTubeApi={isIframeStarted:false,isIframeLoaded:false,loadIframeApi:function(){if(!this.isIframeStarted){var a=document.createElement("script");a.src="//www.youtube.com/player_api";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b);this.isIframeStarted=true}},iframeQueue:[],enqueueIframe:function(a){if(this.isLoaded)this.createIframe(a);else{this.loadIframeApi();this.iframeQueue.push(a)}},createIframe:function(a){var b=a.pluginMediaElement,c=new YT.Player(a.containerId,
{height:a.height,width:a.width,videoId:a.videoId,playerVars:{controls:0},events:{onReady:function(){a.pluginMediaElement.pluginApi=c;mejs.MediaPluginBridge.initPlugin(a.pluginId);setInterval(function(){mejs.YouTubeApi.createEvent(c,b,"timeupdate")},250)},onStateChange:function(d){mejs.YouTubeApi.handleStateChange(d.data,c,b)}}})},createEvent:function(a,b,c){c={type:c,target:b};if(a&&a.getDuration){b.currentTime=c.currentTime=a.getCurrentTime();b.duration=c.duration=a.getDuration();c.paused=b.paused;
c.ended=b.ended;c.muted=a.isMuted();c.volume=a.getVolume()/100;c.bytesTotal=a.getVideoBytesTotal();c.bufferedBytes=a.getVideoBytesLoaded();var d=c.bufferedBytes/c.bytesTotal*c.duration;c.target.buffered=c.buffered={start:function(){return 0},end:function(){return d},length:1}}b.dispatchEvent(c.type,c)},iFrameReady:function(){for(this.isIframeLoaded=this.isLoaded=true;this.iframeQueue.length>0;)this.createIframe(this.iframeQueue.pop())},flashPlayers:{},createFlash:function(a){this.flashPlayers[a.pluginId]=
a;var b,c="//www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid="+a.pluginId+"&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0";if(mejs.MediaFeatures.isIE){b=document.createElement("div");a.container.appendChild(b);b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+a.pluginId+'" width="'+a.width+'" height="'+a.height+'" class="mejs-shim"><param name="movie" value="'+
c+'" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>'}else a.container.innerHTML='<object type="application/x-shockwave-flash" id="'+a.pluginId+'" data="'+c+'" width="'+a.width+'" height="'+a.height+'" style="visibility: visible; " class="mejs-shim"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object>'},flashReady:function(a){var b=this.flashPlayers[a],c=
document.getElementById(a),d=b.pluginMediaElement;d.pluginApi=d.pluginElement=c;mejs.MediaPluginBridge.initPlugin(a);c.cueVideoById(b.videoId);a=b.containerId+"_callback";window[a]=function(e){mejs.YouTubeApi.handleStateChange(e,c,d)};c.addEventListener("onStateChange",a);setInterval(function(){mejs.YouTubeApi.createEvent(c,d,"timeupdate")},250);mejs.YouTubeApi.createEvent(c,d,"canplay")},handleStateChange:function(a,b,c){switch(a){case -1:c.paused=true;c.ended=true;mejs.YouTubeApi.createEvent(b,
c,"loadedmetadata");break;case 0:c.paused=false;c.ended=true;mejs.YouTubeApi.createEvent(b,c,"ended");break;case 1:c.paused=false;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"play");mejs.YouTubeApi.createEvent(b,c,"playing");break;case 2:c.paused=true;c.ended=false;mejs.YouTubeApi.createEvent(b,c,"pause");break;case 3:mejs.YouTubeApi.createEvent(b,c,"progress")}}};function onYouTubePlayerAPIReady(){mejs.YouTubeApi.iFrameReady()}function onYouTubePlayerReady(a){mejs.YouTubeApi.flashReady(a)}
window.mejs=mejs;window.MediaElement=mejs.MediaElement;
(function(a,b){var c={locale:{language:"",strings:{}},methods:{}};c.getLanguage=function(){return(c.locale.language||window.navigator.userLanguage||window.navigator.language).substr(0,2).toLowerCase()};if(typeof mejsL10n!="undefined")c.locale.language=mejsL10n.language;c.methods.checkPlain=function(d){var e,g,f={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"};d=String(d);for(e in f)if(f.hasOwnProperty(e)){g=RegExp(e,"g");d=d.replace(g,f[e])}return d};c.methods.t=function(d,e){if(c.locale.strings&&
c.locale.strings[e.context]&&c.locale.strings[e.context][d])d=c.locale.strings[e.context][d];return c.methods.checkPlain(d)};c.t=function(d,e){if(typeof d==="string"&&d.length>0){var g=c.getLanguage();e=e||{context:g};return c.methods.t(d,e)}else throw{name:"InvalidArgumentException",message:"First argument is either not a string or empty."};};b.i18n=c})(document,mejs);(function(a){if(typeof mejsL10n!="undefined")a[mejsL10n.language]=mejsL10n.strings})(mejs.i18n.locale.strings);
(function(a){if(typeof a.de==="undefined")a.de={Fullscreen:"Vollbild","Go Fullscreen":"Vollbild an","Turn off Fullscreen":"Vollbild aus",Close:"Schlie\u00dfen"}})(mejs.i18n.locale.strings);(function(a){if(typeof a.zh==="undefined")a.zh={Fullscreen:"\u5168\u87a2\u5e55","Go Fullscreen":"\u5168\u5c4f\u6a21\u5f0f","Turn off Fullscreen":"\u9000\u51fa\u5168\u5c4f\u6a21\u5f0f",Close:"\u95dc\u9589"}})(mejs.i18n.locale.strings);

/*!
 * MediaElementPlayer
 * http://mediaelementjs.com/
 *
 * Creates a controller bar for HTML5 <video> add <audio> tags
 * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
 *
 * Copyright 2010-2013, John Dyer (http://j.hn/)
 * License: MIT
 *
 */if(typeof jQuery!="undefined")mejs.$=jQuery;else if(typeof $j!="undefined")mejs.$=$j;else if(typeof ender!="undefined")mejs.$=ender;
(function(f){mejs.MepDefaults={poster:"",showPosterWhenEnded:false,defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:30,defaultSeekBackwardInterval:function(a){return a.duration*0.05},defaultSeekForwardInterval:function(a){return a.duration*0.05},setDimensions:true,audioWidth:-1,audioHeight:-1,startVolume:0.8,loop:false,autoRewind:true,enableAutosize:true,alwaysShowHours:false,showTimecodeFrameCount:false,framesPerSecond:25,autosizeProgress:true,
alwaysShowControls:false,hideVideoControlsOnLoad:false,clickToPlayPause:true,iPadUseNativeControls:false,iPhoneUseNativeControls:false,AndroidUseNativeControls:false,features:["playpause","current","progress","duration","tracks","volume","fullscreen"],isVideo:true,enableKeyboard:true,pauseOtherPlayers:true,keyActions:[{keys:[32,179],action:function(a,b){b.paused||b.ended?a.play():a.pause()}},{keys:[38],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();
a.startControlsTimer()}b.setVolume(Math.min(b.volume+0.1,1))}},{keys:[40],action:function(a,b){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}b.setVolume(Math.max(b.volume-0.1,0))}},{keys:[37,227],action:function(a,b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.max(b.currentTime-a.options.defaultSeekBackwardInterval(b),0);b.setCurrentTime(c)}}},{keys:[39,228],action:function(a,
b){if(!isNaN(b.duration)&&b.duration>0){if(a.isVideo){a.showControls();a.startControlsTimer()}var c=Math.min(b.currentTime+a.options.defaultSeekForwardInterval(b),b.duration);b.setCurrentTime(c)}}},{keys:[70],action:function(a){if(typeof a.enterFullScreen!="undefined")a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{keys:[77],action:function(a){a.container.find(".mejs-volume-slider").css("display","block");if(a.isVideo){a.showControls();a.startControlsTimer()}a.media.muted?a.setMuted(false):
a.setMuted(true)}}]};mejs.mepIndex=0;mejs.players={};mejs.MediaElementPlayer=function(a,b){if(!(this instanceof mejs.MediaElementPlayer))return new mejs.MediaElementPlayer(a,b);this.$media=this.$node=f(a);this.node=this.media=this.$media[0];if(typeof this.node.player!="undefined")return this.node.player;else this.node.player=this;if(typeof b=="undefined")b=this.$node.data("mejsoptions");this.options=f.extend({},mejs.MepDefaults,b);this.id="mep_"+mejs.mepIndex++;mejs.players[this.id]=this;this.init();
return this};mejs.MediaElementPlayer.prototype={hasFocus:false,controlsAreVisible:true,init:function(){var a=this,b=mejs.MediaFeatures,c=f.extend(true,{},a.options,{success:function(d,g){a.meReady(d,g)},error:function(d){a.handleError(d)}}),e=a.media.tagName.toLowerCase();a.isDynamic=e!=="audio"&&e!=="video";a.isVideo=a.isDynamic?a.options.isVideo:e!=="audio"&&a.options.isVideo;if(b.isiPad&&a.options.iPadUseNativeControls||b.isiPhone&&a.options.iPhoneUseNativeControls){a.$media.attr("controls","controls");
b.isiPad&&a.media.getAttribute("autoplay")!==null&&a.play()}else if(!(b.isAndroid&&a.options.AndroidUseNativeControls)){a.$media.removeAttr("controls");a.container=f('<div id="'+a.id+'" class="mejs-container '+(mejs.MediaFeatures.svg?"svg":"no-svg")+'"><div class="mejs-inner"><div class="mejs-mediaelement"></div><div class="mejs-layers"></div><div class="mejs-controls"></div><div class="mejs-clear"></div></div></div>').addClass(a.$media[0].className).insertBefore(a.$media);a.container.addClass((b.isAndroid?
"mejs-android ":"")+(b.isiOS?"mejs-ios ":"")+(b.isiPad?"mejs-ipad ":"")+(b.isiPhone?"mejs-iphone ":"")+(a.isVideo?"mejs-video ":"mejs-audio "));if(b.isiOS){b=a.$media.clone();a.container.find(".mejs-mediaelement").append(b);a.$media.remove();a.$node=a.$media=b;a.node=a.media=b[0]}else a.container.find(".mejs-mediaelement").append(a.$media);a.controls=a.container.find(".mejs-controls");a.layers=a.container.find(".mejs-layers");b=a.isVideo?"video":"audio";e=b.substring(0,1).toUpperCase()+b.substring(1);
a.width=a.options[b+"Width"]>0||a.options[b+"Width"].toString().indexOf("%")>-1?a.options[b+"Width"]:a.media.style.width!==""&&a.media.style.width!==null?a.media.style.width:a.media.getAttribute("width")!==null?a.$media.attr("width"):a.options["default"+e+"Width"];a.height=a.options[b+"Height"]>0||a.options[b+"Height"].toString().indexOf("%")>-1?a.options[b+"Height"]:a.media.style.height!==""&&a.media.style.height!==null?a.media.style.height:a.$media[0].getAttribute("height")!==null?a.$media.attr("height"):
a.options["default"+e+"Height"];a.setPlayerSize(a.width,a.height);c.pluginWidth=a.width;c.pluginHeight=a.height}mejs.MediaElement(a.$media[0],c);typeof a.container!="undefined"&&a.controlsAreVisible&&a.container.trigger("controlsshown")},showControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!b.controlsAreVisible){if(a){b.controls.css("visibility","visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true;b.container.trigger("controlsshown")});b.container.find(".mejs-control").css("visibility",
"visible").stop(true,true).fadeIn(200,function(){b.controlsAreVisible=true})}else{b.controls.css("visibility","visible").css("display","block");b.container.find(".mejs-control").css("visibility","visible").css("display","block");b.controlsAreVisible=true;b.container.trigger("controlsshown")}b.setControlsSize()}},hideControls:function(a){var b=this;a=typeof a=="undefined"||a;if(!(!b.controlsAreVisible||b.options.alwaysShowControls))if(a){b.controls.stop(true,true).fadeOut(200,function(){f(this).css("visibility",
"hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")});b.container.find(".mejs-control").stop(true,true).fadeOut(200,function(){f(this).css("visibility","hidden").css("display","block")})}else{b.controls.css("visibility","hidden").css("display","block");b.container.find(".mejs-control").css("visibility","hidden").css("display","block");b.controlsAreVisible=false;b.container.trigger("controlshidden")}},controlsTimer:null,startControlsTimer:function(a){var b=
this;a=typeof a!="undefined"?a:1500;b.killControlsTimer("start");b.controlsTimer=setTimeout(function(){b.hideControls();b.killControlsTimer("hide")},a)},killControlsTimer:function(){if(this.controlsTimer!==null){clearTimeout(this.controlsTimer);delete this.controlsTimer;this.controlsTimer=null}},controlsEnabled:true,disableControls:function(){this.killControlsTimer();this.hideControls(false);this.controlsEnabled=false},enableControls:function(){this.showControls(false);this.controlsEnabled=true},
meReady:function(a,b){var c=this,e=mejs.MediaFeatures,d=b.getAttribute("autoplay");d=!(typeof d=="undefined"||d===null||d==="false");var g;if(!c.created){c.created=true;c.media=a;c.domNode=b;if(!(e.isAndroid&&c.options.AndroidUseNativeControls)&&!(e.isiPad&&c.options.iPadUseNativeControls)&&!(e.isiPhone&&c.options.iPhoneUseNativeControls)){c.buildposter(c,c.controls,c.layers,c.media);c.buildkeyboard(c,c.controls,c.layers,c.media);c.buildoverlays(c,c.controls,c.layers,c.media);c.findTracks();for(g in c.options.features){e=
c.options.features[g];if(c["build"+e])try{c["build"+e](c,c.controls,c.layers,c.media)}catch(k){}}c.container.trigger("controlsready");c.setPlayerSize(c.width,c.height);c.setControlsSize();if(c.isVideo){if(mejs.MediaFeatures.hasTouch)c.$media.bind("touchstart",function(){if(c.controlsAreVisible)c.hideControls(false);else c.controlsEnabled&&c.showControls(false)});else{c.clickToPlayPauseCallback=function(){if(c.options.clickToPlayPause)c.media.paused?c.play():c.pause()};c.media.addEventListener("click",
c.clickToPlayPauseCallback,false);c.container.bind("mouseenter mouseover",function(){if(c.controlsEnabled)if(!c.options.alwaysShowControls){c.killControlsTimer("enter");c.showControls();c.startControlsTimer(2500)}}).bind("mousemove",function(){if(c.controlsEnabled){c.controlsAreVisible||c.showControls();c.options.alwaysShowControls||c.startControlsTimer(2500)}}).bind("mouseleave",function(){c.controlsEnabled&&!c.media.paused&&!c.options.alwaysShowControls&&c.startControlsTimer(1E3)})}c.options.hideVideoControlsOnLoad&&
c.hideControls(false);d&&!c.options.alwaysShowControls&&c.hideControls();c.options.enableAutosize&&c.media.addEventListener("loadedmetadata",function(j){if(c.options.videoHeight<=0&&c.domNode.getAttribute("height")===null&&!isNaN(j.target.videoHeight)){c.setPlayerSize(j.target.videoWidth,j.target.videoHeight);c.setControlsSize();c.media.setVideoSize(j.target.videoWidth,j.target.videoHeight)}},false)}a.addEventListener("play",function(){for(var j in mejs.players){var m=mejs.players[j];m.id!=c.id&&
c.options.pauseOtherPlayers&&!m.paused&&!m.ended&&m.pause();m.hasFocus=false}c.hasFocus=true},false);c.media.addEventListener("ended",function(){if(c.options.autoRewind)try{c.media.setCurrentTime(0)}catch(j){}c.media.pause();c.setProgressRail&&c.setProgressRail();c.setCurrentRail&&c.setCurrentRail();if(c.options.loop)c.play();else!c.options.alwaysShowControls&&c.controlsEnabled&&c.showControls()},false);c.media.addEventListener("loadedmetadata",function(){c.updateDuration&&c.updateDuration();c.updateCurrent&&
c.updateCurrent();if(!c.isFullScreen){c.setPlayerSize(c.width,c.height);c.setControlsSize()}},false);setTimeout(function(){c.setPlayerSize(c.width,c.height);c.setControlsSize()},50);c.globalBind("resize",function(){c.isFullScreen||mejs.MediaFeatures.hasTrueNativeFullScreen&&document.webkitIsFullScreen||c.setPlayerSize(c.width,c.height);c.setControlsSize()});c.media.pluginType=="youtube"&&c.options.autoplay&&c.container.find(".mejs-overlay-play").hide()}d&&a.pluginType=="native"&&c.play();if(c.options.success)typeof c.options.success==
"string"?window[c.options.success](c.media,c.domNode,c):c.options.success(c.media,c.domNode,c)}},handleError:function(a){this.controls.hide();this.options.error&&this.options.error(a)},setPlayerSize:function(a,b){if(!this.options.setDimensions)return false;if(typeof a!="undefined")this.width=a;if(typeof b!="undefined")this.height=b;if(this.height.toString().indexOf("%")>0||this.$node.css("max-width")==="100%"||this.$node[0].currentStyle&&this.$node[0].currentStyle.maxWidth==="100%"){var c=this.isVideo?
this.media.videoWidth&&this.media.videoWidth>0?this.media.videoWidth:this.media.getAttribute("width")!==null?this.media.getAttribute("width"):this.options.defaultVideoWidth:this.options.defaultAudioWidth,e=this.isVideo?this.media.videoHeight&&this.media.videoHeight>0?this.media.videoHeight:this.media.getAttribute("height")!==null?this.media.getAttribute("height"):this.options.defaultVideoHeight:this.options.defaultAudioHeight,d=this.container.parent().closest(":visible").width(),g=this.container.parent().closest(":visible").height();
c=this.isVideo||!this.options.autosizeProgress?parseInt(d*e/c,10):e;if(isNaN(c)||g!=0&&c>g)c=g;if(this.container.parent()[0].tagName.toLowerCase()==="body"){d=f(window).width();c=f(window).height()}if(c!=0&&d!=0){this.container.width(d).height(c);this.$media.add(this.container.find(".mejs-shim")).width("100%").height("100%");this.isVideo&&this.media.setVideoSize&&this.media.setVideoSize(d,c);this.layers.children(".mejs-layer").width("100%").height("100%")}}else{this.container.width(this.width).height(this.height);
this.layers.children(".mejs-layer").width(this.width).height(this.height)}d=this.layers.find(".mejs-overlay-play");g=d.find(".mejs-overlay-button");d.height(this.container.height()-this.controls.height());g.css("margin-top","-"+(g.height()/2-this.controls.height()/2).toString()+"px")},setControlsSize:function(){var a=0,b=0,c=this.controls.find(".mejs-time-rail"),e=this.controls.find(".mejs-time-total");this.controls.find(".mejs-time-current");this.controls.find(".mejs-time-loaded");var d=c.siblings(),
g=d.last(),k=null;if(!(!this.container.is(":visible")||!c.length||!c.is(":visible"))){if(this.options&&!this.options.autosizeProgress)b=parseInt(c.css("width"));if(b===0||!b){d.each(function(){var j=f(this);if(j.css("position")!="absolute"&&j.is(":visible"))a+=f(this).outerWidth(true)});b=this.controls.width()-a-(c.outerWidth(true)-c.width())}do{c.width(b);e.width(b-(e.outerWidth(true)-e.width()));if(g.css("position")!="absolute"){k=g.position();b--}}while(k!=null&&k.top>0&&b>0);this.setProgressRail&&
this.setProgressRail();this.setCurrentRail&&this.setCurrentRail()}},buildposter:function(a,b,c,e){var d=f('<div class="mejs-poster mejs-layer"></div>').appendTo(c);b=a.$media.attr("poster");if(a.options.poster!=="")b=a.options.poster;b!==""&&b!=null?this.setPoster(b):d.hide();e.addEventListener("play",function(){d.hide()},false);a.options.showPosterWhenEnded&&a.options.autoRewind&&e.addEventListener("ended",function(){d.show()},false)},setPoster:function(a){var b=this.container.find(".mejs-poster"),
c=b.find("img");if(c.length==0)c=f('<img width="100%" height="100%" />').appendTo(b);c.attr("src",a);b.css({"background-image":"url("+a+")"})},buildoverlays:function(a,b,c,e){var d=this;if(a.isVideo){var g=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>').hide().appendTo(c),k=f('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>').hide().appendTo(c),j=f('<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>').appendTo(c).bind("click",
function(){d.options.clickToPlayPause&&e.paused&&e.play()});e.addEventListener("play",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("playing",function(){j.hide();g.hide();b.find(".mejs-time-buffering").hide();k.hide()},false);e.addEventListener("seeking",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("seeked",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("pause",function(){mejs.MediaFeatures.isiPhone||
j.show()},false);e.addEventListener("waiting",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("loadeddata",function(){g.show();b.find(".mejs-time-buffering").show()},false);e.addEventListener("canplay",function(){g.hide();b.find(".mejs-time-buffering").hide()},false);e.addEventListener("error",function(){g.hide();b.find(".mejs-time-buffering").hide();k.show();k.find("mejs-overlay-error").html("Error loading this resource")},false);e.addEventListener("keydown",
function(m){d.onkeydown(a,e,m)},false)}},buildkeyboard:function(a,b,c,e){var d=this;d.globalBind("keydown",function(g){return d.onkeydown(a,e,g)});d.globalBind("click",function(g){a.hasFocus=f(g.target).closest(".mejs-container").length!=0})},onkeydown:function(a,b,c){if(a.hasFocus&&a.options.enableKeyboard)for(var e=0,d=a.options.keyActions.length;e<d;e++)for(var g=a.options.keyActions[e],k=0,j=g.keys.length;k<j;k++)if(c.keyCode==g.keys[k]){typeof c.preventDefault=="function"&&c.preventDefault();
g.action(a,b,c.keyCode);return false}return true},findTracks:function(){var a=this,b=a.$media.find("track");a.tracks=[];b.each(function(c,e){e=f(e);a.tracks.push({srclang:e.attr("srclang")?e.attr("srclang").toLowerCase():"",src:e.attr("src"),kind:e.attr("kind"),label:e.attr("label")||"",entries:[],isLoaded:false})})},changeSkin:function(a){this.container[0].className="mejs-container "+a;this.setPlayerSize(this.width,this.height);this.setControlsSize()},play:function(){this.load();this.media.play()},
pause:function(){try{this.media.pause()}catch(a){}},load:function(){this.isLoaded||this.media.load();this.isLoaded=true},setMuted:function(a){this.media.setMuted(a)},setCurrentTime:function(a){this.media.setCurrentTime(a)},getCurrentTime:function(){return this.media.currentTime},setVolume:function(a){this.media.setVolume(a)},getVolume:function(){return this.media.volume},setSrc:function(a){this.media.setSrc(a)},remove:function(){var a,b;for(a in this.options.features){b=this.options.features[a];if(this["clean"+
b])try{this["clean"+b](this)}catch(c){}}if(this.isDynamic)this.$node.insertBefore(this.container);else{this.$media.prop("controls",true);this.$node.clone().insertBefore(this.container).show();this.$node.remove()}this.media.pluginType!=="native"&&this.media.remove();delete mejs.players[this.id];typeof this.container=="object"&&this.container.remove();this.globalUnbind();delete this.node.player}};(function(){function a(c,e){var d={d:[],w:[]};f.each((c||"").split(" "),function(g,k){var j=k+"."+e;if(j.indexOf(".")===
0){d.d.push(j);d.w.push(j)}else d[b.test(k)?"w":"d"].push(j)});d.d=d.d.join(" ");d.w=d.w.join(" ");return d}var b=/^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;mejs.MediaElementPlayer.prototype.globalBind=function(c,e,d){c=a(c,this.id);c.d&&f(document).bind(c.d,e,d);c.w&&f(window).bind(c.w,e,d)};mejs.MediaElementPlayer.prototype.globalUnbind=function(c,e){c=a(c,this.id);c.d&&f(document).unbind(c.d,e);c.w&&f(window).unbind(c.w,e)}})();
if(typeof f!="undefined"){f.fn.mediaelementplayer=function(a){a===false?this.each(function(){var b=f(this).data("mediaelementplayer");b&&b.remove();f(this).removeData("mediaelementplayer")}):this.each(function(){f(this).data("mediaelementplayer",new mejs.MediaElementPlayer(this,a))});return this};f(document).ready(function(){f(".mejs-player").mediaelementplayer()})}window.MediaElementPlayer=mejs.MediaElementPlayer})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{playpauseText:mejs.i18n.t("Play/Pause")});f.extend(MediaElementPlayer.prototype,{buildplaypause:function(a,b,c,e){var d=f('<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="'+this.id+'" title="'+this.options.playpauseText+'" aria-label="'+this.options.playpauseText+'"></button></div>').appendTo(b).click(function(g){g.preventDefault();e.paused?e.play():e.pause();return false});e.addEventListener("play",function(){d.removeClass("mejs-play").addClass("mejs-pause")},
false);e.addEventListener("playing",function(){d.removeClass("mejs-play").addClass("mejs-pause")},false);e.addEventListener("pause",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false);e.addEventListener("paused",function(){d.removeClass("mejs-pause").addClass("mejs-play")},false)}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{stopText:"Stop"});f.extend(MediaElementPlayer.prototype,{buildstop:function(a,b,c,e){f('<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="'+this.id+'" title="'+this.options.stopText+'" aria-label="'+this.options.stopText+'"></button></div>').appendTo(b).click(function(){e.paused||e.pause();if(e.currentTime>0){e.setCurrentTime(0);e.pause();b.find(".mejs-time-current").width("0px");b.find(".mejs-time-handle").css("left",
"0px");b.find(".mejs-time-float-current").html(mejs.Utility.secondsToTimeCode(0));b.find(".mejs-currenttime").html(mejs.Utility.secondsToTimeCode(0));c.find(".mejs-poster").show()}})}})})(mejs.$);
(function(f){f.extend(MediaElementPlayer.prototype,{buildprogress:function(a,b,c,e){f('<div class="mejs-time-rail"><span class="mejs-time-total"><span class="mejs-time-buffering"></span><span class="mejs-time-loaded"></span><span class="mejs-time-current"></span><span class="mejs-time-handle"></span><span class="mejs-time-float"><span class="mejs-time-float-current">00:00</span><span class="mejs-time-float-corner"></span></span></span></div>').appendTo(b);b.find(".mejs-time-buffering").hide();var d=
this,g=b.find(".mejs-time-total");c=b.find(".mejs-time-loaded");var k=b.find(".mejs-time-current"),j=b.find(".mejs-time-handle"),m=b.find(".mejs-time-float"),q=b.find(".mejs-time-float-current"),p=function(h){h=h.originalEvent.changedTouches?h.originalEvent.changedTouches[0].pageX:h.pageX;var l=g.offset(),r=g.outerWidth(true),n=0,o=n=0;if(e.duration){if(h<l.left)h=l.left;else if(h>r+l.left)h=r+l.left;o=h-l.left;n=o/r;n=n<=0.02?0:n*e.duration;t&&n!==e.currentTime&&e.setCurrentTime(n);if(!mejs.MediaFeatures.hasTouch){m.css("left",
o);q.html(mejs.Utility.secondsToTimeCode(n));m.show()}}},t=false;g.bind("mousedown touchstart",function(h){if(h.which===1||h.which===0){t=true;p(h);d.globalBind("mousemove.dur touchmove.dur",function(l){p(l)});d.globalBind("mouseup.dur touchend.dur",function(){t=false;m.hide();d.globalUnbind(".dur")});return false}}).bind("mouseenter",function(){d.globalBind("mousemove.dur",function(h){p(h)});mejs.MediaFeatures.hasTouch||m.show()}).bind("mouseleave",function(){if(!t){d.globalUnbind(".dur");m.hide()}});
e.addEventListener("progress",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);e.addEventListener("timeupdate",function(h){a.setProgressRail(h);a.setCurrentRail(h)},false);d.loaded=c;d.total=g;d.current=k;d.handle=j},setProgressRail:function(a){var b=a!=undefined?a.target:this.media,c=null;if(b&&b.buffered&&b.buffered.length>0&&b.buffered.end&&b.duration)c=b.buffered.end(0)/b.duration;else if(b&&b.bytesTotal!=undefined&&b.bytesTotal>0&&b.bufferedBytes!=undefined)c=b.bufferedBytes/b.bytesTotal;
else if(a&&a.lengthComputable&&a.total!=0)c=a.loaded/a.total;if(c!==null){c=Math.min(1,Math.max(0,c));this.loaded&&this.total&&this.loaded.width(this.total.width()*c)}},setCurrentRail:function(){if(this.media.currentTime!=undefined&&this.media.duration)if(this.total&&this.handle){var a=Math.round(this.total.width()*this.media.currentTime/this.media.duration),b=a-Math.round(this.handle.outerWidth(true)/2);this.current.width(a);this.handle.css("left",b)}}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{duration:-1,timeAndDurationSeparator:"<span> | </span>"});f.extend(MediaElementPlayer.prototype,{buildcurrent:function(a,b,c,e){f('<div class="mejs-time"><span class="mejs-currenttime">'+(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00")+"</span></div>").appendTo(b);this.currenttime=this.controls.find(".mejs-currenttime");e.addEventListener("timeupdate",function(){a.updateCurrent()},false)},buildduration:function(a,b,
c,e){if(b.children().last().find(".mejs-currenttime").length>0)f(this.options.timeAndDurationSeparator+'<span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span>").appendTo(b.find(".mejs-time"));else{b.find(".mejs-currenttime").parent().addClass("mejs-currenttime-container");
f('<div class="mejs-time mejs-duration-container"><span class="mejs-duration">'+(this.options.duration>0?mejs.Utility.secondsToTimeCode(this.options.duration,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25):(a.options.alwaysShowHours?"00:":"")+(a.options.showTimecodeFrameCount?"00:00:00":"00:00"))+"</span></div>").appendTo(b)}this.durationD=this.controls.find(".mejs-duration");e.addEventListener("timeupdate",function(){a.updateDuration()},
false)},updateCurrent:function(){if(this.currenttime)this.currenttime.html(mejs.Utility.secondsToTimeCode(this.media.currentTime,this.options.alwaysShowHours||this.media.duration>3600,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))},updateDuration:function(){this.container.toggleClass("mejs-long-video",this.media.duration>3600);if(this.durationD&&(this.options.duration>0||this.media.duration))this.durationD.html(mejs.Utility.secondsToTimeCode(this.options.duration>0?this.options.duration:
this.media.duration,this.options.alwaysShowHours,this.options.showTimecodeFrameCount,this.options.framesPerSecond||25))}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{muteText:mejs.i18n.t("Mute Toggle"),hideVolumeOnTouchDevices:true,audioVolume:"horizontal",videoVolume:"vertical"});f.extend(MediaElementPlayer.prototype,{buildvolume:function(a,b,c,e){if(!((mejs.MediaFeatures.isAndroid||mejs.MediaFeatures.isiOS)&&this.options.hideVolumeOnTouchDevices)){var d=this,g=d.isVideo?d.options.videoVolume:d.options.audioVolume,k=g=="horizontal"?f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+
d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button></div><div class="mejs-horizontal-volume-slider"><div class="mejs-horizontal-volume-total"></div><div class="mejs-horizontal-volume-current"></div><div class="mejs-horizontal-volume-handle"></div></div>').appendTo(b):f('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+d.id+'" title="'+d.options.muteText+'" aria-label="'+d.options.muteText+'"></button><div class="mejs-volume-slider"><div class="mejs-volume-total"></div><div class="mejs-volume-current"></div><div class="mejs-volume-handle"></div></div></div>').appendTo(b),
j=d.container.find(".mejs-volume-slider, .mejs-horizontal-volume-slider"),m=d.container.find(".mejs-volume-total, .mejs-horizontal-volume-total"),q=d.container.find(".mejs-volume-current, .mejs-horizontal-volume-current"),p=d.container.find(".mejs-volume-handle, .mejs-horizontal-volume-handle"),t=function(n,o){if(!j.is(":visible")&&typeof o=="undefined"){j.show();t(n,true);j.hide()}else{n=Math.max(0,n);n=Math.min(n,1);n==0?k.removeClass("mejs-mute").addClass("mejs-unmute"):k.removeClass("mejs-unmute").addClass("mejs-mute");
if(g=="vertical"){var s=m.height(),u=m.position(),v=s-s*n;p.css("top",Math.round(u.top+v-p.height()/2));q.height(s-v);q.css("top",u.top+v)}else{s=m.width();u=m.position();s=s*n;p.css("left",Math.round(u.left+s-p.width()/2));q.width(Math.round(s))}}},h=function(n){var o=null,s=m.offset();if(g=="vertical"){o=m.height();parseInt(m.css("top").replace(/px/,""),10);o=(o-(n.pageY-s.top))/o;if(s.top==0||s.left==0)return}else{o=m.width();o=(n.pageX-s.left)/o}o=Math.max(0,o);o=Math.min(o,1);t(o);o==0?e.setMuted(true):
e.setMuted(false);e.setVolume(o)},l=false,r=false;k.hover(function(){j.show();r=true},function(){r=false;!l&&g=="vertical"&&j.hide()});j.bind("mouseover",function(){r=true}).bind("mousedown",function(n){h(n);d.globalBind("mousemove.vol",function(o){h(o)});d.globalBind("mouseup.vol",function(){l=false;d.globalUnbind(".vol");!r&&g=="vertical"&&j.hide()});l=true;return false});k.find("button").click(function(){e.setMuted(!e.muted)});e.addEventListener("volumechange",function(){if(!l)if(e.muted){t(0);
k.removeClass("mejs-mute").addClass("mejs-unmute")}else{t(e.volume);k.removeClass("mejs-unmute").addClass("mejs-mute")}},false);if(d.container.is(":visible")){t(a.options.startVolume);a.options.startVolume===0&&e.setMuted(true);e.pluginType==="native"&&e.setVolume(a.options.startVolume)}}}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{usePluginFullScreen:true,newWindowCallback:function(){return""},fullscreenText:mejs.i18n.t("Fullscreen")});f.extend(MediaElementPlayer.prototype,{isFullScreen:false,isNativeFullScreen:false,isInIframe:false,buildfullscreen:function(a,b,c,e){if(a.isVideo){a.isInIframe=window.location!=window.parent.location;mejs.MediaFeatures.hasTrueNativeFullScreen&&a.globalBind(mejs.MediaFeatures.fullScreenEventName,function(){if(a.isFullScreen)if(mejs.MediaFeatures.isFullScreen()){a.isNativeFullScreen=
true;a.setControlsSize()}else{a.isNativeFullScreen=false;a.exitFullScreen()}});var d=this,g=f('<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="'+d.id+'" title="'+d.options.fullscreenText+'" aria-label="'+d.options.fullscreenText+'"></button></div>').appendTo(b);if(d.media.pluginType==="native"||!d.options.usePluginFullScreen&&!mejs.MediaFeatures.isFirefox)g.click(function(){mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||a.isFullScreen?
a.exitFullScreen():a.enterFullScreen()});else{var k=null;if(function(){var h=document.createElement("x"),l=document.documentElement,r=window.getComputedStyle;if(!("pointerEvents"in h.style))return false;h.style.pointerEvents="auto";h.style.pointerEvents="x";l.appendChild(h);r=r&&r(h,"").pointerEvents==="auto";l.removeChild(h);return!!r}()&&!mejs.MediaFeatures.isOpera){var j=false,m=function(){if(j){for(var h in q)q[h].hide();g.css("pointer-events","");d.controls.css("pointer-events","");d.media.removeEventListener("click",
d.clickToPlayPauseCallback);j=false}},q={};b=["top","left","right","bottom"];var p,t=function(){var h=g.offset().left-d.container.offset().left,l=g.offset().top-d.container.offset().top,r=g.outerWidth(true),n=g.outerHeight(true),o=d.container.width(),s=d.container.height();for(p in q)q[p].css({position:"absolute",top:0,left:0});q.top.width(o).height(l);q.left.width(h).height(n).css({top:l});q.right.width(o-h-r).height(n).css({top:l,left:h+r});q.bottom.width(o).height(s-n-l).css({top:l+n})};d.globalBind("resize",
function(){t()});p=0;for(c=b.length;p<c;p++)q[b[p]]=f('<div class="mejs-fullscreen-hover" />').appendTo(d.container).mouseover(m).hide();g.on("mouseover",function(){if(!d.isFullScreen){var h=g.offset(),l=a.container.offset();e.positionFullscreenButton(h.left-l.left,h.top-l.top,false);g.css("pointer-events","none");d.controls.css("pointer-events","none");d.media.addEventListener("click",d.clickToPlayPauseCallback);for(p in q)q[p].show();t();j=true}});e.addEventListener("fullscreenchange",function(){d.isFullScreen=
!d.isFullScreen;d.isFullScreen?d.media.removeEventListener("click",d.clickToPlayPauseCallback):d.media.addEventListener("click",d.clickToPlayPauseCallback);m()});d.globalBind("mousemove",function(h){if(j){var l=g.offset();if(h.pageY<l.top||h.pageY>l.top+g.outerHeight(true)||h.pageX<l.left||h.pageX>l.left+g.outerWidth(true)){g.css("pointer-events","");d.controls.css("pointer-events","");j=false}}})}else g.on("mouseover",function(){if(k!==null){clearTimeout(k);delete k}var h=g.offset(),l=a.container.offset();
e.positionFullscreenButton(h.left-l.left,h.top-l.top,true)}).on("mouseout",function(){if(k!==null){clearTimeout(k);delete k}k=setTimeout(function(){e.hideFullscreenButton()},1500)})}a.fullscreenBtn=g;d.globalBind("keydown",function(h){if((mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen()||d.isFullScreen)&&h.keyCode==27)a.exitFullScreen()})}},cleanfullscreen:function(a){a.exitFullScreen()},containerSizeTimeout:null,enterFullScreen:function(){var a=this;if(!(a.media.pluginType!==
"native"&&(mejs.MediaFeatures.isFirefox||a.options.usePluginFullScreen))){f(document.documentElement).addClass("mejs-fullscreen");normalHeight=a.container.height();normalWidth=a.container.width();if(a.media.pluginType==="native")if(mejs.MediaFeatures.hasTrueNativeFullScreen){mejs.MediaFeatures.requestFullScreen(a.container[0]);a.isInIframe&&setTimeout(function c(){if(a.isNativeFullScreen){var e=(window.devicePixelRatio||1)*f(window).width(),d=screen.width;Math.abs(d-e)>d*0.0020?a.exitFullScreen():
setTimeout(c,500)}},500)}else if(mejs.MediaFeatures.hasSemiNativeFullScreen){a.media.webkitEnterFullscreen();return}if(a.isInIframe){var b=a.options.newWindowCallback(this);if(b!=="")if(mejs.MediaFeatures.hasTrueNativeFullScreen)setTimeout(function(){if(!a.isNativeFullScreen){a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no")}},250);else{a.pause();window.open(b,a.id,"top=0,left=0,width="+screen.availWidth+
",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no");return}}a.container.addClass("mejs-container-fullscreen").width("100%").height("100%");a.containerSizeTimeout=setTimeout(function(){a.container.css({width:"100%",height:"100%"});a.setControlsSize()},500);if(a.media.pluginType==="native")a.$media.width("100%").height("100%");else{a.container.find(".mejs-shim").width("100%").height("100%");a.media.setVideoSize(f(window).width(),f(window).height())}a.layers.children("div").width("100%").height("100%");
a.fullscreenBtn&&a.fullscreenBtn.removeClass("mejs-fullscreen").addClass("mejs-unfullscreen");a.setControlsSize();a.isFullScreen=true;a.container.find(".mejs-captions-text").css("font-size",screen.width/a.width*1*100+"%");a.container.find(".mejs-captions-position").css("bottom","45px")}},exitFullScreen:function(){clearTimeout(this.containerSizeTimeout);if(this.media.pluginType!=="native"&&mejs.MediaFeatures.isFirefox)this.media.setFullscreen(false);else{if(mejs.MediaFeatures.hasTrueNativeFullScreen&&
(mejs.MediaFeatures.isFullScreen()||this.isFullScreen))mejs.MediaFeatures.cancelFullScreen();f(document.documentElement).removeClass("mejs-fullscreen");this.container.removeClass("mejs-container-fullscreen").width(normalWidth).height(normalHeight);if(this.media.pluginType==="native")this.$media.width(normalWidth).height(normalHeight);else{this.container.find(".mejs-shim").width(normalWidth).height(normalHeight);this.media.setVideoSize(normalWidth,normalHeight)}this.layers.children("div").width(normalWidth).height(normalHeight);
this.fullscreenBtn.removeClass("mejs-unfullscreen").addClass("mejs-fullscreen");this.setControlsSize();this.isFullScreen=false;this.container.find(".mejs-captions-text").css("font-size","");this.container.find(".mejs-captions-position").css("bottom","")}}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{speeds:["1.50","1.25","1.00","0.75"],defaultSpeed:"1.00"});f.extend(MediaElementPlayer.prototype,{buildspeed:function(a,b,c,e){if(this.media.pluginType=="native"){c='<div class="mejs-button mejs-speed-button"><button type="button">'+this.options.defaultSpeed+'x</button><div class="mejs-speed-selector"><ul>';var d;f.inArray(this.options.defaultSpeed,this.options.speeds)===-1&&this.options.speeds.push(this.options.defaultSpeed);this.options.speeds.sort(function(g,
k){return parseFloat(k)-parseFloat(g)});for(d=0;d<this.options.speeds.length;d++){c+='<li><input type="radio" name="speed" value="'+this.options.speeds[d]+'" id="'+this.options.speeds[d]+'" ';if(this.options.speeds[d]==this.options.defaultSpeed){c+="checked=true ";c+='/><label for="'+this.options.speeds[d]+'" class="mejs-speed-selected">'+this.options.speeds[d]+"x</label></li>"}else c+='/><label for="'+this.options.speeds[d]+'">'+this.options.speeds[d]+"x</label></li>"}c+="</ul></div></div>";a.speedButton=
f(c).appendTo(b);a.playbackspeed=this.options.defaultSpeed;a.speedButton.on("click","input[type=radio]",function(){a.playbackspeed=f(this).attr("value");e.playbackRate=parseFloat(a.playbackspeed);a.speedButton.find("button").text(a.playbackspeed+"x");a.speedButton.find(".mejs-speed-selected").removeClass("mejs-speed-selected");a.speedButton.find("input[type=radio]:checked").next().addClass("mejs-speed-selected")});b=a.speedButton.find(".mejs-speed-selector");b.height(this.speedButton.find(".mejs-speed-selector ul").outerHeight(true)+
a.speedButton.find(".mejs-speed-translations").outerHeight(true));b.css("top",-1*b.height()+"px")}}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{startLanguage:"",tracksText:mejs.i18n.t("Captions/Subtitles"),hideCaptionsButtonWhenEmpty:true,toggleCaptionsButtonWhenOnlyOne:false,slidesSelector:""});f.extend(MediaElementPlayer.prototype,{hasChapters:false,buildtracks:function(a,b,c,e){if(a.tracks.length!==0){var d;if(this.domNode.textTracks)for(d=this.domNode.textTracks.length-1;d>=0;d--)this.domNode.textTracks[d].mode="hidden";a.chapters=f('<div class="mejs-chapters mejs-layer"></div>').prependTo(c).hide();
a.captions=f('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>').prependTo(c).hide();a.captionsText=a.captions.find(".mejs-captions-text");a.captionsButton=f('<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="'+this.id+'" title="'+this.options.tracksText+'" aria-label="'+this.options.tracksText+'"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="'+
a.id+'_captions" id="'+a.id+'_captions_none" value="none" checked="checked" /><label for="'+a.id+'_captions_none">'+mejs.i18n.t("None")+"</label></li></ul></div></div>").appendTo(b);for(d=b=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&b++;if(this.options.toggleCaptionsButtonWhenOnlyOne&&b==1)a.captionsButton.on("click",function(){lang=a.selectedTrack===null?a.tracks[0].srclang:"none";a.setTrack(lang)});else{a.captionsButton.on("mouseenter focusin",function(){f(this).find(".mejs-captions-selector").css("visibility",
"visible")}).on("click","input[type=radio]",function(){lang=this.value;a.setTrack(lang)});a.captionsButton.on("mouseleave focusout",function(){f(this).find(".mejs-captions-selector").css("visibility","hidden")})}a.options.alwaysShowControls?a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover"):a.container.bind("controlsshown",function(){a.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}).bind("controlshidden",function(){e.paused||a.container.find(".mejs-captions-position").removeClass("mejs-captions-position-hover")});
a.trackToLoad=-1;a.selectedTrack=null;a.isLoadingTrack=false;for(d=0;d<a.tracks.length;d++)a.tracks[d].kind=="subtitles"&&a.addTrackButton(a.tracks[d].srclang,a.tracks[d].label);a.loadNextTrack();e.addEventListener("timeupdate",function(){a.displayCaptions()},false);if(a.options.slidesSelector!==""){a.slidesContainer=f(a.options.slidesSelector);e.addEventListener("timeupdate",function(){a.displaySlides()},false)}e.addEventListener("loadedmetadata",function(){a.displayChapters()},false);a.container.hover(function(){if(a.hasChapters){a.chapters.css("visibility",
"visible");a.chapters.fadeIn(200).height(a.chapters.find(".mejs-chapter").outerHeight())}},function(){a.hasChapters&&!e.paused&&a.chapters.fadeOut(200,function(){f(this).css("visibility","hidden");f(this).css("display","block")})});a.node.getAttribute("autoplay")!==null&&a.chapters.css("visibility","hidden")}},setTrack:function(a){var b;if(a=="none"){this.selectedTrack=null;this.captionsButton.removeClass("mejs-captions-enabled")}else for(b=0;b<this.tracks.length;b++)if(this.tracks[b].srclang==a){this.selectedTrack===
null&&this.captionsButton.addClass("mejs-captions-enabled");this.selectedTrack=this.tracks[b];this.captions.attr("lang",this.selectedTrack.srclang);this.displayCaptions();break}},loadNextTrack:function(){this.trackToLoad++;if(this.trackToLoad<this.tracks.length){this.isLoadingTrack=true;this.loadTrack(this.trackToLoad)}else{this.isLoadingTrack=false;this.checkForTracks()}},loadTrack:function(a){var b=this,c=b.tracks[a];f.ajax({url:c.src,dataType:"text",success:function(e){c.entries=typeof e=="string"&&
/<tt\s+xml/ig.exec(e)?mejs.TrackFormatParser.dfxp.parse(e):mejs.TrackFormatParser.webvtt.parse(e);c.isLoaded=true;b.enableTrackButton(c.srclang,c.label);b.loadNextTrack();c.kind=="chapters"&&b.media.addEventListener("play",function(){b.media.duration>0&&b.displayChapters(c)},false);c.kind=="slides"&&b.setupSlides(c)},error:function(){b.loadNextTrack()}})},enableTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("input[value="+a+"]").prop("disabled",false).siblings("label").html(b);
this.options.startLanguage==a&&f("#"+this.id+"_captions_"+a).prop("checked",true).trigger("click");this.adjustLanguageBox()},addTrackButton:function(a,b){if(b==="")b=mejs.language.codes[a]||a;this.captionsButton.find("ul").append(f('<li><input type="radio" name="'+this.id+'_captions" id="'+this.id+"_captions_"+a+'" value="'+a+'" disabled="disabled" /><label for="'+this.id+"_captions_"+a+'">'+b+" (loading)</label></li>"));this.adjustLanguageBox();this.container.find(".mejs-captions-translations option[value="+
a+"]").remove()},adjustLanguageBox:function(){this.captionsButton.find(".mejs-captions-selector").height(this.captionsButton.find(".mejs-captions-selector ul").outerHeight(true)+this.captionsButton.find(".mejs-captions-translations").outerHeight(true))},checkForTracks:function(){var a=false;if(this.options.hideCaptionsButtonWhenEmpty){for(i=0;i<this.tracks.length;i++)if(this.tracks[i].kind=="subtitles"){a=true;break}if(!a){this.captionsButton.hide();this.setControlsSize()}}},displayCaptions:function(){if(typeof this.tracks!=
"undefined"){var a,b=this.selectedTrack;if(b!==null&&b.isLoaded)for(a=0;a<b.entries.times.length;a++)if(this.media.currentTime>=b.entries.times[a].start&&this.media.currentTime<=b.entries.times[a].stop){this.captionsText.html(b.entries.text[a]).attr("class","mejs-captions-text "+(b.entries.times[a].identifier||""));this.captions.show().height(0);return}this.captions.hide()}},setupSlides:function(a){this.slides=a;this.slides.entries.imgs=[this.slides.entries.text.length];this.showSlide(0)},showSlide:function(a){if(!(typeof this.tracks==
"undefined"||typeof this.slidesContainer=="undefined")){var b=this,c=b.slides.entries.text[a],e=b.slides.entries.imgs[a];if(typeof e=="undefined"||typeof e.fadeIn=="undefined")b.slides.entries.imgs[a]=e=f('<img src="'+c+'">').on("load",function(){e.appendTo(b.slidesContainer).hide().fadeIn().siblings(":visible").fadeOut()});else!e.is(":visible")&&!e.is(":animated")&&e.fadeIn().siblings(":visible").fadeOut()}},displaySlides:function(){if(typeof this.slides!="undefined"){var a=this.slides,b;for(b=0;b<
a.entries.times.length;b++)if(this.media.currentTime>=a.entries.times[b].start&&this.media.currentTime<=a.entries.times[b].stop){this.showSlide(b);break}}},displayChapters:function(){var a;for(a=0;a<this.tracks.length;a++)if(this.tracks[a].kind=="chapters"&&this.tracks[a].isLoaded){this.drawChapters(this.tracks[a]);this.hasChapters=true;break}},drawChapters:function(a){var b=this,c,e,d=e=0;b.chapters.empty();for(c=0;c<a.entries.times.length;c++){e=a.entries.times[c].stop-a.entries.times[c].start;
e=Math.floor(e/b.media.duration*100);if(e+d>100||c==a.entries.times.length-1&&e+d<100)e=100-d;b.chapters.append(f('<div class="mejs-chapter" rel="'+a.entries.times[c].start+'" style="left: '+d.toString()+"%;width: "+e.toString()+'%;"><div class="mejs-chapter-block'+(c==a.entries.times.length-1?" mejs-chapter-block-last":"")+'"><span class="ch-title">'+a.entries.text[c]+'</span><span class="ch-time">'+mejs.Utility.secondsToTimeCode(a.entries.times[c].start)+"&ndash;"+mejs.Utility.secondsToTimeCode(a.entries.times[c].stop)+
"</span></div></div>"));d+=e}b.chapters.find("div.mejs-chapter").click(function(){b.media.setCurrentTime(parseFloat(f(this).attr("rel")));b.media.paused&&b.media.play()});b.chapters.show()}});mejs.language={codes:{af:"Afrikaans",sq:"Albanian",ar:"Arabic",be:"Belarusian",bg:"Bulgarian",ca:"Catalan",zh:"Chinese","zh-cn":"Chinese Simplified","zh-tw":"Chinese Traditional",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch",en:"English",et:"Estonian",fl:"Filipino",fi:"Finnish",fr:"French",gl:"Galician",de:"German",
el:"Greek",ht:"Haitian Creole",iw:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",ga:"Irish",it:"Italian",ja:"Japanese",ko:"Korean",lv:"Latvian",lt:"Lithuanian",mk:"Macedonian",ms:"Malay",mt:"Maltese",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",sk:"Slovak",sl:"Slovenian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",th:"Thai",tr:"Turkish",uk:"Ukrainian",vi:"Vietnamese",cy:"Welsh",yi:"Yiddish"}};mejs.TrackFormatParser={webvtt:{pattern_timecode:/^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
parse:function(a){var b=0;a=mejs.TrackFormatParser.split2(a,/\r?\n/);for(var c={text:[],times:[]},e,d,g;b<a.length;b++){if((e=this.pattern_timecode.exec(a[b]))&&b<a.length){if(b-1>=0&&a[b-1]!=="")g=a[b-1];b++;d=a[b];for(b++;a[b]!==""&&b<a.length;){d=d+"\n"+a[b];b++}d=f.trim(d).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target='_blank'>$1</a>");c.text.push(d);c.times.push({identifier:g,start:mejs.Utility.convertSMPTEtoSeconds(e[1])===0?0.2:mejs.Utility.convertSMPTEtoSeconds(e[1]),
stop:mejs.Utility.convertSMPTEtoSeconds(e[3]),settings:e[5]})}g=""}return c}},dfxp:{parse:function(a){a=f(a).filter("tt");var b=0;b=a.children("div").eq(0);var c=b.find("p");b=a.find("#"+b.attr("style"));var e,d;a={text:[],times:[]};if(b.length){d=b.removeAttr("id").get(0).attributes;if(d.length){e={};for(b=0;b<d.length;b++)e[d[b].name.split(":")[1]]=d[b].value}}for(b=0;b<c.length;b++){var g;d={start:null,stop:null,style:null};if(c.eq(b).attr("begin"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("begin"));
if(!d.start&&c.eq(b-1).attr("end"))d.start=mejs.Utility.convertSMPTEtoSeconds(c.eq(b-1).attr("end"));if(c.eq(b).attr("end"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b).attr("end"));if(!d.stop&&c.eq(b+1).attr("begin"))d.stop=mejs.Utility.convertSMPTEtoSeconds(c.eq(b+1).attr("begin"));if(e){g="";for(var k in e)g+=k+":"+e[k]+";"}if(g)d.style=g;if(d.start===0)d.start=0.2;a.times.push(d);d=f.trim(c.eq(b).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,
"<a href='$1' target='_blank'>$1</a>");a.text.push(d);if(a.times.start===0)a.times.start=2}return a}},split2:function(a,b){return a.split(b)}};if("x\n\ny".split(/\n/gi).length!=3)mejs.TrackFormatParser.split2=function(a,b){var c=[],e="",d;for(d=0;d<a.length;d++){e+=a.substring(d,d+1);if(b.test(e)){c.push(e.replace(b,""));e=""}}c.push(e);return c}})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{contextMenuItems:[{render:function(a){if(typeof a.enterFullScreen=="undefined")return null;return a.isFullScreen?mejs.i18n.t("Turn off Fullscreen"):mejs.i18n.t("Go Fullscreen")},click:function(a){a.isFullScreen?a.exitFullScreen():a.enterFullScreen()}},{render:function(a){return a.media.muted?mejs.i18n.t("Unmute"):mejs.i18n.t("Mute")},click:function(a){a.media.muted?a.setMuted(false):a.setMuted(true)}},{isSeparator:true},{render:function(){return mejs.i18n.t("Download Video")},
click:function(a){window.location.href=a.media.currentSrc}}]});f.extend(MediaElementPlayer.prototype,{buildcontextmenu:function(a){a.contextMenu=f('<div class="mejs-contextmenu"></div>').appendTo(f("body")).hide();a.container.bind("contextmenu",function(b){if(a.isContextMenuEnabled){b.preventDefault();a.renderContextMenu(b.clientX-1,b.clientY-1);return false}});a.container.bind("click",function(){a.contextMenu.hide()});a.contextMenu.bind("mouseleave",function(){a.startContextMenuTimer()})},cleancontextmenu:function(a){a.contextMenu.remove()},
isContextMenuEnabled:true,enableContextMenu:function(){this.isContextMenuEnabled=true},disableContextMenu:function(){this.isContextMenuEnabled=false},contextMenuTimeout:null,startContextMenuTimer:function(){var a=this;a.killContextMenuTimer();a.contextMenuTimer=setTimeout(function(){a.hideContextMenu();a.killContextMenuTimer()},750)},killContextMenuTimer:function(){var a=this.contextMenuTimer;if(a!=null){clearTimeout(a);delete a}},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(a,
b){for(var c=this,e="",d=c.options.contextMenuItems,g=0,k=d.length;g<k;g++)if(d[g].isSeparator)e+='<div class="mejs-contextmenu-separator"></div>';else{var j=d[g].render(c);if(j!=null)e+='<div class="mejs-contextmenu-item" data-itemindex="'+g+'" id="element-'+Math.random()*1E6+'">'+j+"</div>"}c.contextMenu.empty().append(f(e)).css({top:b,left:a}).show();c.contextMenu.find(".mejs-contextmenu-item").each(function(){var m=f(this),q=parseInt(m.data("itemindex"),10),p=c.options.contextMenuItems[q];typeof p.show!=
"undefined"&&p.show(m,c);m.click(function(){typeof p.click!="undefined"&&p.click(c);c.contextMenu.hide()})});setTimeout(function(){c.killControlsTimer("rev3")},100)}})})(mejs.$);
(function(f){f.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")});f.extend(MediaElementPlayer.prototype,{buildpostroll:function(a,b,c){var e=this.container.find('link[rel="postroll"]').attr("href");if(typeof e!=="undefined"){a.postroll=f('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">'+this.options.postrollCloseText+'</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(c).hide();this.media.addEventListener("ended",
function(){f.ajax({dataType:"html",url:e,success:function(d){c.find(".mejs-postroll-layer-content").html(d)}});a.postroll.show()},false)}}})})(mejs.$);

	jQuery(window).ready(function(){
		jQuery('audio').mediaelementplayer();
	});

})(myjQuery);

function shortcodeAudioOnerror(event,audio)
{
	alert('Audio shortcode : file not found "'+audio.src+'"');
	console.warn('Loading "'+audio.src+'" failed :');
	console.log(event);
}

flashmediaelement.swf000060400000157334152455615120010753 0ustar00CWS|�x�̽y\��~�Y��}SD}7��Q�Aٜ���q``t��Y̊�-5�\2�DCPSK3�$�\�c�e�����-��������|>�����^����s�=��s�=�>�C�Dp��̈́t��gO�e5��U�Lm��l�C.e@��^-���9sf���8��">qĈ�	I�II��k�3���f[���@k+���F���y}��aO0�٪���h��j�&
e񬉭b�v[|b\"4d(��[�Uz�h}u��X�������*-e�g�k��r��V9*���ֱ�&v��`)e�L[�f��c�̆vAGw��֎+�T�W[-G�TMa�UhՎR��V�ZG;��͖�\�T�Sfe�vKg�����
������2we��a<�
&11�IJH̉A���Ѷ�8�d�]�"�>�(����G �0���?k����X�I՘��z%7��Hŭ��|x$))�a�u�k|�}^�_����$�A��D
�Qo"�dYE��I/�#��"(�&�N�*,�n�#<-,-�����]���\�Y�\�z��:���l��}Y��,���R�g|���=�;���~��������N%'��[��
�21dw�_�1ti��Pq�ݶv?�Z��a���xo-I���f���..2ZR����/�.�Jz���F�;����x�2�ٔ{�'l������������Eo�n��̛�3�W).�ǝ�1�w�w��Ӧ�z�/���I�V���]�m�ru�+�v_���I/?����Zx`އu���Y��Q7��O����рКA�&����x�1J>p��_�^����g����7���j��MK�Ǔ����1���3NiN�XV�a�Q�1�����Z�D47��˓������۾��e�����]��:���h"��zMl��gL^���0hҖ�� �6�KI�9�ם���O
�.����>x�O�GGjZ<������-Q�Y�,�	Ͳ�o�����O�^���񌌛���?*��㩗[[ޛ���s͛�]O�m!>zA�S�o�
>�i���E�����T4)'�^ϫ�ԋKĮ��;h۱)�o��j=�~�M�g���y�]�w�׭��Y������l�틞��D��.����[Z������������yS狗E
�i�jS���?6���?U����gl9��;	�4� �����o��D~m��	���ɧ��k�!��/��K�j]������o�E��X�D�l�}�Do�DN�"Z��J�k����hrn1��'B{��"�Y@�]�7@����xJ���QK����C����!0����bH�M�pW;�ȅ�z���y�^kg� ��}v��[�ּ��j�>��c�k�m[Αm+����롩�X|4�����.�k��A[�j���:"O�p�$��Β�뒂g���KM����6x���U[�;?��e�)_|9$�ߖ����h�J�j�A׈:�^���_.�J��ģyb����/��f�Y�a���7eKE-˽��/ڷN�.�kZ|3:��mB*iZID>5}�D�G|YCW�Qs��at�%M��ښ����}�~���r�X�o׏��4��nh�~��r�(Ǣ��'3��ϻU��A&�}?��6r���U'�ڋv@+G����s?�XO��/�ƺ�L{aE�[F�^�{��?@;�y՗��-��B"̴�42���G�
��A+��O��ZtYiB,oM�M���.�0��A�7�x��9�F6��
^U�2�_��ٱ��j�$��[o/�=�����}�C|��N����s4~JX5��wyON�|����ӿ��;��{.���Sodl�%Éo��~�/��yaﶽuVz*7�lm�3�%{}�-��镾�~_9��3�{kr\���Z��~��@`<?�1�|Β�
�|���A�ږ�s>%�b�|�ߊ��Wi�/���Ty�w�W{��c%"z�k�ՏH����E}�]�3%����5��D8s/}�v��q_U��7㢓FE����ޔ5�p�H�O%���
�<Ox��m��g'UMۺ}wk�nm �g�Z���O����쏄�5�Ķ����Ư^}���CZ>y�Z�-�[}z��]�z�(�Z�u��Sb�T�f���in|7���/:ik���Aۢ/�e~=x�sD&h&�������IDں�$�;��t�C��s�o�ǿy>�ū��/~�4���Dp����u/����z���a+�-9J
'�4MV��[�+S4�/	�o��Y6M�x��
Cu�^�h�K���d�li��Rɠ]
d��O�J�zb��ZՖ�1G�d�2��m�.	���������K*�'�t���!��\"��m��Q���X5���
���/��d�t3��-1��[���g�~7�I2��܍">_�NUʞ�Lj

8|n�E�?^Y4�o�;��	¤���?��h}��-���Ję_	�����%�.��r�gҾ��~�ɳ�����}��}l[\���K�����W�K��f�j��Ń�5|\��1�ԢK[�^"�����4_N�A���ןi�`ڮ�}Z�<�ccw�>��J��V݀ee�n��i������}c���۹ݩ<u�X�����i��!b�����:�i������`{�W�Q!~��E�bGF����%Lk�[w���x5��y�u�o�}y�!�����nR�
(Y-?ˤN%[^ʊS�j��x0�r��k�5g��9`ڛm��N%���A����_?�N%�H|y�E���`��|�
G�,K�����(yWEz�/��Y]޸sI�n_%��Tr�[S��4�Hxrp���=��5��)O�i_'��sK&�D.�7z�$=um��)��+�s�L�5|������#��/YK�-�֖����d�Ne��կDl}��[�FE��O(�^��x`����d�����3/D�v���I��Y﫲#v�$!�{0���u|+�0n�0��Y+�/_w�!>;KN񦼵�W;����S�OA������	��]�;���i"���qk�����D�R�4������-�Z=�Q\_��z�xG��vx��޳��6dWN�J�@��,y4	X@�2�c�9$�W@��U��d��Ipq)�oԾ"ZJ$a��SW^���UN�)b���]�Ǫ�$pϜ����}J[�{���As���{�Z����?�|p`~���H��qlP�ӧ�Х[I踨̭���x�[ϋZQSB��d�ѣ�m$:i��[��V���y�5��C�[��	�7�e���?�G�����~�����e+aa�.��Ґx��e"�9-���I&"�>JD����,"�C�ɳo��и5�ƭ��¯����40���nS����"�pVX�W]��|���+�/�a�맦���А�pBN����O�{&e^L]m�	��T���z�e�ѣW-��G>��?>��V��_�v����q�Ϫ��c�[O��E�7���Š�z���
^_L�B^��}�^v��D�j�riUŭH�7�Z���Sy��U�6�w;|~���9��W_Ӗ�WO<G�թ���6>2A�g�����g���w���W"=w�x��k"��8��o;q�e�褖+Y
�˾Q�Zt���҃�k���
�g�����
���z��\|9w*/g	�rO�J���.+�gJ*)�3"�8B�]s�ߧ՚WJږ��ƗY��cK��J��}=��O�w�o^l*���)f/#A�Y̭���	S�W5M&�!pk�m�*��o.�M�z�!D{���E���� �߲��o*�Y��U�0�a++�K3��&�D�y{����u:��$���ύV�h�b��H%���^Pf~Wx��P�V�d]\�(�n!������e��DX�	�!��&B�|����W���{�C���T2q����)#|O��V׋&}~\I͌��{�}���7�&‰7�nR��[J�2	o��i��c��V����i|;5�Nj&���l�:a��D� ׂZ̉�O�m�5֧-u�~��|��"C|�N�O�ɱs/{��p����=�s{�z��!��6z𱔤e�ω�@�ڲf��s$-~�[ڈ�7�Ȗ�ظ%�؍�/�ܾ�r����LYZ��x�7oL�㭬���z~���� ����ň��*�n��,����3��/yy!;�O�i�L��H�Gم��<�/*�Y���E�}�"�* )
M�R9�IT<pBjlѼVOV�+T��;��?��������$�Y�����80����h�}�+������������
�.]Z3��|0�����n^����ϒ�w�z�䋷�W�Lc�����9l��aϵ�o��m�ʏz~S3q�罶@�{��I�d��6�Ө?^DC�����m��[�ߍ�E�M��>y-dxE��#Z~����F���~a��c�{��D��͒/�aE4�dE��ݼ���{<|�N$ҵb��UtƑ��q?�K�Y�U�,��z�1���-�}�W���
��S��oo��{M��MT@�1}�����?U�Je�>B�2�oD��ySvo���钀�z��6�/���择DX�J��ғ��:�iN�x;���c-[�x,k&R��So�Ik0T�͒G�x�ڊHԓm�)���|Z4�;��'�j�EG�_�\��tp	.I%��+�?�ש�@����흝/�e}��t.&��*��i~�2�d��'�W�I�	S���3����m	��.}��(y��K/u�M��㗫o�2���Q�|��H��I�xO��� ����i�hwk
iܝ�}S����R����H�޷�W���F򃧒�ЊF��� m��}I��I��O���}R@��y�peX�3��s��k�Vv#�(
�*�j�$ �[-D���ɧ�wB�[�-��lޘ�]������\�3�����7G)��#�tR5q�����!C�J��;w���z����]��p�x�k[gp:�X���GnlX�veWd�†%ˇ���z�o��)f*�+�"!����o��(�M-s�d疬�L�[S��_$��R�rh_~�bټ�ƏMM�Oo��l=����s.�?5_���-�}'I��J���U?�����Sʑ!��&����}�J�b�2��[iᲅ��#w<mkR�_�۞�b�Ջ$��;������܂��s�'���&߭�X���<����P��YOR�?�r���%�&�O?	:�a��o�q��Ʌ���j2)t���|���
N%;R�J�,lZ���W����#Y�s��7����DX\�ɋ�.�j��ӈ�	��_���u٥���bK[p��h�V��
ij�ۦ����4�ġ��A��g�g�3"��8��֛�gk�};&��� ��Ҙ���&z���,�$ ><zY����/��?2oZ=���I[�҆&���x>5m|8M�ƍߐC�G�PO��6���2@;�k�_z?��'Eo�/F�0g�.�.�9T��H~dk������'��*~#�7zX�$���V�mi)�O^HR�gK�7�|�]���a?���������j�n��U�y��9�/%��>�~s)����%�Z��p)��5��y`\s�]��/^;oI˥w�/�ǡ���5ͤϢ?��w��{�	�dx�W���t0����hb���nTxHi|E1�<���Ԃ��jzm�})I&��YxK3��o�6��-�K��6�z��+��G���e�ޟ6�`bQ�T���W��/�~�/iʡ���Ҟ��>�$5�ɫ��4���h�?�k�<X����3���栟�&���b.�22���}����\;U4?C�؟=���͉C��};��)Ւ��f�������SH�@�Ӷ���M�<�SU�{��?�/3�_�+<F���s�,�15�ń=1�{�KB����ooL����l<��ʖ�ޠ�m)��=�]�]L��w�1)����_]�L�ݸ<{xxM����U�,G^ͻ7\��[V��<t���w>�V�}���������S������m/���f��Yz��z�vߪ[�z
jZ�B��nl�{#*��j��W:ƅ_�32X�H$�VOZF��+���e����ϝ�&�����e-Dz4Ȼ���<Ϟ���vn]��_�A}�'��%�^���o���2Zj����j5���<�6Cj�}bÕ}%���쩾׭ˣ�dN=�
͆�Y�;�}�x?�=�t��s�7�/ʹT3��=p7_�?{��.OC`J�V8�S��=�O�%y-����~�ϼ��Я_z�����ϩٷv�?_Ǭ�\���S���4����1���k�I��_��`��"&¬�D�դ��}���C6����~a�%6b���U/��ƽ��|�ף���]����ˇ�V�L~��c�w'�f��h䲵������s{��Qq�3���f�66*y�iv�ēi�M�����W�>�x6�O��:�w�r��J��ұ�w�?v��n�Η�+ �����]2��7.���5C�,�SW)��פ��<������]�A{��
"�z������BN�Z�����B�6-i��g8�j �^�H����-	$z!ge�o��B���5�\L<��=��/}y!	j�D
o�O~��7���R�&jw���Syۖ��f�;8B�'���Y�D��3ւ�%��|䛘�Hݸz�!�i9��M#CZ�x���gԒP��wWk�י$���yi���z^��5�!�p
�>�#*o�18^�Y"�3b�߇�	T~����w����q���Ĕ���k7�������S��Χk�����GB/;����EV쮾�?�ӿ���d�~���W��9�kϞ?v�y�kO�������-D&J,�q��^��0������y��z��
0#}�4~��+Ȯ��ɈS�Ҷ��{)����/�{^3[u��G�y4}|�|�
�
�o�{uP_�%��$�,��>/h_�j�C��:�bn��'O~����̛��Mq���r�Ge��_�_m<05��S�}EI__�ml��kӱ��E_y�΋��%���U���M��'�҇D�Hҗ�#��2�D�h2��ٔđx�@II&��2�#��"'#�(�BF�1$�d���	2�L&S��L%e�%&b&b%6� O���)�4i �=��d��nLw&�	gz2����D0��f#g�2}LY�M�d�d�T�/�Y3vҐ�ưư��{�2B�h-y�?J�G�[�:�ZB�hJ�Y�oALc� �?���{�>�Ƶ�� �����/���XJ�R1���/���.�7P|�1�K�b	�2>-]��q���[�3��L��n��t!`��"��� ݊�@��31]��������1݄i� ���;��x3B@[��z+�iHI��)�K��\�o!b W,��ď%ng�}Ri�P�8�6��Ci�P�8�6��Ci�P�8�6��Ci�P�8�6��Ci�P�8�6��Ci�P�8���a����ꠒ�A�E�Tf9��ȗc/4��d�Hĥ�Q=���C��P|��Iχ6�T���AT9)�H)DJ!R��n �a��� g	�K�r�(�{�c�z��Xմ�Ź`q\,h���c]#��yPH�EJр��,X˂�,P��TC�%d�5�'h]+j̊�٠VwƆi�:�ԁ-8�5��t
�g"�LL�A:��^��S�u�H�C������8�^$�R��;|�~,���Hy���{�7�R��;�4���i>m�i>��i�ѻ����t����Y~�Og��RD����R~�h9`���س	��Y�<��J��o���`=��7"6!n�<�[1͐Xw�]�uW`��,����[��WC����az����k1�H=�iEd�Z�k-���Z�}�E9�b_k�����Z�k=���Z�}�Ǿ�c_뱯���z�k=���y�Fha�
��i�8�&,m��b@���~M�Iq5��bz=�7#nA�y�͠�%�T*�^H��f�d3JBq	?�^# ��t+"CZQ�Vh�%@�{+�ފ��b��{+�ފ�S�5���{0�`9̀�����>��l{��m��E<��F�6�������Lq���`�M�����|ٝ%������~w��RJ3�_0"��He؉2�Dv�;Q��(���ŧ{
�F@ٝ&��[��{k�oC̀t\o�������6�p���6�h7ȳ��x�!�H�݃��ANJY�m�~_�;8�wp��$k�{�߽��{c��C��� �r��0��~�E�P�H�����܇m������^�C��#G<�x�,����Jx[;��� j� j� X�@���p��~�C���#=��u����!��C8_�p��|º���!��!��!��lⷁ6@�@��x���G<�x��Y�}����a��iˇ�����a���y�<�rA9���GP�#(�l��y[;���֎��GQΣ(�Q��(�y�<�rE9�����̝��2�q��8�s�9��Gy��<�Q��(�q����<�Q��(�q��8k'p�N���
x�!��'� �El������$�����I�4��
��u�:��<�?�_X
>����G�Ho��U|GwGwGwGwGwGw�:�}�Am���O 6�?�v�S��r%<���Zg��Y��,Jx%<u{1��;�/@��`������B
��>����H��EJb�A�f���iA�B��-aA��{}1��XL�ξ J/D��a�MX|?��HK��P�H%z0b����tb$R�!� %�O�Cp��0���PL�Bd����~ �
h�/b`H����(00�p��1�J���J�%�-� =�a�R� FVB$C��!�Gzb�	z#����`�}��>P7)��a�b?�ZqH�D�UD@��uwCo�P@:/����=$���8L�bh]?A$̦? v	�A�7I�^( ��Rz�6#q���f$��'�i@:���B_�O_������brF"�s��m��������JNӱ�0k���8�8v�A��C?��0����Y���ҋ��Fҙ��Q�̀�h\/�8G�h�h��h����A<�=g�b(RzR�ţUģR��q?9c����@ρ�T�Gd��t`��gxQHId$�=L�@��iHIGT"�$$�`�O�ġH�i9��(L�#=�J�@A����I��t� �?K�?��z�D}�Z���Iȟ��!�?q4b* � 
k�#f =11P0�}��p@��! U ���&�=LBL���1R�4L�#*3�s���`(h#��������P��ш
,Ml�H�t҃À	X�o���D@��a(�0lg�6euGaz4b*�111P0�b8��p�9#��ɑ"��`$r������s$�#q\#qvF����	�O�`�úr��d4�S3�a:1111@0
{�r�B�F��Szb" ��(��y�Z)8�)�G��A��/�FO2g|4�h�4��K���VG��$�1
��(1������<�1(��!G��R�
�)58�
�G��
,U��)PJ�@I(�{W`�
�Y��@��zK�'`:	qR�T�i��4�9E%�����;�H�C���wJ�6�Q���t�����~&�O��!�$ O"R�� e(�ôӣG#%1
)��ƴ� WPj��0�tD%b�@��S���D�+�2���!��K(�%ΔmF��9}�X���b���HO�>���b�0L�D�ш��
,��1p��<LG
���A6J����)�`(��0L
ƣ���@A�s �'��p@jϹ(g.�;)rDb:�yX7�����#=_@�R���RJ,�&��Gk�G����q���I�|A��!�q CG�=\��nL7��hug�Vwf�倳yV����.tg��H����7�1H��t��	�ڃ~��A\�<�J}����D�k�!�� �p��t�hB���]�9�N��k̕�R\+��=>y�n�h��]��d�;���Wܥ��/��R�0�oݩG���h+�c{5ٕjp�>��7��3�;)w�.mM�K�Jw�~�+5��F��p(�7��dC�r�I�
��R?{d`f�-���_�ƄP;� �'M���ϭM%��Z�{]5ˤ[��+~K�(L&Fe����kc�5�!�����V˽yY�S�ă<|��m���ȋ���)��?k����UR�����n=_K�I�[�
b����#��4���8)$R,$�DVK��Gy�GZg�;n��NO՝|?���$"`�/�.]`#VzB_7���Grss=��x��u��^Qm7G�A%�!��I�[}=��\�`�׳n�~=��_���v��	�Rq��lҗ���T;|����y�l�����3����iaB&Y"�b#g#���
%�?s��q��{�?5�{�)��m�����T�mOT���Yj���>?������A�dB�
�ѥ��%Pd$��_�=���ݎr@�C��koF\��1e�����U�0�gQ����{�>�2��'�_J�
�,:����INN���E�nN(&��]dc}u���$��[+��'��i0J?�P/n��2��=��?��T��M�<dP
�q�3h|8��}�S~��	2�pɳ�o���#�&;���G��#�޹�܁'�K/7MoJY�n�ɓ�|~lQnQ�7�t�ےS�=��yŠ�[��K��2vxQo����Y�=F��C�,�Q�N�x�s��v�YƉ�y��
$E��K\V����9kGF���bӐ����j8�˓LŻ���@��V�i؄���ؼ�w��yp�f=<?nM�M�![��^� wG]��S�g �m��|F��!DwQ�{��Dz�j�B��8��QՌ�d�0�DX�z�=��b�3�26%�Ec3΂LbBSf1Y�)��/�1�v;kUW�ˌ抔�����Lg�f$%F�NH�'$����_=<BH�����Jң��Un�ܶUR�y��Ꝼ�EM���͵�C���VPw�
�W���M�m�{ɩ]:�{1�^����s�\~�ݐW��%�?�
yJ�\y1�j��{t��2���?��5�*	렒���v��"��2O��R����j�U��^kGE<�`��ZZ�w�X]��n&�D�yD�ˠ��dӕV���rQ>�����������HI�⾤ڤ�C�jQ	,��X����r�Ymb���7����Z*��6��9���E��I09v���+#f���/w�L�2+˚�A:�`0���!����P^����aC��jͻG	E���$���D���9G�ƪ/�NE�XQ�Eo`
����,Mo%�Dq=���ۼ0#I�%��X;Y!�ߛ� a^$nm���Hz��_��ٮ����@����}S�J�Ъ=aw�I�9�h��&���-��[�Ul"�=�$�A��<���S,��{��`������Q���~ȿ��!�ׯ�{>���z�u�G�?m{=�v���*��YTͳ����+��O����
���{����~�s_^
Y�Sx�/�y���ig��T.r��]�_�~S8M�n�h�����K��ev��nC�X�~�����ߥ��8%M{�Y,&VobNJulŤ(�QU�Z�dzu��ՀD�LP�U�y��l��Zv؍&�$���*�V}��N�P'�tq5l����X},֊�*��1��d�g���
u.���X�8Ӫ���#p@?�L�����7TR8F�^�#5�<��6���do����h
�v��a����
+k�uٻ��r�zfPd�R��j�t"��sYPj�-�*�QfN�F_�u��ja��$�tef��y�=�b6�8��GZ�٭����5~\H� ��Ƃc>~�o��3��J��+XK�D�Bs&V���8S�2*Xa:�l�B�����v�΀�S[E�"D&lέ�5N�h�kב��Vg.k�Kr-5F6�d���!��$��v�G����&�Hg`Kb�ц�t5�Tg����Y/���\d4�+e\:��[���5�KM���b�W����&�e&k(09*��K��h���ۭ��-&Z�tj{h�˂�%:nXk����0X8}BG�u՝	j��k�+Ѓ:�ufp�5,��H������u�o.�Sgqثv�d��Z�D�idM]�+Ls���Lm��6�\ƻSO�J{��1��;��E�4M�K���n����@7���:���23��m�\
/��!�V*uz/]�����e���T�>�I:b/Շs�:�C��D���d�[����(������-�Ǚњ1��A�tW���ƬG��e֗ѩ�}�8��;��ˍ�hC׫@Nd�q)zۜK)�fs�2��
:V����򵡯�J�`��>e�l�t��B���m�e�Ll�R���_�����t��V��*��P6�{�\
��v˦��
p'܂����U[lF�r�	�p�bU�e`'ɰ�4{�ۅ�-Ko���e�gƇ�5�۳����r���b����}��N��AB�m\B�
��0
�"�Gm-��-!����x$��+�ڈ���2V�h��Ɵ����G��V�ŏ-@�fn��qTӿ��Ң?��l�i,T�t���O�ԡɅu\��NX�.�'���qy�1���
�X\ū�:q�];d�6Gy��!�d��$D�*2��
{���d�)<x�~��r��a#�KK�G2\?4I_�O(K<4y��!�$6q��T��T�d(3�<L�NN�ܲt�jX����>����f�:��͸��Eazz�.GAK0���#���E�3���j�l��C����EY���s,ݺ*�CAϮb�kϗ�>яH�d���N�LU���rg�UR�e�f�pY5�9}��Z���-��U۩�RW�XR
����n#�Y��<���`�N���a�i��r֚�7���2h�?�'��hOW:�Kg.���tC���[0D���`���	y�Y��X�G�!:��X�ڸ����#!����՜�u&4�pL�h��wmB�κg�IpϤ� ��ϙ��n�����lb�'D.�R���
̰h�F���Τ1, H\@�	S�X:\ҧ��|��C�=O�q�,�����q|[n��N���MϴZ�
8c���y����@��eB0\6Z��
@ͦCj'���F�����6�pW�ڹ�V��w]�,�M_�u�d��=��0P��+��t��gg$w��U@���Ro�^�QU-��R��N̢C�g��]/z(�����c�jw�!?�#�`�2�Ms���}u�0�R0~4�.�,�-4�w厑��b$02��U�U~�ЙL���GH.'�㱶۝ӹN������a�::5��E��z>"���Mg�hi��K�5�\g���]S),iO�q�T����yr�l��]nq��*�;�Q:yRB���+���-�ۚk��#I׵�{���Y{�F�P���Ӎc���Yo׿������g�e�8<�;=:�.�sk�&%���|�$�ufg�.�n�E�:5�����Â+әY�<w�g��8��`]�������n�Rs��Aֱ��C&��߾��u�	f��\�H1�m����DWNݔS�@�Iqm�8(��Ӏ���=F��D��G�s�:���י&���=M������2]9,+�W��ԑ����S�l.��>Ї�Z��GQ�3��ֿ�بA�0xV���-���0A�t=��t�
�S� *1�4+��)o�U�������>V�H�=� ���G*	�VK�N�Ԗ�h8��r
et����H�9�z�����4D��r3G��p�u{s5��>�W��.�I��] �:EC�G.�D��.�lO
'
<�wR���Uu*{DI����L���׻�m����I�(�f�M�h�Me�i�d0$����5�۳b(*�X
6	�)�E�071i���`I��4���4������9
�΅(���1b\^@V���t��5\E2T��ֽ�	�cI��m�;�
ur|RB��R���V��Q�}�L��F����S֛+�`fM2u�L W��4X�
P?F�t���8z�u�=eH Q@��JRB���;�3��e4�v�R��Y
���9j+��z��-�tNEyS���fz��[���FC�˚���j'%�SCgC�����wF�r�7�.��`4���"�����.c@獰�v\��n,�+sv'�E!�b�F�d�E��6U�ګ˖��Խ��tmI>4���\}Hu�Uv��p(��Y����jD�0� ��kʲa�p�g����M�Hbs���+��h��tށ���В�j��Mdtz�݆0�D*��x{�F_���rH�#�m���7=+24jhș�-P��>���t�xa���K+4�D�ƫ������_���S����gi��Z�J���\�0�}r;�5���˳yg6)�9�cA�H�J3Z�Եwfg��ZW
�3��\�ٸ�Cw����!�3~���ԕ�`
�:�Î�Å-V����D�V���ǩkg;ݰw;ىϹ��12t�'�:�ƭ޽7b ��t���7���b�́7�2*��o!v#��9C
��;��G!���E缏�oz~w?
��֑%Oa��2�7�j��9bp�\���&��G͓�V�b
4R|,�ԛ|9�0���;D�ah�ZtZ���0���l&����q{`])�	���:h�eB�ؙQ&�dΓ%��eQ�-
�I����+A�J���.\�kyrj�F�ݩM��I_��;]����%�92��3`a~FfW7A��r���ܩ�����ooJQ���zI"l���WQb�����	�xf�8OV�j/g�`�i�C~T�Z�� ܍�Xg.Ŕ�\
�S/��1�\��f>�3���3=��r�7[&X�.�qC��$;���W[{�T
��H�����_�Qw}7���̖�f�`���]3vf��ո��N�~��<�:g��;ކ�5��ݻwPW�\8ȉ�e8�<^��|
�?��9���F�0�{��mp��z��D�9�~Ñ=���Z�����u��1$��X
�vJ�93iz;t0%��H�T�fJ�vimѳ���y�!0�r�G����q��»���®M�z��k�'~��'Y�v�w�⫛I�W�>��u�O�d���
%=-]�0W�
��-��N��79�~�@K��7UwzA\a�8�uF���~)�c���:���>%��Q�:=:%:�Iu��
�qN������yq�x��G��������G�u�ζ����q�AhɕxuhJ�ޅ�h6�9��&�H��WZ-U ��ڱ�l��9go��U�\�;���@WM�;9�;������W(���u�X�?�c/��/	|�JO#`~�l]<@@������}�`긧s��	4A�f�^(�Avy��XBu\����s<�O�:�}�c�n�xA�	�*Mn}��|��:7�J�܁T��a���g#?,B*��p�	}�%�%��F�Lt{���8�;����E��]/���v_5q��M\�ܿ��c�m9�Wຒ��
�p?�	��<r�}zÀ�"#���y�v ���^ ����,w��V�׵�:�)��>RȽ�;���@�AvF�R�vZ��8��闟�9G���]�w>���9'E�*u`����3�s�jO�}ꕯ�R�tJ�*_�����T�5��|EFv�X]�*_����Ud�q,�c���JB�%
���pmf�cs�y��͐�X!wj��xe�o˿ci;�S��X���@���%�Q*st�y��B
r/���Lӎ!ʝ<E
U����!�Fs�E�/7��3�V��{��d���U�Ԋ���G�
��^���k�N�Uf�<��]�vj�6Ί�9��}��r\�С��E���y�A]��I������T��:��tl�;�9��*�`j�y9%���7��qD�J�>^��Ɇ��g)��*��]]�t`w2��3:�E�F�ߚ�/װ^`Rj�\���T��(�
8��l�[sp��<`!�����4W����i�s���u�w��EI�Z��(����9G�V*�e2�q܇8w��|j�e7W۴~��y�����U)4�y:mA4���9���<�|�%�n0%ԩ��%��
1�å�i���b]B�lb�lR�l�P�J�ϓ�h��ۑ$#�(O��OJ�[6z�� ��Q�y�Z��U��3�
��'W�T�+�HO��u�]9��$/=�D����u�D�0=_��(4���:���f��s���j��1�R��e
�He�|�\���Py�|n�V�K,��b�c��R�K�<�q�|�Eά/X�R�G%E���,F��kJ
�)H����!�c��U�+�>�j�R�`Wg��;#[
z��ٚ� 'S'��hoB����{���i,��5q���XJ��|�/g!$�:*�@��T7A.�����Y�@�b+���.���3;�a��.���(u�<g�Vd^��y;�E܉<ؙ���J)a�Oo/�5ע�r���6T���R�R�e����a�߹M�
`�F[�p�T�6_���Xf��{ѰM_����f�ю�ZLJ̷L_�bk,�
b`��=|���_�efǼ��|����+W_���{tE�p���xQ�c�aa���,����DWDg>x�HCvۛ���y�ޚ
{�~gЍW�J$Ѣ"؄i��,I�������UP+uC�J�L/����']����oe�4=K�n�.�<���9�Т��:]�T���e:�bv�t��o,k��U�е��G7�
�4Y^�u����\�C�2gN��]_�eҵ�ANv����eB���d2wٙ^�.���r��`Ÿ��j��ur��eŹr)=Oq�.ETìA@��tJ�Y͝�(��A�R��}�p}TAHN�∄,}#+����*�}T�=~*ýS���HhC0>�_�ę�LW�a�ez3�U�uF;��3J�6'�S�s?o���	���Y#�D�.���ѥi33�*H�q�z��9]2M�ER���$1M�y��-H�e>4��^����B��|�r���I��
.#v��6�լ�
[���V�vzw_�~�>�3�{3�ogb�7���>�����L��`ý��1����w��D���-�I�x<���>y��P�h��L�E�/gxV�8��Xz����b���E��K�&��ҋgZ��"��ZT
	8�d�_VW�a:3�&h��C9fl���~��H}"J\\�T@��
��J���Yc���'�P�[θ�n`��l�rңq�]H0�5�j�Ks�X-;o�'>��/��p��
 ���d��:�J�R�1�]_C���zmx��M6_1�ҫ��%v=��\_<x���֐�{
tl�t~\!0[̬�U�~�]�W�}�o�q���	���J�V�����U�1�p_�.��:�ẉ|ܬ���my�<)�<
���V�.G���g>X�W�t��� ��"��<���:�%T����s�����ra4�,�;��W9�>u���M�5I>)~R|\�IqUɎ�'�����3���AWz���΋1W�t��O����}���^�d(�w������V�������>i��|b�׀�����_�>����w������t���JgR*�3��xq���P)�;�����I��So�酈*P�H]v+g$NK���|北�<!�6c9��t*x֐3��ٞ�ZX�f�	��3N_�7�h/g�+�q�"']�f�!:��9#v%fP�
�8Ha��O���F=�uNB�*v�-OW܇EiV�����
� �u���3LZ=L�t�B����L��<!f�ѠKaf-�V���t�fFO:�mywjP�(B/j�W[l���#>�m��f �<�<�D3��I�(f�W�1-�C��_%B�Y��D?�)q���?o�y!��nт)X�!.g����*�DXF���@��c�Og�7 �=FIeg�K��ۍ�͟#�Xx1j�ŏQJ�ڿ�P�z����`D��|U�"Ƿӷ#r&��36��SޡHVai��'����;���J���"\�R1�)����A�!����5
����#��b��	�	:�v]�1�jg�N�\T|\d��J%g���L���e�,�}d�\O�����Q)ӕ*�*�=�{J
R8��b��mt����Ë��u�^�*ԛ��S��_]f���B+��Tn�X���\bw����G�M靲B,�,*	�:��քW��B���L`_�xꝕ4t0C�n�x�c�0	r������� ��c#���ԝ�qIu��ju}%2�~ﰚ�lQ)�x�6
X.�!�`Y�<�XX,�Jz���q����^5�ُa��ŕ�r?��{�0.�/��U��;mv����N�aGx<l��Km2���V��#���L�%��O����c��8�R6ν���tV���u�����!˔��ٓl��U���g
���r|YL���Z�S1
U��=�f��_���+[ƂQ� &�q��$e�9!QL����!�:"|�����r��*��o�I�\�@��z��>�%W���f����uOŒ3eV��f@�b��!\4a����vJ O�X�:*���d��W�[.�K������F�L�F�8/R��-θ�u;�V�kU��Y/�2�j�b׵��37���������فη���b
�Z�h���9�j��P��b�����2�'�8^�|�ęq��W��%4#q�!�J����C��d����:�D��z�	S!���ʊmsƍ(���>>H����e��>E�#;��)q�?����3�s����@pn�l�YL��r��{:h�r���oN�Ůu1R[B��a20�p0�g�h�>	C���/��pډ7�^��qQ��D[˥�*X�LA���qXa3f`��fl�j����Q�á������!��5:C+FC_��8��h���tr&����&k��/cx�Y\�mW�>�p4CA��R)*DVf�	u�m�I�A�xL��z�V����"�O�g�H��.�4)�$����<uJ�����	`ߨ�=��̄�s9D9��ݽ�X[i10�����c���ب�0WÏW���)=Julb�p)��]�y$Ԋ8� �Gv��-��c�{:uŋ��)�2�^I
�e~��^؊��3��j���,Q�z{��Y�#�9�fƥn�_�p,�NQg�o�U�kb�3�9���Z�X�T��䫕9�t�G^�g�2S���x:_x�"pV��#>���+���a�=�:���;s�ܑ���B��5`�`;q���8�c�	F¬׉��NqQ��M�*z������;�{�ܻE�������̙3���9s��dҩ��?�� Fj���D���ԣL�[�c��fd�GYjO���}�Q�=��M�3�x����j��{�1�p8�oa+?�N����c�|���$�,܃���kSo��V�+F~�K��I�,�����[���¢��Vc����MHgb����l�4�شz4K_Ct�҇-�G�FRI��/�,�}�2�ai塑��<��e�/�F���)�0�[��<��[}�M�ɳJ7w�<S�鵌7���E�O/p�w=�� ԙ�6p�L��Ě��N���dX(�a�W_�'O��Vcǟ�AY1%�*J`O{��߀��Kr�=�Ӌ�d^{�Wo4~��K/��^��W=gұ}Y���/���W~�g�7��֭�����̹~��ԋ:5M��N6aM��d����A��t���㵘��1�7�w�@o��;z���X�ޢA�q;���e���ie���}�9�6r�*��(�l�S�^]����J;�'���x��s��s�0��O^�I�Dׇ�>*���g���z1�Y�m��3�
�W�m�5]\Ҟ�~�\M����5�	|�}���g�:_6j���O{Nm_�)�՗�}"��S����y��罢^*G5����瓄�[D�1ېy��1�O���?-�{ط�y"H�p��>���F^�����m�8�D�V�o�2�'�Z�_m!�/t�"���&����p�4�Z��}Co���߾�7~��+'��c3�l:>�����k�^��z�z9o5����&V�p߄��_��+Y��o^���ζYO��V�6]ʫ���:��h=��L�hR|='�� ]}�\t&�u���ب���W-ed>+g~�ꋖ�����-�o���W�'����R����r�����}R�w}��B�V��GK�]���?[����o����O��~	<��M2?~��3^��W-�Ճ��/հ|5�8���	���R/��;�s]���f�Ye�r�ʞ�I�+UN��X�'*ת�t底�Wn��5��T��=���c)�Y��2�����,a)KY�F�R�����&҆���9�S���>�{�"����OG�)3�y�D�PO)��:�6FJ��0�H�d�t1R�R���җ�D��j�L�p����HY�(�����<d�1R�9�;N��LioR,��V����M=c���R�Y���V�E�r{Qy���ө4HD�R���B�J���"���J���j����IM����R����!
/�Ɩڅ�>u��J]O�^�3y"�����ld�g�|u�m}�r�*0�QP��>
�-���%~V�����/�j�*&?��ׇ1�����a���\��Lf�j&�&�U�G[�Eb��������c��!k��Y�׭�/��������Þl�X��O�x��mY�8[z۱
Èrd���auk�2�vLҮ���N&#1=��h�h4.�9��쎬n�N��!cS���3]X]���+3�c0�"��2^�Ό�2��/��z��۪�yO֋���Lj{�dFo��E>�HD�0�CW~��I�-�9c~�?��Uau����I�153c03�7v,�7C�R_�����g���Ѕ�.'?d�P����u�7q��nK����ψ����?�-5e�r���H4�3�2�e�5�5ʭ��}i�R�r��	��3��ۂK���<A�rB� ��j�X�0+
3YX��H��R�Y�JBTE��
^M���!�Dž|�ǀ��y����j"񤈫-�눸g��C��H�'���'�~�z��OE�Q�	�sQ�%��,<i��K�yEx^�ׄ�u�yCx����']x
�����4�_	ϻ��k�yOx2{_x~#�oE��	χ"�#�����4������d
ϟ�'Kx�	O��4�O�����S�	�g��g��|.<_ϗ����_��k�FxZ	Ok�V���o��w��Sx��	Ͽ��?“�kÄ�-��@.��<�#��+��
`
��@�'��
�}��@?�?�@8� `00���À�@0@G��"�8
@=Gc���c<0�L&3Qn
©�4&��L�3�H�
��?�,2Qe1B�ɖˁ�J�`�X��뱁l`��&`3�)آ�ķA䇀Bċ�m�%�`'�؍~�A������(p8�N����,p8\`��E�◁+�_Ex
�u��71�����x�����)��v\ķG<���N@g���tz=�^@o �����\�
D8�À�@UF 	�Fc���8`<0�L&S���4`:�R<5�L`0�����B`�X,�ˁ�J�`�X�Mg-��`#M��l����>B�(�ہb���<��B������~L�.jG���1�83�ur'?Ņy8�E�y.?b��%.�_���W^Cx�
�7�nw���=��z��z9���h��/�zi�^.b-E��{�â��vG���|,�z]b�D��!>�6�c�?�S�z������eu.�믋��A�``0@1ϵ�
G��F��1�X`ZD+-0���x�h�	�D`0�LE�4`:0����B��E,�0��u�il
"\,�K�e�_�p�i�i���*`5�X�֣�
�F]��@�/nP?�
~q�}1�x�M��u���R	��N`�h)^�ٿ�ѽ�>`?p8G���1�8p8��O��3H����E��.W���5]����|�M�p�Ѯ��P
�C��@;C��
�
�
�
�
�W��!�t:�M�ovC��2=�^@oC���h��6쇰?0B�``07�(0�;#�p40�q�x`0�d�_MF�S��t`0���s���=t�=�{󐄑�7�`!�Y,�� \�V?"i�!?�Ec���/��i�1�R�h��h����
c6��l�U�k�1�`c���k��X��7��FD7��-ha+B@!P�6`;P�;���.`7��`5��������J�J�Ja�0)����!���M^M�D��H�A49��U�ci����I$?M0�&P�	�j�5���`@M0�&�X��B��5����MN#h$��Ap8�.�
vú\���a4�
\�7������ې�k����Yj�T�f����0DS$�3�G��F߳s�,��D6�9�/�U��̎��"��(��AecP�T6��AecP�T6��AecP�Tvg����+��M^N7Sx���yt�'��
�}��@?�?0��!�0�	�h`0�xST���D`20��fs���B`1�X�Vk�u�`��@�)jm��@	��	�vCf�8���c�q�p8>�Jv��,p�\�����M�6p(�X��v@.��@'�;]��@7�;�=,�JO�ҽ�}��H��[��K��C�a�p��F��1�X`0�L&Y��Tħy��3-�%���F|�%�����"`1�K-�!���2`9��Hv�y��*`
��l6[�Pl���.`������(��nz�M�#~8i�S�%�ׁ�̪j��%2K~hI���|ߒ����%[�7����0Ò��x)£s�%�m�v–��@kKvB��
,�xw���b�=�ހn�_X�eK�Ғ�XrX�Y�cK�i�!H4�d�%߶�;��ܒ_X�KK�ʒ�Z�F�I�d`
0�L^���̰�$~g��Zr&b�,��3�`.���`Jy�|Ւ/Xr8���Vp��B{����p��&_�dSKfZ2˒�d3Kf[r
�����,���-�Lb-,�䧖X��%?��&����͈�ے[�ǒ�%�"�OK�Ò_Y�q��%�%��~o�	(����^/�#<H�E�C�a�q�GvG���(��}�N@_��8�S<?ya��	�<K
E4ޒ��e����!�K�e��䷖��u��n�o,��%o"�ʒ#P�-DqC����g��.҇���0S1�C��=Pb;� ]/A|��yHv:���(�b� ��<���@w[���i���V̀��g�0�m�,	�XnF��+�"0�d�5��-��[NE�i�t`0۶D�[������٢�|[�T^~TA>��gllڶ���b�`�ږ��3�G|���8�G�[VNľ��V�j�L�����@ȖX�L�$�=2�r�G�oز&ķ!w;�Ӗ�u�b0���CTM��O�9�
�A��=��^�j*���o��O	��-Z��;a��U(8
䡂K��W�\n7�ި�*ǁ]�6����!o�)Z���@��u0�Geb���>&�*�4�ȳ���e�:����ѫ�6�4�s�\]���eZu���eu)�Z�.;!k6«�	y�7�@x
�:�겝^]�ϓ0���|u�Zuy	���	�t�݀�@Yg��ר�?e&��U(�����!+��.E�2ڮ���C�~jA+����z�.�ArPt�+0�^�ķ����]Զ	rAĻE��f�
@o���@6��m��(���y��V'e���S8���]�>:�U`L5�>��d�#ET�%�R��k�ħE��V�:��=��jdA��mA[�`���!샃�"{��ۋp�8�CG�cP;�Z��O�)��I��d�gd�Onד�e��u��u�"`�`ӥؠx�����g�֗�
4y�s`�s��hT�����J�ߓ"�] �ˉi'��|�2NVD�.N��S\N!nn�L�I�����0�ğ�%�Uk�MF�
�g4��gE�X|���v�v�6�@�Lȗ�Lȴr���ق��7��H�
�6��a
�_&[6������(w��w
d1X%�`'�����`"pM�Q_��n��`P {� �X,&��d`
��U�)�;Z����u�AU4�JwJ���1��ș��,`6�O�� >��A�!���k �ʨ ����}4�+0�/U��<���/�ÆG�7��ipB���H����N�t��O��	S�4��4��4Ly�܃���z�|9
�&��d�4��/1�i��+�ir($^L� |���Y����א�뫲e�?M�V�	_���������4(;
�yN�d�a��0air-��ߊ�M�w ,�#��`dg"��@|��&�Q�Pd7#o8�go��
�?��9 ��-�E�
A��6�?�
6�_b�K�6�&wې��4��uH"��b$K��������
*.BE3h ���?	�ި-2m!3��U��!�:�5u�U}M&�^�
�䛲�x�H�/�C�2-]��P��E�ˊo�M,]&�-���30�5W��T�]�u@W`��!F:F��KG��1��PB:���	O��g�U�1����tX*A�Q��vBE�!X�">��)T��v�i��*��"���йH�6�����2y�����p��lC�a���l�#���p-:}!���O��a��I�N���9'�.Q�P�C��f$�""be 6S�Y\�ˑnI�ҩ��xl��h����;�F���uP3*�u�SθMi���e��T���\7��1��1�x���6C!�,��/OӪū��a��5�2?q���'���_Iwpj�D:E�6KH��o���v�[4Q���Ď%�'���m@�BӮz�tEK����1�K���	�5Ď(�oePH2E��٪�8yJ��U!�1A4Ū&ܯ�G]�U��ʧ��T���D��W��d�ʔ[]�#O}1���cw5jh��;/c���?���Z��?nr�Sˮ/뾵Pv�vl$b���,�7EeT`&/99�>�����%��Tt��~�e�y��jbԣy�\W�-g��ˬyOl$l��m�$��a��#)n��T��쎖�����xn���=ly�Sj���\K���}���3��b&܎�V�b�ǵS�|2ޫ�H��o�v�N�UT��4ȟ����u])62�:�`�Le�}r��Ƒ���ݱ�QY�Ft!y��;�kОQ��:J��"U0݇��"u��,����ItL0|�ZB�l�e&8\�	���L�4���[�Y�֏;"����M����5������������{�`�^KSVG���~B�y"?u�{���]&�,ikKP�,�tXdI�^�յ��uaj}xN��ٻ�j�'�7�4�/P�^���b?��KD~A&�2�J#�K"�Pƫ�/N#�:1ߠ�j�xQ��I�!q�&/@G�F��+�]M�����e�_E�����5�~K���2jZ�D>"�"$҄��D�R�T���dQ��lJ6'�	�T��ȧD���4���_(�9���—�~�hK�Ye���i�7L���ךi����i�ƴ����y�ɴ��/�U�7Ӓ�ôJ9�i�ۀ<�$�H�� �� U;�<�R�#�c�@�w���� Oty�;���S=Aj����v>��}@��y�7��r����� ��<7�'�A��ӡ 
���0�������H���1�����hbF+:Fѱ��c㙬���'@��� oLbLV��'#|Dk$�(���"�i�N����wg��zJ�7ҩ�n"�U�?����v�*:O��.P��T�,T�E��Xq�0ZPK����M�Zh�-<�eʕ`U�~]ŴՌ���U�ZE�A�O�ѯ�
�5����cZ�8��M�b����[�[A'3-��0	�2�H�ئJ<�du-��vգbU�De�l��TR�b���_�ޣ8{ݧ��W��%y���ȟ�����GA�8��q��N��<	��S _���H�� �ρ|{3�w�j�"SVI5s�����'��h5��jmY��j&��^g�
G��3�[L���Np�	�:y��T��p�l��z[ڪ�v����\'��d-�ZGE;�zgN*�ڕkݜ��:w{��=�p/E{+�ڇk}�E����9)e����`�WC��P'��n6���8y#��(��hN��U�X��8�����$E'+:Eѩ�NSt��3@�j3U
����E�V��)�����)�c�=�g�@s�6\�:�r-�-ƙݑmA�[���l)h��+[ڍ���V��`?��d�@{�ՠ���|��[ڗQ[?��l��t �:�m̶�a[A�� �0�
AG�"Бl�(�	��ձ�lGoDzb�dMm"�/�nw(�S�]�5�݊�Qt���P�$�t2;:�ѴLeQUmm�!�6�i��Î�E�wE�q�8�\;���N#8õ�4Ϻ~�1��M\pl⢓����+Np�	�9�u'��H���h���r�I�A�vW�=G����`�Y���
�B�t1k���]�rA�����%+X�+YG]U�	�Xg�UJ��3kXp�2:mֱ���gt�l`��Ⱥ�nbUarE���V�S�-�h��-d�z]�g}��X?�T�_W�Kс���>+:Dѡ�?L'K�ӐtZ�#tZ�#��h���XEǁ>��wF6��&��d�@w�ɠ���=l*�^6
t����=�f�d�@�_5��e|�N.���JL>��`�\r��y���]��O��l���O�3��"�v��:mMK@���2Ur��^��e���T]�A���Zg$�tZ���R>�6���f,��l,��ԋl#�%�	�2�z�m�ʶ�^cA��,��]�&+��֠�/`3���&�;�,V�\���e�󝠹|h�4��f�g�r�X`��d����g�ϱ�گ���
̯R�!5�à5�#j6�*uS�㊞���8��O)�iE�(zV�s��W���EE/)�e��+:�W1ޞ�h/~�7�~>�	ڇ���o���w@��x'�q�@�Π�y)��c<�
���0����p��`8��x��������AFBB{7�u��		y�:�H��yGT0�w�;�D�	�+8y!*N��`^գ7�hwE����/���r��A뢗A��h���8frZ�8-�ٜ���E_��PD�5m)vqD^�Vr��oh��ݟ��
P�
Tt���I���ݵ|�:>t=f08���V�A����n��@���tm�A7�Q�Um�5z���4-!N�Z��Z�8����a���aP�i�p:rv(
�Tޥ4�����i}��cѣ}|�~P];�i�t�t�t(�t@��!s�N�	���c`"&�m�$�,m2�s�O=ϧ�^�O0�H��m�ɛ��0ݠ>CM�LE�j����(w��A��j8����v�'�En1vUx��]��"��Ŋ.1h�,U�-S��]aP'H巕��(���+��=�h)_���m��m��EW2�����k�t�N�u���úAU�QQ�S����e�7l��G~��ΰ��:тN*dЉVh��Y��Ԕlw�
�����v:���`��q�R��`����
���		��#N�B��t:F�����ӑ�K�ô�Nk�~B�뤢��:Nc���g@��gA���@��A�@�A�@��A��t�����t��t�����ӱ;J�w�N��ܱ���_�2~�MԵk��k{�n_W���TS�[��=]'��im��I���(�{:�� ������?�{�:=�ԙ�S�S�ښj��<��7�!X�I�:���<S�EM��N�RHg
�.N=]�
�9ݝTG���r��N^��q�}M��~N��$�p$:=�;�'J�^�aNb8	�VZ`�)R_��@|�>t�>��8��V*�A�*e��
��GCr�>t�>t�>t�>t�R��ح�p�J�!��B��"��mJ�ەz��zK�ߡOݩOݥ?����~]N��kSA��ev
��=
]=��@��3Q�Nk�>�d�O8J�Y&�G��<ۄ����^o�R�<g��;�Z�L�B�N�E��+m/�x�ɖ:ZY�˕�W8U�t���I�r��I�q��:�:'X��mp��s����N��:�o=�AO�!�3z!�Y��sJo��.�Y��f����e5�W�~�*�_Sz���pC����-���J�w����Eh垮�mf�ζ�����i�jo�b�"݁��N�$��nZ<^�w��o�Mˈ7�=�e�[�^ӲⅾϴD���7-;^�LK���M+.>^?dZ��	��q�Qj�#��7�QT�a��P#e��h�7'ЛN��f�Sf��ۭ,Q�h��);C*��|���e������<U�@U�0�E��2�%t��1�e��3�t�/0�U�/2�5t�/1�u�/3�
�J�+LvӴ��Lv˴���&�mZ�Z��1-_o�����7��i%��&+5���̱�dM~��M���������a�xf��4VCkoi���kiz
���5�<K3kh-ͪ�u�4QC댒�tƻX�^�u�8�~��bz7b4Ywb6Yc?j����lgVOT,��B~�
zodW�����>Ԗ��E���ӎ3��RZ�o)-�������s&Hm\0� j���~�dCP
�f��n�l����e����
,��=���0�9	+�m-6�����h�*7���ZVy�,�����]6�u�M��R6�J�r�d+Q��S�D�-�j%�v��z
2���iܚFNҧ�/3,m&��`�Z���t>����9����Dl."K�r��A)�-m�+�*�m�I���]D+�v��X���);Y_U٦����2�*���-Ͷ+�+,M�naiq`�`i�`����^mi������I�ZZ��X��zKKs��%!�Bwp}#��m���f�����+�5l��k+�ͰX�t3�b79�DT���1LB���wխmTn�Ŷ�6i�®T�Y"/��
}'�i}��w����F�Z�_�{��G�dV)�>2�*�~�G;PM�� &{�~����c6�;Bӹ�bGa�|-�[3�:�Ô�a��9�h��U>����V��b�0�<h�ӘX������������;���%;�ɥv�bv�N�]��������{-�@7�Sw�F��b�h�Y�2��~�]!�>`1\j��qW��q�Y�-��ݰ�w�R��-Km����;�16������=��>�?\����q���~ch�V���l3��6����`����`Z�DC��
�l?����=ihq�d��a�
„q��4�r�+�V~&cV�~�g3c�&nc���%f,_7������%�b���U��C�ʝ8�ʆ�HW�jZ��!Yeg��T�T�
V��Y��]�Y�`Ֆq���~���7pV��jl�l؏�⬂�=q���H>y��'�{�ɧ��:X�Z�ku��#�V{��6!�4\������5�����m��[��;H��=�.�z�t���=;�4���:���9\�q��Ӄ��gnBƍf��5rfX%D���rXq�R+�^j��1���l��}W���s��|׬�6�Q�"[��{�ﴷ�Z��&�[5�<oi�,�6���FX�Ns���nO
M+l�^d^
"��sR�M5k'��^�/�̶*�*--|[},�	�%rM�J���:�1��nER(�3oguy�>u2"�*mJ#>��J����l�߂��a_�̫}���� �#ش�h�Ih�F�w�`Vg��"2�
l�M4�~w�wuS��P�����Kx?Ѭw$�/��Q����a?�j�_�M/����u���!>d��L_�l�h:X%2�i?�9D4���xMSr�I�a�t�Å��H&��-K����M������[Z�����H�P|V�>J��P fë��ږx|�oVT�f,�C`���G��@�}Έ��v���<qsi���"H|_/Mg�+kZӱ"�K+X�
���8�燅�D���¾>b��n��xW|�������
�DT�o��~"~i-*RS��D�\�p���$�<o\�$�[csҞ��Z&�>d�W|�C�=(>�;��D��>M����gї��аtGQ#��|�D`�+6�!j~��f���p����劏xH�#�uSOF��lWz�C�G��-s�&��1e�NJ�\Wz�C:>��犏H���V>���"=�)\��:Q�di��A��m�.X�&K-�	�Л.Dl�H_�&�
�qas�Z$��E�%*�T���f�E�م+�X������}�T�1|��U�y�5hb���Y���l��d����m�26
]�T�#�maf����fUY�?qC���C����u��E0�;�@�n��a��g���E���t ~��U�"Ba�P+EW:�jHd����hV�l�!5NO���-T۝�tZ��
j��[�%��:��!��Ӊm��v�NJu�8&�ΔOW�lǃ��D�ŠT��jT�"������	�<��+6=_d��q3�R�<dp{ƒ�	LsL`/L`��	�ba�wYK��.ki�u�e-�����Q�a4~��7<J"��?[d	��N���p5� "�zYǣ�z<b�'\UVE�t{�:�:񓑂�ö}��*�&Z��θR��q��6*r"g�"�A�uV��sD�A��Ze�wY�Sw�X�ocT� ��!���G��VK�-�Mj��#��,�����J�Up���\�˙%�>�4�hn
�-d�V�p��H>��b�6��]��`�RDKEV��oc�mm��R�����"�Z�dZ�'a4�Sj`�ë��<X)�I�f���'�nH�9��ن
|�� #�V��+�,o��uA�dY~�Z+�K��=�ǂ�:}���ٳ���vr���#�:�<���*��]��n'JBm���mc��ű�	4y�3:��љf� �E����8�%����<"���I8�hό6�c��%�W�����vF7�S�;u2��T�H�R=#��H���z#�;��G*?��T�H�R}#��H����!�?��ԀH�;o��O�1z�����V��N�g�`Y�:)Z�ϙ���j6��t%Y���I�����3��i�Nj$�M�.�I��'V��s��hg���h��0��H��0F�Q`�V����ۏ�>2���(6!e,b�8�?m���xm���6���Y���{��c.*�/]���3	Ê�o�+cn�Wk]�՚���M�W\׌�rK��"88E��'�O���ej���^��b��q0m�ЫM���<C\��f`�ݐ����S#�
�UQR�D�}M�4�b�ҧ�,��tN���~���ꁕm>�B�lC�ZxX5��e&D��m�½P�<.��`}�ξ���Y�T۫M�C)�;;�T7oZL�4��Z�&��t��C߆�1������vЫf�j�E�u�9.����֓j+?o�M5���Ë�QE��p��wڏ�
���]Q@���È��z�_��v�:0���ܨ�sm:��ʍ"SL�gk#��=�uqa�7*�+��&U�^\!�|ۿ��O�q�x�f�J9'�A��s@9�!����6�K���30�Z4���it@��/���r�+�f\|;��b-r�ct����azp.�5'k��H${J2ۧ��o����3۴�<\����T�1ke�qv"������*�d��_jÉ)L���=�X���`w�P��E��m^u}i)�UZ���1��H�V����(�d��$��L����|�bR�zOz�k��ñ�~��h�oS�ϞU>ӳ�N1��B��(��\1�G�T��)��FxED7	�$ʈ�QQ�vxˏ��f%�Ymd�3>�~̹��\U�9e>ql�\�]�����8m�S½ߜ^SI��J�/#q<Z�q�N��t\x��8���+ʌ-��a���ߌ���QoA�����/���۸Ȭ���c�sZugHMwo��
A=��F��%l'�);�OٛÑ����!����[�}�p�em伓�I��V�*��5g�hN�r��u��h�Q��*ٖd\Cz�z��t���;�T*2�fA�fh�F���H�����!�B���k5cW�H�_
m���N�S�����6G~2�ش�V�l_[;�_׬�]�JTb��!��Z��M�?�m�\�M\�58��d����l���Fkl#��v�j����H�W�M���q����v�r��9[l�t�e!���`}��VU0zn+�݈�|Gϡ��`�/_��M����������y�c�!�s�Mɋ-q|�5X�֊��6�@�j7�uU��W���'�F�!+�{hjUt=������2�������"�2�݆�W�Fh�T�*yp��Hy5]�$��Z�����\��
���+�,�Ν{_/%�TM����j��&*�5����"T��͏�V��Xln�h��ABu��jnn_;��"D/Ո��_��m��ǩ����v�1S5���v{ 8ࡂ�	e+�'u�P�*^b3�D*}������d���R�¥��eˇ�b!=Z�D��
� #k���5&D�>R�J�){%F�O��Kq�s�nW��M%=Az]#Bt�8�Ï��qj �V�g3R+�c�|%G��E���"�&�.!Ʋ��e`���.�*6�Zk'��2w�5��=BEk!�5�v��L�1�N�T��z�9+i�Գ�]6=��ݢrgw�c+�]ت���)�Ah�@�WC�lwO
9�j������nT��T�1
�~�|��:2�vb#IjT��ㆄSVyg�����ka�
*��T�;��*�E�p<�?�R�ɱ���%�
��􁞿nv��.
��J=��ƪ�/F�LbN�)-�B<��ʪ��ؖ�"���l�Vq]Ss��#�zHy��`i�
3�3T���9Z�B����o���'���5�v���ey��첣�v`���l��ֲ�[#�^�‹hon�����E��c����Yq삎��r�MG��h����(�\���>��5�m'���`��c�;܊��.�V}N����(�� ���7��\^�e|����}cl���X��zS��"�ox���t�6��z�����9ʵC6�%�4��Gx�h�M�@�g�Gӹ�9��=�]f-�I���tl�|NW�Ίܛ��d�Ƚ	��T�rR�S�>�s%uug����;���WYZj�����M�+l]�a]�(�t�q�~�f{R�_�v�9�l��׽�+W5|�vy-�ï�t����Is�>�T"GIԑ�~2
9j��:<ʏ�l�E�|WǠ[�C<���c�Y�q���Y���<*�$%E޸
�%�Șr�مo����Ŏ�h%���7)%r�:��a�VTL�*<Cg�䨞����3vIQӳva�YL�9��E�N����ɺ��M��Y�~V�~V��Y�Y��`5��u�H��oH��3]�3�e���(}ٮ���4�t�y���4̪8���pN�b���h��zf��T�+�@���+�y�������ҩ�5z]�R� �:��Q��U�ͮʸ���7b�7��7Q��t�~�G7�}��G�yK���2�M�۷�-�}�m�
۷��(6!�n���ZIhn4Mh���$@�,�&��^=㖭=u�	����eN4��2n+AM�I��"ȥG���,��Dj�(��WV���S��b�֫ztߐ1Ì���4����;���h���o�i���0�Z`�����N3s���]f�nӫv��{L��cf�5�f`�����Z�}f�~�+�����03�^8hf2�q�C4O��a����B��JF0��uS�C3����F��(��Hr*%��HB-�56���Ү95��
 ��]w�f��dj�}*��æo�8lf1}��3��a����L�(3p����+�f��X��i3�ٔ��9�8m�e}#�6"t��P��u?&������e�~#�!"t��Ї���!t���I�8��پuv�� #Gr�*����j#i^~_�R>r���V�GV��l��CtA���懎Bs��I
]��\P3��
,�Šv`	�,�,c�,��V�#��˩�&��:P�F(yt��t;�������a�؃�?���gQ-�����±-e�1��ΐR3un����J�+Y����7�������`l�e\�0P˟ttQ�/cK��_:��ҹ�tVĨגQ7�.QeX�1��ͪW�B��A�����Q�̲��3��,�ݒְ�Z��lC�l�49��
zn�j]ج��i.������v��̶m�I�([�du��hzgɿin��C~�DNՔm��ٺd%�gT:TZ��#�
F�nnU�C
ꑊ1F�̶F�wd��-�`�9)3��t�yx�vqgW���O�`�3Ϛ�Ifଙy��M1����o�8of^0}3�3��e.���L�3p�̼l�晁�f�ӷ�\13���Efઙy
;��ff^7}��u3��[an��7M�fঙy��6���ۦo��mf�1}��3���h�L�f3p��,5}[�@���c�Bf �B�[`dz�a�x:�+U���D<S�JLfy���Sप��̓�$�ʬ'#{3�q8�H������y�N">/��y��$�<�Dϻ�j�j�0�K�x0-T;<k���3�C�������m3�mR�f�w[��W̰�6Y�Ϲi�3D�ϻi��>A�����U����=���=7-=��7�yW�/��x�� }�M'ЛH��d9z��n~��wYAy��]޾WZ��J�?�^i_���?�^�J�k���{�'@0T��;:ꇥɰ�n�R-��H�[� ����������du�Y����Z`7��g:l"_=W؍���C������(o.��>���aoG�7�^��&D�(R��s�v8sYhj��Բ�H{eh�zY����F����A�^ڂ�l�o����"�@_.-ۉ��{'�N<V���	ӏ���D�(���_La��C����iث%�)L?Δ�\
�?)���L"��"�� 	���ft������I���rzN�:�-tI}�Z��r��k��Ј�S�C�
]q�Y��vv���JK�~�!|NW
G��|]%#s:����	�/p���B.�~�ar���#[ѷk@�K:�QZ���E�X�^6��^��O�Јo���\�����U�U�BJƊ(rf��;�-�;O��w���Q:�
w�F�i����D�&����:*����
������ͦ#�z�ă����6�T**-%��2�뮕��b�)Q'W�R�Fҏ2F
7�e����?ϵ�~Ih�U�f�X$5�5�{���\D�e�a���q���� Q��&�2R�/Գ��,Ԍ�籘��&
�k"�3<���[V���%����Q�����ұJ������0	f��5.�aB�N��M�i�{�M1�$�
���ʊ��'B��<�h���Ȱ�-b+�l���$�nk��>�onR�C����@HE���T#�ԉ*Oz�w)�L7�l_'Z���>��q�	�O�q*v�9}MxU1S�#�g5
�4��Y�Ej��S1���9r�÷F��n1�1Q���@�S%VbZ̎��*L�FK�6Bt>(���u��X�͖��4W%��l��q��l��9���dw�B�c���B6)qKi�S�B���Pᕈ���:�:�<��԰����QҺ��	�K����d�v��,ێ���P�Z˖���.��4(T��:M�e}��{�N[\����ڿE�������F[�л3�KD,"��MD�D�%|UoUB�7ːWO�-Y.���K`�R�W/��6��/5�ƣ�hԊFE4jg��Jc���c
0Q�.pZ*,��C�2�2�P��Y���N�nPP�Ꙫ�$�-��z������G��ܧ?q��#��9Ȏ��p�?��cՔ��
�Wb'7����O�v��O�[2�#e�[��^t�Lz��8�hL�k�>C]R���g�E�ϰK���N|��y����e�F,��.۷�~��Xz?�s���1Ԧ��,Y8O�
r��6Ֆ]X�壚��!��$�z�K�l�D��U�z�Q���̿
S7�c�ҸA��"�s�D�A�x�95�&��Nu�'��|3킒l�
;�JK���?e.�9,<�������۰���2���3ؔ5bZ�;w��WY��ujt���5l�W���ܹ*�E0���`lqM��ī5�3�F�h�%�C��r��؎�s���З^H��2��>�R�-��ߒs�l�p�7תV�t(���ӇJ���0��k�Ej��kNJL�� N;O�a��0���`
�	N�q�Y>��<}�i��	ԝͫE����?���N��u��M\�8�SgM����pO-��^-A}x2��1{�;u��8'���w�Ѐr��arjqZD�y�k`W"��@5���85�����*�<���}G�P�'5���7�`ޮ��<Y���l�Rma��#�E���{Z�鑔�M�tg�0n^�)z�����V���VN}
I},�w����W�=���#`��������A|���W��1RB�;%u�b�ݥf��F��25�˦ʝ�y8�%��›��a�(�2�tF��2O���d��o���,~�l4��j,Yn�I���W�uz,R����w�vT�;dDj��L5
�7��$��#5fic��'3m���Dm�Ԍ�3�4�R��dVL���R�����aMIj�
�RƢ��`�S���i���6l=�b���$6R=���D�
G4O�z�b��'*�o�}DZ���+�\ax�k��we�K<y��	2��xݘ��8.G1LS^#�.}��Oz�����2�1uc�Kf>��,ď�^�DL�نmPlr$6Q��Òm��H��Hl�#9�?�:���,F.T��縔L����&ID��v��=f����>�V��Wu��'`�*ި7�\�+R��2�{��/a��g�d�E�rx{�"l�4/�|4�nR�Ȟ�Ʊ,�X�iwW{����计&9�
�j-���їj$p�����|D�b�@���ٌI����*N�NF�3z�RO܃�^��$�C5��+~ʸE*V�ߛW�BR]����3E3vꘕ��>)������$l�#����z͛;�	̀D��LOu�}�]�5#���b5���-woz
[N!��x�k��vV��z���AR�z�TM����H�뺺��b8��ata�����k&;�M>�7���|?>��ve�d�1�bg.zqw"px�Dg��.q㏙�
��Q�3x!M�3�4I�3v�Rw�3z���j�����G+d�3�����.�}b�*�[�-zWs�#��b�����k�u����~�RL�^m�5��D����'z����g���;k��SeAn1mR�M\�q@���r��]���b��y57bv�l#�1kZ_F���T;��:-��:χ�tw�=jGWXS_�[��A�zz�|�U��uM��L)^Z5Z�A�M(�p�5�f@��A�6A�
��Uz 7c��"��0����SS���j��F��`UP�<������_F4�b�8�2��i�2��;-���<5��I}N�j�(Y��JN�;0�v*H|C�GG>�_���נ�5Б4�?zf^2IҝK�0n@����]��Sīe�籮F�������e]5���Hs������2�%�
^_'��6���ޏ�t�4I���T=�1[�#W
e���i��d���H%��n��9?�ƞKEΡ�-
��x� nY GE�@�dl�L�K*�=�V,�wݥ՛��L���IP3�Ǒ���×G�?�I*�;�����=��%��S��:����ҧ8���S�C&��,6��v�Di�jÝo>�t�
O?�Xk��m�}y�U�~��B�W��I��O�'TE�p�GFy�eO2��N���T��`;}��.��9�`c=�N�^������i�m%Wwju�"w�qy�K��E�(�W��Ƕ��}�c{���"�,�:����TO��<g���绂��,�|�n,8�J3��q�����s���~̓z�Ϊ��o�i�`d��#)z���eu�y�.�IJ�K�4�ν���fYF����/�2��gAbY�a�g���aĴэ�	nc�[�[���S��1�G��ԟ;_�R����+G��]����\(eNt�v�KY��+��z�^�s��.�	���6��H�U�nt"f�"��!�'�����ߞ؃�'���I�ޞ�s|�>V�����K����S�.@�d�M��{�N'�P�a�B�6�@guIPg�
��4���PI�
b#x0#��a̲
���{<�s��zW��5�j5�7�7��>��|[v�H�.��ܷ���C�T�}s~�
q�-��B�:#�H�aA�75�G��
��\5�T�/aY����l+[4�dd̓�Q3�Bx������A)�TD
5�����MVWM�p���Ӌ‘��t*S�+m�Ǫ���w���҄�dd~�*��K���Jm�ٝgzl{�t�{�����y*�2�;��g�gvp.��L���]QT@Ȫ�P\T@EET2��*�oxE.
�H��=_^���<�?TF�/���D�9'N��ų��o�iУw�3h=O�:G�I���ќ-�g�N)b���(�y�{��.b�h���=�b9m�:�@)m6H�G\�oA�]$�P׍HՏ�d]
�0��P�̄j"%�a����UG�Lf�cjJ�T8�֨��7���ʔiQ��G���*"h��Z�����Ŝ� sd/�#�(�ē�j����ͮ�7;0ND��i�j��y���u����pd����Z>��Â�zSVky��:/âʅ�%j���������.3Vm0))�1*6,����W�wQ�o��U��PQ��Ȉ)	JS�i:��֭��<�Q��K��V����in
��bqY�Z,¡��X8�n-3ó����8"�p|Z�糌�ik|�n�O;���t
M������ԐT��V�x��|%Q�*G/�Uf�Z�V�l��3_�2�/����_S#~Ʋ�j=���1,O+�r	"�_�@�˩+Вr�%z�?1�5�ۊr�
�[Nޫ@K˩�*вr�eԵkI$$��qH�����C��(h�]0���\3�
TO3�AO���˾�L^�ߧu\�\N\����5	��� ,X)
mR.�F�k��
��+sQ;��2Wo}̗����s�@ӈZ�T�N�I�DŽ�E�
y�d����J9{	:i&�9z_*L����ܔ�"�78*���`�[5�k�gX�G�D��m�Z*����*��ٶ�tq�zeR��ayHo����Ӳ��&�m)�l�,A��u��p�	6�q�ĪTe�r:�h���2���G�����=���M�߆y�#�	VB�H�\��g�}�B�_���`�תu�eւ�%.y��$*��*0	�LE�
3��_�Ć��y�y�yVyz���@�/��U�?>��}�\�����d��}H�$f�W&��Z@��[dNJ�w��M@G�F`�j��뜐,���%â;g>+&U�,�w��B=�Xe!o�!N˜(���Z"-S���0��-`�eE:���7��:�fA�%Sh��2�����"��YU�eU�"'|UNJ�3�1Y?�{�:.F@|%�.�99�1B�F�F&�/Ҏ
�d��hh�
GC���pB[�P$�_>���Ӌ�e��aޟ�Y���[P|�c8�(�_�EZp��:J����R��|�fӇ{D�=|�M8����|�%�yw��W��a�Yk��o֒w�Ĕj���Z
�*wUC����!w�Ĵj�4��.ڷZ	�;7kM�PS�U�)��]�q��x�����x�F�7�o��S�����orzU��
`��Q��	��� ��+Eg�K	@�e�E�T�\�O��ۄ�K��
�k.X:�	�E����K����w
Z�	c��(P�˼f��5D RHEhJG���NE��ӽ�6�;��}�݄��JySV|��]��@1	�[�����i�P��6Ni�=q�JR�P(��)��� �-�8�2	hѴ�zC�쥬�;e�݉��b�q��w"��Q��wь����7k���{u��2�M22{���c���8L<i�~��i��0��B�.�n,���'7wC5H�Pk0�+�� ��?�P�\:n� F�B����#�ETb�0$Z�D%DE){_�t�x{�%	�j�(��+9Yt�\V�g$�ۊT��?�z��gF9W<������.��]z�kB!nΗ������5*7�@I�K��@+��^Y�����ےaJ�n��h��E�&*H@Ԃ�3�=�E��Js��^<���q�"J��+��oEEQO�U���"�ꂏ-�V&+�5�1��m5d�2J�[��C�0�Q�̴�?5�S�?CJ�e�i^EJ�e�-� ��_��l��91�ĵt,v�:- ���R�r7ӢīE)N�A8�r&5=L8$>����U��������9���������eT"����K`�r�OS50-��~K
���K�<W�.�4�(��b�k��A�.[r~�q�
d����E.����W �/@�Y��j9��Ȣ �.�LQm�-M�TMiz�jKS+5DN�̱���K���\���d��bYj�|Y��Ȉ�
�{��/��+�	�@ؿ����*#��%4��!��!�Y�hF���w(��/ー��H<(�����L5�gK��P�b�������(i�a~�̵m��������fD��n�x�:�m������%g��v�f3�_�.y+W���}V���ʵ����O��e�:��N��V�n�1�p�պ�����}V�ߏ���(�I�|*<�9h�;,bw!�F-6#���w���N�6���V�-vZ���x�4o��M�
��,�����O,�>�����,�������#�Ϣ��ltg*�;�����V�E�a�e�Z�cx~�M�{��?.Z�{}׃���=8u�nɻ��Uh9ai3�ܺ�o��s�b8@_J�8����l��޳�E�7-�7�V�c���%MSL�lbgV�)��`o��OK�_3�[�F����3��
�`Ӈ���X�&��V�Y���ߢ�$��!�he:m���>���ɶ�v���Z�Sln�X*��Se���OwS�i6+]���\�t�{���~��}c��b,�ӆ�B����������j�n�Q#���C����� \u�r�M����
w���N��0l$�����?hsc�UGo�!�S��a�W"ck|����0�Ė�1#����j�[?*{*�������kGG�ce�}��6�S�Y��U���W*ڽ�����f���l�OزŎl1��'��xh�?K8;h�6^���q�l>�݊��N����H<.)̲oo��$��e�L6i���!��2O�Xٶ=ek1��slD���P����
 w5-�䅡S.j��|���ޣ<5��cV���f"0��z�#� �@�4}z�>
�B�f�9��S�M��̥�Z�����/P�`����y6���}��z�=|z[nT��W�3n��$X?7��v��D��!�xX4n��E��8m���H� �۟!���P�QlHlA� ��1qg��.��ť	�ϴ��.+��e�:�=\�q��f��H�Y
K�d��Vp����CqN�}#V��ŠL���'�#5��
����B�ƭˠ�۠��ǀ��4r�\���9F`�6�C�,$x��ut�J3׀�m�	��q�g(�ۧ
e~���9,`~��
|P(��@���n&��?0��lj�v~7���t-*a�=&��q�FUU
9�I�nð�r?��$��c�E�V~@?Ӏ�
٩m�*<,?�Y)�F���|�^���Em��k�u�y�g��?範�+�[���l�ʈ���7(�1n8n��R'+�k�ak��܏�L�\f�q{`�0���U(�~
�c[��)U>sZu��3����Ϭ4��5fW<���j��1x�ȷ�P~��^C��e7M�N�#��\܌,w�1�+w<���K���,2pȆ^D�<����*���:�:j�v��V$+�wuܴh��� E�2hM]h�����P6+�&��-	j)�f�
 �|J$)Fl�J����)�۫�
C��4�0���8��Ϭ6Ƕ�6Q�*|-���:�0��QxX�v�"�c��Fe�w)õ���/�+=6Z�+�*3n�vc�J��}FO��	\���PǕhJ[�HI�kҟAP��dž��㵧�ŔY��.�8�3d�&4�m���&uW5�,���d���#ZV��*��ץ��(������|�D8h�6,5�
t�`C�u]7mᏍqv��{�k����hC�@���A�^�Xh�o�U#�j4M�z�.NB)�������H���
v�#{��U�A�F�����+�T֤�1��5����Z\���҈��z�8AxxT&�\��
Ipd�w�\�|�De�-��g*u[F�/�\��7��N��R���s�f�vP�QtU��D�2�>I_7ָC��X��D�l�Mj�v,�˴B_�`����8u�jJ;$	�Rv%�:�}��D5�����Ѝw�02���X�yS��Cb��x��A�����m�(}��f0�?�8}o_�p��ߕ?�Ʋ������J­����B��`𨨴���=���r��v���g�'��zW����ͅ�&BQ]�cY+ �+U��H�/Q�S�.N�+S�T�q��L����y$�%6�����Ն��b+�!_���H�F&v!��<+{o�����؟k�Vl uMj��%��M�3���G.*r��C�Z���U�XQ�
rߨ�ʍ�7�V�)킋���KS�'/�D�$��P_:�1C���6����Pq-�M���w��
���x4�~�+��3���?�+�<W�z�������5��P�4��K��
j�H^�*vJ�%�)-B����u$%w[L����r��Il`�� �j7,^�V�:Y�c㏃�a����M�L��8�?�bU�D������1��43����׊���i�2<N��>��DLj�L�����������gůd#�M|1,�b,��w4����i��T��UT��⎪�g��,s�M�"����tL��`im]gLHGrXkx��6^5!F����4�b�c���xfڬSf�y ߃�c���y��jzԸmX}�?��V~4�
�NI�!�Ze]d_څ��6<�`�#�t��z�H��	�i�H<Nk��8���*�Uk!�<e�77ϣ>�H66w����r-�� ����b����7мOJ窋m�
Q� <�V(?c���r��x�7�w���4�d�wH@�~C���@�ЋF�F��H97�8s��Ie�F"
:�D��Yg��N*��J$S/@2�|$SK5TU�z~��%�#�=��ο܀�]�	��RK]=�1��\3�v���e6`oC�Je�����6C���K�Rb�ߦ�x�hYj���e���2�놼���Õ�m�&�w�̀O�[P�ݨ�2�|�/�yɨ�W�޸Ƚ�/���
Q��r|��4���e�����V��Q�o��]f�,�C��_sz���mF����yUv�R3��� [�S�u���<m�����&��w����E{k�6�=V�d/
g}I3U�� "�|�i��E��/�v�@�\O�ŹN�U�9,ֱaZ�}/X,��3�W^5�%�ס�6}��v�l�yĐ�e�В��R�`"��-@8���Pi�`��b�酴��n4�2�y�`�
��;��3��PJ*�If�1�X�S��9/F�>�T�x7%�=V�C��V�_�J��1$1�l`�S[2O
^7C��e�
PKbV���1!�S�%Wsg�2�J;r�:%�3��@�B�Pۛ��;UҬ��:��iZ�
��d�xAmoǜ�5r��2�Q�����W��7-����[n�KS�+-B��K��eH	�bZ��j��J��V����+�.�j�0���7
�[�`Vb]�,�v�N�E�$
{ŀ��Bg�i�Z��P��e��Vn`N�� ��l�������!EgT�),��?e�Pub����VC^+�����~u�ݢ�5]�>N�v�2(�����f�m1�r���o��)��Nj�e���OyߛM���'�Ҕ��m���&�)3N�y�)3.�~\�R�B��iɵ����ftC��П�%�W�P]��H�U�;E?��c-��W�����7���^�5_V￀�9�g`��pF���'D�I�
�O��,���Db����Eb��N��9"��N���Db��΄��"1Oxg�<��
�\�ϊD��:��%�›,�n�����|Ѿ@x��wB�.�)8_$2he	�P$1hU	�D�����}y���,��oa��G��s�;�0����M�\J�:
��)>��_F,�H�E�/���J���_O�G�����Ք��<�t����κ��W����5~��"8����R�%�/���5�*��!����mڔv3��M�߮���u]8��u<,��Է?n1�Ҵ<ai-�[@�9a�����Nl���=AB�9�Ry�-Ռ��P�.���LH��A
p�kTM��VB
���N���1_�QUF �T]�|��r4��:VFUD��Ѡ{�����D�Ǐ:3�69�{ʚ�T|%᭑�9n��K��3@����Ⱥ�Qjxj&0�����~�+����lr�}cc|�/���8�t8j:U+��2<�K%LhJ��i]+%���eR��"�L��Ӑ�5v�4uYj$^�厼<���w��ey��R�g�,��A��(|��.O��6X��J�n
���AT���D���l��lD�^��X4f��ov�H�س(y�H]^hY!t�X|+~��/&����>�вX�-w
C�'Jd���O�J��Jm*W�����\�?��r�P嗃(��+A�BA앳H����*'�O�?ap&�����F�����O��ɝ��~����^\$�J	���	�W��%l\%l��5U®j�k��H]9#��T}jt�ֹ�hy��J26��sE��vnqbQ<��bNc�H�j �»��ڜ(X���I��*x�A�vq}�`R����"�����y�@5c��Ђ�����&e�嵔�0��J�[(�!�����Ia|���>4uM��T��BMR|4�ƤjSCZ�ژz�:K+k*�2�WWëWD-�)�u�#��)J�j�S��!����� J<)� ZBxM&�K�kR�s�-.�9��\;�RG;vr�?k�
=#����rqQ�Q�b����^S:�ڑPn�\���W�������z��G�Hӡ�Mxj�gK��MY���Һ�ܥ�`�N��ྒPmt�{\�{CA�2n����b�v{P�1֕�QZ����-�{3�qտ�cP��ЀC�<b߹"��:��y?��p�����NE��H@Pzn��F�q���(�6`\����U�K`�wH�X%2���l{8K��q��h��T�<���1M4���N
d�ԤĈ}T��T�j�;
&)��a��65m�É��'5t�L'�2Gr��.Bd��"��1<A]Tn��v!�Ed�(5f_$U�X/����A5�����Hc�V2��ߑ�fҊy�Jr�J�Y�a��1���%%y�_���.�_J�9�q9�bՙԪT���֐��عb�H�`
�bQ�:R``�RC*i�ϱ�;t]7�5�1;��J&�0��~�b ��a�PWZ���M����s+�3Zw�\�)�[�!}��8
�b���$;�`�	_m��C�Vh��Z��IeЀ���j����W�e�eW!ɦ�c�������Nٓz�S�!�n��#;e
e��[93�^@�s�<�St�2Ç��r^�� ��[|����'��?п�V*�~��+E�|�XJ(u�Mq����@�_f��6x�(u��<�R�,I
�<�{'���I
�)��ҩhY��׬�*�鑦�k�I��K���]�b�]�[�>��z�=��nb9�@a�N]��6`@Z��W�_N��n��F��"�=zY�z�^��
^'���p�C���@w�AaU�'���D�n�"�����rכ�6�:@ùY+�n�4� 4��Q��� �9���p}�t�,��G�\dz:fT����P|�|hn�-3�N�T=�q
n4�p�m�H�QY�9	�>6��W��h��[�/jL�����v.s��NR�k�ʟ]��k��pn���8��!��?1�k�_���MCGH��N���a߃; 7g��
�s���)~í-\��|l���WI�+�F�.�7J����|̼o���%��)���E9��mga�=�-h�'��A؆	"}�4(�gۜ��F11���5�����`�����<���䏲]Ǎ��τ����G�\�U��*=���f�ƺ�*WE�rB���O��,�����\���Cl�r=n�-�\�'��'��3/ٙM�O6�wLn���Ѿ�l�����{�8o�����(�3��FSv-�g���-~ť��l�$!�F��gn��Wd�[���l��mQ�iH��Rn�
7(��VVݮ+9��t0���"e���)�d��>���q-��&'q}�]�Fi��*"�E[�> ��f����6n�m�qk�
���۸�����"�z���#�OpD�p9~�G��c���E��L��+�c�J�-�!��H��7
�q3�+��+��
<��Q�D��P�)�E�񮞹_��i>�ݑ5�@�Q��哷��*s�69��č�u9���LD2�ø���#0�W4A[�S�)��q�i���d("���:C��Q7ꔫ���=�b�R�ueYHXZb��)�o���P)�4XT��"��Dhx]�k��e)����2�=��������IE�ϱ�v�`+�3$���0�a}I��R���LɱT������������~H�f�C>�;R�|��ߩ��Cؔ-��D�s��T�D��j3U�I�2+R=�)�����L��ƥ��Gl���a�T��_��Ã�md�P�Rseo�ht��or�H���b�w��TT
��ث��ZD���,	RЄy�8W�6��#�LH�+�j�	�'CDƱ���ư+٥�Q��}�h�Q>�x�"�� ��r�sa���$VGD�>��`Lb7�޲[�ڤyh>i Wh[�k�	|Qq�Gr��k~���C�f�=�7�{��5?6��!Ж�L�e�k�~����R��S��r��݅�8x׸5gv��+��G�K��H�ڬ��	�i.cso���`��շi�f��JSH�~�~?�/�C����P����K�b����'�~�9[�D������S�sٸ�ə������
��,`t��f�ɳ���Wf�E��X��?����wX9t`s���<�p����x��Q]{q�'��e�����!�W�S��W�~X���"�(�`|���v9�-�cZuWp�=
��'!L6�1�4Sq��u�"MT~�.�#�ϒv?a�Iꌓ�9i�F9g���E�n3ב��N.s�9�fݟz�� S��A��0�L��p�`g�d���	G�nJ�g��N`$�g��-��*�z(�|\�N	���kƆF$�����
u��Nx�R%��*Q����U�:��:�o[�,�j�Bxu	!����]��[U	����g���=���-��&��{�9a�0a��K�M��_���<���m���	�T�f>�K�kTQ6"؍H�M���Y�P�ҧL��W�!�n<���XIO����p�M�M����p�1�$Z�G��l�֐��o�CKt�6��t�2�s̀|�a��%M��Q�?Ĥ��	��p1L!,�o�k��YB�
���(Se��rUd�"��b�Θ1�X��s���֊�j(P#'�#)3%�8�;�+a��/;D7�����B��{��Ea,�{�\QF��Q����G�H��RnY/�V�!=s1^j���{�VZ�t^��u��bQ],��bq3�Ǥ�Csa]���~>0���e�x�uybM;|����t0oR,(����s/�����OE�˷w��V����})I��%“҉�^�*�N�]��,���z������á$�01�Ð��lV��T���p�A��# ��,E��Lm%��gi~Mg3]~���+��e�e%-Ǡ�M\Q��j�t�z��xy�Pz�7��m}��P��o��_�\+J�v*|W�|�Շ���nH��:�W$V����W5v��~n�+Eb5MĚ��j��yD�5�c��͍�c��5�o���)�y�_-kDc����J݈毥��)o*���[�д�/����1�������|;4�)mv�
��cz���.X4K��؂����ȗ+n%�҅k�g4Ud�8��gIل�c��1����VTK:�8��Y	�=�ڱ}�T2�J�=��d��h�j\�>���:�ۆ����1�.��`SL_���5"�IY�)�'�4����@Y�Ր��G���#)��:^
��lO}`�lW}�jV"��4?dJ���,�!v7���:��|��!,�ϰ�Mճ:\��@�����|Z�U�����m��hF ��T��g��$���\>�V�
	����H�aua핗5ҴBa;�1��G��5_Si������X���|�"�*�%�+(��&ஒ1�l���F����������ҋ�o{�Q3L�ck��g0&���mg�Kוf�5�S�?�/�U���u3j�K�hۛZ�B�D�}y�—2X�p�h\�`G��o�*�~H�K�[W�����_S��h�o�k�ј�����t�u���g�d&',���ի���ޗ$��Q�sCE;7�2o�7S
.��ߝ�OB5{�+�� ;	_�q�e�|�T#��jn��[>?�bu�/��������c(1����|։��D�s"�\':�	����A�c���P��77���yA�K�[�����A���u�S���O[� ���e����
��X�� |����aoQ^��aoI^���]��a���a���5ox�5+����/�=U*ya��+�����M�<�F<h��kk-�lMz�5��5	-��s0��~��o�_�K�_�x��3���!]}`�=�2�C[����i�z&��
��Z����	̳'y�����%+��q��Z9�⯗�O"��������Ê��z�=�aO�(��1.��H���I�	H��mZb���Ir�Hlq#�Q$���A�|Q$��E�%��$�G$7��fB�Y$`ݜ�"/��H�J/��H�X.�U$^c����k��5�x�~^���M$ޠ�7�˾Yݝo���G�W�s�?oW,�;��W�r?�=&emolmu6���>�j�#����Y��Ӊ�n3�>6�:V��Qh?���<�u�a�]���-F�<q��*Yi��e�̙��L����,����)�Ь���w��E0W��Ӆ?=�3_F�����|����.���N4τ�a(��5t$(�|��@U�~�T�B�r�J�hWԅ�@��@'�S:��*��kWl�L%%�,���m?��ȏ��@9ރ�A�,=���U�ى4�V�Z�^�mT�*�;}P�e�Ê����GiU$�F���	����y�'�7B��mc.N�s���[.��"��z��&�3>�Et�P;����	��z�x��e��v���2�H8i��B<;�eˡ~��d/Q[J^��|�x��weV��T~B��e9��/t����
n���Zj�v��S[�O�+M���$S�/E=�W,z'8s����O��3�z|��s���'���5��&<��]?nJC
�o<`���򍛌����ƍ|������s%� �*�IE�딅�;/-Lr\"q�Qx�4��}�a�7i�E	�c0}Y�	�XV����k�vqKTk�Ƶx�
u�OT
1��!�e�`L���p-?7y���c��p|��¸1���_��2�\FX��cn)�ߤ��U&��A|�Y�3}��G��>��)�%�w�-�3�<&�q|Uڡ>Wd����A��1z[xw���Eb��V	�H䄷Z�9̜S�[��Q��gQ�׌�%|y��c~�π����C���o���_k�WY
�9������D^4s��ؽ���D_⿛̲ˇ��1Mu�%�~�
FV=��&���E)����C�8�R�����cQr�÷�Ώ&}��7�R�|Jp�'�P'�M-&��hV��e��g��i�
�w�r�BW|��;�]�뼈߿r�e�_
*N"\�_�������f�<ʢ�����#���-���hP�m�)������.�I�J�(\α�r��h-��xq�4�G�4U���7M8�����wӌ($q�:�D��'���3�cv_\+�r����Z�ٴ�u#�C�֙Kێ�l���\Dg���!/HH�����87���s��85�cJ<L5N�B<�3�V8�gRf	��;������?q��}���z�-oa󣆄�>Nd��e��bJw�@�2���X�م�7�Φ̬w��l�f��lh�3L=�
L[ރ�2��w�`�Psw,�\���QKs�F����k{�������=h{��ö���Ͱ�Gm�1ۛi{��?����S
a�6V�V�i���q��׳SӈT��`�
�����QI��U^��7U��<�ٕ¿T��:��f�?L�Z�ЯZW�Zp�5/�S��xp=�>���S����R��7~Ϣ/��N�[��p1G�bd�d���*6���eT-�w���+5l��װ�L3��tC'�l��c�߆�rP�z���8�_
��#��
WN�������e�E�B`� ��n�H�^#�FN�J���G�ʰ���c"�w��N��D���؍�t�)��3�͵�7���L�_$p�v@$q�vP$v�����]"�w���7p��y�S6���a�G���0���O�B�׶���ƦVi��r��P9�-�����0(���3E;»��N.s�{ԛ��L,�y�t(��a˞��>š�Lu��w9x��u����εOsZ�9!:���d�q:�u2�Q�~����9�U�t��!��[r�����qRf�#��Ϡ�3��F�Q�k���Ry�0t�N�zSd3���覝�'��y�)�*��, Ȭ*�B�̮�,"��ਜ������;��O�W�]:��e�A�7I������u<m���Nu�+�m@��9��'�gQ�R74=�����U���N�-]Գ����H	�q=N�c��Y�-$�/�˸�/���D���
-�_�7��R|���5:�ih��oY�h������Np�GDG+����z��֟��Υx���M��+��ob,�E�Ɋ��2t
�C��S��_�U�w82���E[��P�N"�����Ȧ+:w���w��4��R��:��~O�uh�:F�l�����XpϷ<�h�"�e-N�=��*���b�]�x'�`�$�x��D�x:��뀬�����Q�x+8��$� ���C(�)�0-���W*�L���a���a����5L���8���77�ܛ렷KN�tf��y0]W2�f�U�#�y��wZ9-�*5Pë)������S�2]�f��u�o[�[���Ó�F����m/�ԝ���
J�[�+�����$��[+?�luB�c!���]�&g۫�rF����)��u��mrּ�"^�g�y�VU���v�=��s�k�t��;�zo��\�8�^��\���(�{/9����r�w��\�m���-}z���3�)�!�Sc��6���\�k���m�*�ob�]b*����(��"�Gx/
���ջ���.�ÑhS���<��-ډ��y��W$���Q�>��/�/�����<�����W5�ƉZ�Zc��Zc�i<����7}�q�Kv@$
o��m�������d{��� ����d�w��-G?�:^�+=fǾ��~���_s��m�a�\�����$��h��� �+u
}��� ��"L�9t[��'�,�A�[u�gob!;�7j-\��_�0h��]���ߟ���_<I�	5n2w:S�����X�x�^[�m�:��\=Y����	xtjJ*i��C����o�KW�It~�3ʏ+�8Z1�ъ!�r�-'
�dDEd
��)ms'8�-�Np�61�u`t��Ȉ:�d���JR@���q����rTff٥յՉ#��ZebM&&���3��Yp\��je���U��\v�ڲ�%b/˗�J<�J�tbz����	Hpb��(����d_m��kHt2�ԉ�rF�W>2=Uqdz�td�q���J�{�a���T�p����������A�|�+�:q��O\�4ХW�����Ou�*R��+�C�‰+*N\��s+h��:q�o�E%^>q��)��Z�#���N\���|�z
'�_��k&�1�N\OC6���ɳ���O��߭�O��Z^����=�,�����*����{M$?`e��"���7WK~(���]$��G$�hɏD�c�-���'�ˉ�'"��
"��H|&�.-��H|.�~��\$�oP$���\����%�;D���Q�8&�}"y����湠9�l��6���y��sC�Əj���Dž�_��E����H|)���%�P]�R���k�����-%�Z��9��g�"�̨:��N���.|{�"�n6U���,y
B��R��E��r|⯔���R�x�8
��t��?�:,��z�r
����Zdb�VJ���n�������l�u��(]:rC�aj�PS&NXSa��I��
&?��#_D:̿a�#G^��ؑ�,}���?uZ?%6k�i�����3��;�����8�+�M�?Ӓ_p�㨓9F��N�	�s���|E���~�9m�)brO��0�毷��'�]���sg��~����9��NH�m�a?d.����ts�k�;�\f�+e�;���m��G��u�]��{�ieQRl����ݔr���r:���Q$�x�㐭�8�k$m�Ǖ8@�>��/�;\B��^<	�.^�c���������P��X�>"�R��	�%��\Y��pa�vц.����Ou3���6;�5I�ްY��b��@�)�޴Y��)�����Q�C���!�zo�o2��C�"%5�2j�d�I�b���;W\w�8x���\�b�F�T��I,�n��W߬�Ŕ�˹I+K�����ߡ��]�	�~w:�>�w9�^�������^�YnH��8��ʡ��2c�4w
���p���
O<��瀆����o�Z�r��3��J���8��l�?%�Ɵy.�ƹEO��^뿠�Q��7��#�W���)���u��AT����'J�Ǽ<��n7�����n�m��4�G�D�}��>`mI�B�Ժ����,��GN�"�.vQ�\f��\���\*Fr�_L�YN�V���������jxy��\Ź�
�Z۶����͍,+?����xr4Q�x������g]�b���Ƣ�(G�Z�= %E�����Y�]ZJ$�M��k�\�Z�o�u���d��j��a��|./Lyh�yľs��Q�3=.�I�-7
�j�c%X���ڥ�
Ud�VLi%����VB��h�/@�
��"�sA�wXNP��&�T�ƻ��P�M�s�|ay���n�lk��j�0��|��y��*P��c�?o���{ɠW����E6�
ČG��^��`��!X�!�� ��c�)?\�4��x�'�9�;)�(`��yѝ�ot�Kn�F�j�`��#����orY��Qz�'\��h�솔�c���]����*��G��c�[����U��NW)>6�J��Q����R||��T��]�iZv�i�۩<\���o���3�S,`�u}f�K��t�z\��}�w�.�eWG
֫��j-[���Դ���[��sܩ��h��[�����b'�u�����N���BM����yͽ���u�����[�{�&6%��!���8�8)�pqJ$N�����E���38�8#߈x4��H�q+y��>'��K����xMr�����������Ѫ~,�:�|�CM�oaÜP��D½��!Q^�
��� 
B���/�R*ꢿ0����x�d����U+�R\Z�K� .��w�͚2��ty:=~0�<|L(�~Nt|Cb�*��9�?'��Qdl�M�u�N��^��ο�����aʼ:Ȝ�,K����Oi��!�_C寚��[��ͮI�����A7幗p����zU�{�R!_]�n�p��g�ava\����"\ȼ�fքKAȾ*H���V��w�b�σ�8d�Ÿ��5yBT ]�u�߅�fY!�*�ʵݻ<h|rE��7�/�
�=�U�\��!-��'��>�G"��gH8�-��T����ljh���l��2�h������G���"7�� ���G|��B�l�-�0���lm�Kxsn�=��ݐ_p�h}-�m}����㶾C�~��nf�B;ݶ]�@vdOd/A�UA�ck��$ȡ$��Av���Z�}����o93_8�O�>sw�������n�'��
��Sބ���ԍ�2����]��[���VƏ��qp'$�//������%)�'���m��T�S.D�ϸ蛹��n�k�?��`P
~㪏Y��,��rq�}�k<�SP���w��~��C�9$��+>�����L�)ẳ���)(��ej�yM囘��|Tt:���]�G����V�H&�k)�:	�RJ�pOM�.�t������T,�
�F��`Y�Ppa�W�G�h9~�c̯��6s��`Q[O�`�jdJ��%`Z�2��[��I��2F*�������\�5�~
[��+����ܹ���關�߱���PM�g��5 ��@%8�v%u�#5�$��Y��m3j0��9���e�P�%Q�I��<6��S�`�TS�Q��1�s��V���'8��<_�d�ǃ*~]�
g֔x��3��Tͬ���5�U#K#A��C�8�!�p۞��8�vie:8��Ζ�g��({9?G�g�w<�*ޑK�<Y�N�θ���Y����a�@�pyM���U����-�k4�%
j欛U��<�G]�[wo��K��'�[K�ٜ�K�gO��=Ş=��{��P}��7�	�_�ꗿN���귿�����	��7��.������"�&bigplay.svg000060400000002022152455615120006712 0ustar00<?xml version="1.0" standalone="no"?>
<svg id="bigplay" viewBox="0 0 100 200" style="background-color:#ffffff00" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="100px" height="200px"
>
	<g id="dark">
		<path id="Polygon"  d="M 72.5 49.5 L 38.75 68.9856 L 38.75 30.0144 L 72.5 49.5 Z" fill="#ffffff" opacity="0.75" />
		<path id="Ellipse" d="M 13 50.5 C 13 29.7891 29.7891 13 50.5 13 C 71.2109 13 88 29.7891 88 50.5 C 88 71.2109 71.2109 88 50.5 88 C 29.7891 88 13 71.2109 13 50.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="0.75"/>
	</g>
	<g id="light">
		<path id="Polygon2"  d="M 72.5 149.5 L 38.75 168.9856 L 38.75 130.0144 L 72.5 149.5 Z" fill="#ffffff" opacity="1.0" />
		<path id="Ellipse2" d="M 13 150.5 C 13 129.7891 29.7891 113 50.5 113 C 71.2109 113 88 129.7891 88 150.5 C 88 171.211 71.2109 188 50.5 188 C 29.7891 188 13 171.211 13 150.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="1.0"/>
	</g>
</svg>controls-wmp.png000060400000012607152455615120007726 0ustar00�PNG


IHDRddp�TNIDATx��\Dd�NC+c*�)�C�a*���"b�(J�1T���4$�d����n�DC"""�$"�Ȋ�׾�����vw���v?<ν��sN}��9�f��z��8Z4�Ã�W>�4���U����mX][_�������j5�V-�	�j�ͩ�Za���c�����*���<�y�1D�7��������h����v�?`m�3�m���Q�FC��]�yd�^���bB��u��l!J�"!$«5��	�t�����>bs���X\;B|�P��V֏���/q||���3����%1���P�?V�t|��KY�͖�s:z��ʽ������G��#���ʈдɩM����;��
	����Adv;5b7���`fa��#쐜֏���:�Y�]#o���	?~L������~ HB��XDz�����z���Ab�X93�(&��	��
�bw�����g&�s�^5�|���Y���VQ�^��3��k����᯿�Jbgg��*h��I��a|��`2O��F
ɼ���E�;����דQס����ͨX����n��t��`f�M!��-n�Y&ϨgG� I$5�~���n����7�D��S�Ç��T᪻�������I���!��;B���b2:5mt[�]=TN!ıa:X���i��Xpj�t��-�'`��Yb�[rؖ���>6�.��V�����N	!$��p(;�xp�r��+�;I�i{���ա��f�a��}����~G�"B�_:L��W�ɷwz�a:�g*�	q�"��$�Y'��{�'`���9�V��I�Ek;猔MN��x���������[����!I��+�E�d*�$J�#ee�>$��E����ΤL�_6��|���9���8A�i3[I"��X::��5���Kz��YK>�=lK�R��BRVw�ЖPY�F����w�����(R��U�ǒ�UT��`ii������}��f���X���G�@�U�+�zH[\?�b�chB�����Kg�(��>:�7�B0�ku�k���'9�G"	E��JWc�ƥ�p���ڛ�T��)!�ԕW�*;[9}��7YvK�@�7Z,E_ڤ� �`0d���	�]��a��I2}j�p��lh��**f���["� ��Dx��p&��������R]#�
�D����-12ܱm�-��>�78��r��!�*$E ��oY__�Ye��&��H9�괼<���oVY�~�gppp@�WWWQZZZ��W,?~rB�/xK��.��I[q�8||ӻ��nF@�o�W����	�t��Eb�Ë
��Et
H
�z�B����Q�D7����gy�y�֎F�k�}���WNn6�����b_�!%%�H��a"mH�]�Q�f4s��)�y��pi~mstƀA�E���#��k�"����s���뇳h�h�M��?O(o�-�C�oR�Cb��Rm�%��G/��W/�f'���\ҁ�v��g���*t�|���S��/+G�$H*��vꇇ�x��X��Ez���F��+��12�Q���'�[Gҩ��\:yM�G
[�G���?��<<Z���Yb�-iS�f	�~CJ�
3B��CT;�P�p:�(F�Q$��gY$��孤��qppb���N�McZ��b�$�dDnɘ2V�AzI���O�#!òQJ	Y�/�l2ZF���-�(R�#��%�H
��.!e�C�D�D�����6�j{���io����W��G�Zg�?���ad�Dl����[#V	E�U$f�N}'#����0[FS�(Z9�xe~a�-���X�}��(�H���;/K`��L�ӛ[g�3���5��.:�;"i�N�q4�`��d뉢�A��'NO{�p"��h��F�̢�mz�I��M�s�����A[�;�ٺ���c��7�:����M�xFh�{�j��^O��aE�
�ȯ#ja�x��"#�W�`qP`
�e��W}8{�$~�}o��y��B�;�R>��T?��ں��Y��Y��4�c��8\�58|q�4G�g�hՐG�m�mA�QT7Hb�_��SƸ��mbfK;LҾ�6��������/��Cym?��e',I1~ɗՖ�ONF����BܟC��G�ڧ�[1�\˰‹���v�!F���K� 
���ģQ�2�"�\{ӗ������G��lS�d?�~@54�/��|@%d�p���A�DGk[��� �
�!��>��a�i$d�
�TF~=	��!���5^\\\d�ӳs��QX���	g_����r
���널A��\j�߾���n�h���E�%�~(���*"�B|���FFHN�F��8�d'��w�Q@6��W�p��o�]rF�}������P�mj�m3!}�Ւ�j��!�(����C����$���*"\n��
F��oooOE��斚�ZZZH�o>�T:ڵ*[�����S�u��s���8��;GP�Fa�
���H[���Bbs�v�k��QCA�ٞ�y�G^�(������R�����w�]�I���\���W���E0Te�h������?tY.�bC�%Bg���1�Q��k���WCa�(
_��0��C������
��&M�)�i��v�؏sF�rm#*B̕��L��ѡ�C�>�mjn�kuJ�aM���+y-/GuMM��?lY5�Yc0T#�v���0�J�%
an� �(h���f:��lJ!��Z?��I"YW�eV�"�MT����Q?
%51T�������Ppyy)Ó\KĤ���ߟ��Z?����m�Ë&:�eF��M<�0���m�(h�B�k
�W�8�����:��\�����&��ۑ�b�6�p�����H����1�r[?�<$y�t6�5�M�DX�%r�׌�?$B�^�j���I伦��0�ky�y��`��"�Caj
���I�nl�9����I7|�n�K֑�잕������y�5������VP�<�R~�;B�"�����WC���I У�FFF�4X]O���ߚ�V���Ok�o���½��-���V����}���e�[;���C��<�oB��(
��S"�K������}�x�\�-��x��r7������\%&�U�� ���]"C�F�{�^
�ͯ_'WY����y���94� �d���e�v���Aa�K01�[G�C��Qp��E��6w�y�o�m��ޚ��>V`���vg�
��^}@��'9gMMM%�!LU$����f}���~�Ԏ]��ڭ���a;��a����߄q`FI�6�׻�`�Ik*�gz�K�ԻN�N���m�
z6���0�]Beh.�[Zۋt�J��ח��:�� �t�e	�&�7--�GQ����O�
��u�]�z��:�;�
�!/���.̡����6����g&B��*���܅!����:>��%BB�i�q||KKK)ϲ��rF�AEƟj%6�V��Q��'TϞ#[ۇq���x9y�����`��E1�rtO�����/�g=b�u�F��!L�00*ʣ�K\�ѽ��V!G0��w�+D���ƭ�z��m_�y�
��1���c��ܠB0}t��B��B�>Y>#8��	��Ǫͺ��|��%�x���C�[��M`l�=G�a]�@I�e���,��j�Ւ���
��SI���g(����st����k4��t2ҵR�[�h�����O��3�Q����!I��sԭܠV����{!DZ�Q��%��׈~�c['�r�V\�����
�;���9D�O1�����k�7>���B
a��<y�m���g��dv���K(����шn��a%��g٤J���#&�Ƈ�p�!b��3fH@��0�sB"�(k�Cq�G'���ъl]�i
���!8����b�0t��;E�����/��=��n�����rd��Vq;�(](�$J�>����*�
�
~�W��z/�͖�,�t�OZAA���
Kn
���:u�:u�:u��t�:u�:uuM��F��v�N�m�t��M����H�ze�n?M�^N�z�OЩ;�S�d�h�[u��'Щ�R�^�U�g����[3�*M��h���QQ�5Z�o�
�Ϛ�őm�4d�Щ[~�N�����o�ߦG�
�E��Nݚ�[J���_ԩ�wx�o�S/��-�S/�N���;��p�F����'�vm��N]�U~���)t�����_e�t�&�ԑ�N�+��T��A���<�3�Q�T�U>M���^�:u}�N�$]�z���5Ѭ�������y֛�D������e�@�N�� �5��E��TF�2ѩW<S:2ש7w�Ԩ;�!����,o��D�n�td�So���W�$D����T����ȠN�E�:����?`w��?�TKYΟ��u�O�S�pR:�����T��u�,�l�62ѩ;t�z:uj�S��!��(���r�jC�y��ѩ?'B�S7W��р��Tئ.7[�(d��cf{i�ԟ!!���E�.R� ��4H��<���mճ�t��iy�N=��]4}?���y5�ԛ���X?I���O:��HH�:uj�S�%����IG3MUnf��F�EDA�Pz:��c�שS��Rx����0�;R�3�K�g�S>�x�:5�ė��FћI�)�e�S�F����N�d����#�"�3MY�z��ԟ�Q��e�S7��K��f�����.75�g�S�6�q<��{����MM�)4@�U��=�Lt�UY�٨S/JW�nz�����{��&]�{ʇ�֩[m�gMu�yԩk����丣F�,���&ޛ�O��J��-��1�y��t��Y�)�z!u�ZZ:�.�9nNʮI��;�ѩ�:翖{�v��֩3:r�t��ĝ����t�F��G���/�Թ�k�e
)t�&�Ե_�Sת_�C�C:�<�Ե_�S�H�9K��t�F�Ե'ԩkԩk_UU������v�\�Е�#^׋'Щkԩkԩ�C�c����M���:�⟠S7Q������3�ԋ�S��N��:��ԩ�t{:�N=�:�Bjҋ�S/�F]�:u�G�z!u�?��z��nf��s���}����p��݆��|�d��Ϙ�]�/�<��t/bu�
ٳO�9�z�>ay�����V���X=��x��Ub�~��|q�#HJ��W'�g[k���A[�@��9�b��Ej��3��r�}H��N�϶��X��0v![�;F��$%XF� ��U�Tx6tB~���K��<$v�=x��A�I�.�?���	��fiB��%�a[�F��è%7>�:������o�Z�S��K
)�gԳ�6=:��rJ:PҶ[������`��39�:�馛n�馛n�馛n�馛n��j��/[���P�IEND�B`�controls-ted.png000060400000003027152455615120007673 0ustar00�PNG


IHDRdtD�g��PLTE�����������������������أ�������������˴����ީ��������������rv���������̌�������WWW���������}}}�������36��ܮ����������iii������������___���������������֕����������������似���������������ѫ����ϵ�������㝝�������������www�����ٸ���������������І�������������������׻�������������������р��������vvv������������333���������������������������������������������fff�������������������/�tRNS@��f6IDATx�행S�Fŷ�}7m�&i!$�!	�}lN�>d��T�.���xw��R/��j�	��~�[����� B|�)BȬTv*5!�/hH�J�T͏
Ș6��
�0m"��q�~e�ʙ`A�z��ݖ|>�r�A�^@+/��
�!���u�vݻ�KB��$�����O����j��7�e�9���&M!}�>�����t�ţ�(}�!u|�!k�jukkk�ѣQ�Z�~NY��ZcO��_M
(U,UU��.��b2��&�V��>%'Ch��0u�H�a,WG&�~�,�omݼM�&K�RI+��(�(���a���|��܉�� �d�4M5a��0�����e�Ǜ|�vv�D�i2ﺮ:��p��u���|�v�ϺD�i�iY�:a�ɰb�[���
^o6�t�����D�yN�t]��r{�zN׷A���xk����z�u"��ty]^H�m��lvc}}#gۻ_�v�o�V#P:C~��\i!!=�ϋ�s92o
����ѷpo��뽅���/�P��	+|A���9g�^�,��y[����hf���L� �97������fhγ�<s
�C8۫� ���C�j�);a�!!8�H:�K,'	�H8P�_��Y	Z�ڙ85X�p�A�_�cà��@-�0H8x��1t
�̽���"�9�|�\����������q�Cb�����b�28�!%b�����Q�+]�1Y��t2�4f����\L'�AYL��B#�!��N�Ï�8�!:1���X\й�!6����w,v��!�9�<�b��R��MB&�#����8S�p��}$�6<�p��dY�$����7!�e	B��
e#ޏ�ҡ!��?E���ʡi���7D!�k�[��(�}
�<9;��}��C�4�~;�h��!�W0{�M�?4��L6�!������PN�g�i"r�'wS��|H�D"���N.���w]�[���#�D��I�$j5��DM�&Q��I�$j5������>�W�IEND�B`�controls-black.svg000060400000024150152455615120010206 0ustar00<?xml version="1.0" standalone="no"?>
<!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#00000000" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="144px" height="32px"
>
	<defs>
		<radialGradient id="gradient1" cx="50%" cy="50%" r="50%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/>
		</radialGradient>
		<linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#000000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#484848" stop-opacity="1" offset="99.4444%"/>
		</linearGradient>
	</defs>
	<g id="BG">
	</g>
	<g id="controls">
		<path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#000000" stroke-width="1" fill="none"/>
		<path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#000000" stroke-width="1" fill="none"/>
		<path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#000000" stroke-width="1" fill="none"/>
		<path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#000000"/>
		<path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#000000"/>
		<path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#000000"/>
	</g>
	<g id="backlight">
		<g id="off">
			<rect x="83" y="21" width="10" height="6" stroke="#000000" stroke-width="1" fill="#333333"/>
		</g>
		<g id="on">
			<path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/>
			<rect x="83" y="5" width="10" height="6" stroke="#000000" stroke-width="1" fill="#333333"/>
		</g>
	</g>
	<g id="loop">
		<g id="on2">
			<path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/>
			<path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/>
		</g>
		<g id="off2">
			<path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/>
			<path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/>
		</g>
	</g>
	<g id="cc">
		<rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/>
		<text visibility="hidden" x="49" y="17" width="14" fill="#000000" style="font-size: 10px; color: #000000; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text>
		<path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#000000" stroke-width="1" fill="none"/>
		<path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#000000" stroke-width="1" fill="none"/>
		<path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/>
		<rect x="49" y="2" width="14" height="12" fill="none"/>
	</g>
	<g id="volume">
		<g id="no%20sound">
			<rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/>
			<path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/>
		</g>
		<g id="sound%20bars">
			<rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/>
			<path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/>
			<path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#000000" stroke-width="1" fill="none"/>
			<path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#000000" stroke-width="1" fill="none"/>
		</g>
	</g>
	<g id="play/pause">
		<g id="play">
			<path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/>
		</g>
		<g id="pause">
			<rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/>
			<rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/>
		</g>
	</g>
	<g id="fullscreen">
		<g id="enter%201">
			<path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/>
			<path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/>
			<path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/>
			<path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/>
		</g>
		<g id="exit">
			<path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/>
			<path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/>
			<path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/>
			<path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/>
		</g>
	</g>
	<g id="stop">
		<rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/>
	</g>
	<g id="chooser">
		<path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/>
	</g>
</svg>jquery-3.2.1.min.js000060400000251234152455615120007653 0ustar00/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
$j = jQuery.noConflict();bigplay.png000060400000005671152455615120006714 0ustar00�PNG


IHDRd�)��sBIT��O��PLTE������������������������ZZZQQQJJJAAA999333)))!!!������|||ssskkkfffZZZQQQ�����晙����������|||�����浵���������������������ž����������������������������������������������������������?�PFtRNS""33DDDDDDUUUUUUUUUUUffffffffwwwwwww�����������������������������E+:	pHYs��~�tEXtSoftwareAdobe Fireworks CS4�ӠtEXtCreation Time11/19/10-s�1	�IDATx��{[��mE��2GA���]����ʊ�Pg��N.o�73I&���c�ji&����M>��p�Ϲ�B��^-7*� B
ĩ�]_'���̨#A�� [�{7[o:�$ٮg_��S�#~�m�43��Jǔ��r<�f0���cJ��K,�U��gy�1���I�[���^0C�/�}$:�u&����T��\4u�j]̷ R�L��r+�z����\�`��4��h����
9�o�	���hPcɿ��5-��9��,�)�q������t������3F�W.I�!9dB��g_P�Mθ�&(}�d0]1�̇B?T��4F>�J��0G��b��@��3s�>r��)�1��(O�BQ��&L���ƴ�Yn�Qn�> 1� �*���('�d2'DB�����J��Z��v��R^D�3e���{v��Nn��l�I�li�9|�i�
Z4*��K�zVҒ�ˬ4�F�fFP�����DVw�� $o\[1���mo�iq{."�s)��F���9�]��u��=I�i	��Bm�tm� �$���s��.���K7�h�X�Ι�����Y�gF�m��{C驍� �4&wQNb2�ʬ/�B��F1k����q�x0�V�"m�!d'ywFs_��B��;چB5c��WT�/&}����E{��&��-���o&}�L�m��2
����Uw�ɚ�&sƳ"�~!{V����j��x��i8�+��7�!:���(���h��BL���Z��H��ݖ�~���C<$i�$��������B��ͮ.��B��v�`��	[0�KZ�����I��J�4�o���zr�t�z^��sy`Ѣs/S�Q���Kk�����$ZV�H�|�+�"v$b�H�=�t���_�>J�j��;|J��F�S8��5q��ā�m��~�VW�,�z�ՁN<�{�ٴ%E����.At+��KsA*
�a���9�����\=�b�+M�� Y�/K�؏Jծ{�j\�7X'�3���CK�.��m�|�d���oF�Y܋�'FQ���u�8c��U�ɶD��)JQS���^�Aa��Ld����s�
c<��rB�(g�C�<�лB-P�N޵�vj!�:�y���l�����R�Ny�Iq�:����_�1����g�V�t�z�.z��0�.��)�kH�˛̓�����g��z �<��ξ��Q�H;���+/�R���������_�%~�i�`��M�
CW��s�y�R-}(�e�n_sOsB��n۞���ant=_�8�zr�B5!���v����f&������(��1u��i�a�\�#T�P�QU t��%f��}q�:��S5�c|���1���Sn�P5��w�r�
ĩ�]_'���̨#A�� [0MW���4�7��0���q>���w��tLi1�*���|s �q�cJ���&U����c)D���Ι!�sb��4�
b�a��e|�u-b'�S�A5�{�hn+�<��&6�4��16�E���&ţ�b,��
p�e1�Y�S$#Z�O#-��!1�U Egp1�$%���#&�*?F�1��/Y�*�(�C��
��9�Jd�+�1�„ ��9ԡ)�1&b�i�(�1�1li�
\NR��`�PEќ���!�R�Y�nM�Be$ϰ��V�GbsH�^�@#v2R_�  �Z@�"m�M#�:e�DA�g�*x���TC�0��68u��ե� o`�`�$����a�!�~���SFgb7�i�X� 2�����VA��� 9H����1�}D79��
,'�@�C ��0x?��@ܡ&�BLcrg�9���H[/(f��1�3��f}�j��;��$�΅��юS�B5c�������#�<m��y(}gh�2�
���2
2��Y��xuCȎ4Ө���@�&F!�4�*-�B�o��3
�= Q ���UQp/7Ds.?1A(���	��
	�b7����%I�MJ��=�g��.��=�%��[����lp�o�z^����t.��=�/�Q�A�hi��H_aG"��sǑ��>��w���V�:rS�P}����[�,���tu��uBg�� �����s�Q�uN3�BϬ��_^��S�E9�=NӢ+��,8o��રY�IM��đ�z�=����(�8��Gq/
���2����WǷehx5l��4�x�n�����[���#���&$PƲ_�lt���9�Q�-��h��-�"���&;x�Z���A��^��d	��}����^ �/�
���8�?;5��F��f�6��zڐ	ڛ�Q:�񂾡,��A5��Nj�H�(�П�&e�M����Z�P>�0�F��9 �F��/��K��ƻ=Ja����
͌7�E%��:���Ž:�1sp	(�8P%C�GmT��9�{����ɏ�6NՄ��1�_���I���JIEND�B`�controls-red.svg000060400000024150152455615120007704 0ustar00<?xml version="1.0" standalone="no"?>
<!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#FF000000" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="144px" height="32px"
>
	<defs>
		<radialGradient id="gradient1" cx="50%" cy="50%" r="50%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/>
		</radialGradient>
		<linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#FF0000" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c80000" stop-opacity="1" offset="99.4444%"/>
		</linearGradient>
	</defs>
	<g id="BG">
	</g>
	<g id="controls">
		<path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#FF0000" stroke-width="1" fill="none"/>
		<path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#FF0000" stroke-width="1" fill="none"/>
		<path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#FF0000" stroke-width="1" fill="none"/>
		<path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#FF0000"/>
		<path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#FF0000"/>
		<path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#FF0000"/>
	</g>
	<g id="backlight">
		<g id="off">
			<rect x="83" y="21" width="10" height="6" stroke="#FF0000" stroke-width="1" fill="#333333"/>
		</g>
		<g id="on">
			<path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/>
			<rect x="83" y="5" width="10" height="6" stroke="#FF0000" stroke-width="1" fill="#333333"/>
		</g>
	</g>
	<g id="loop">
		<g id="on2">
			<path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/>
			<path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/>
		</g>
		<g id="off2">
			<path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/>
			<path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/>
		</g>
	</g>
	<g id="cc">
		<rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/>
		<text visibility="hidden" x="49" y="17" width="14" fill="#FF0000" style="font-size: 10px; color: #FF0000; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text>
		<path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#FF0000" stroke-width="1" fill="none"/>
		<path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#FF0000" stroke-width="1" fill="none"/>
		<path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/>
		<rect x="49" y="2" width="14" height="12" fill="none"/>
	</g>
	<g id="volume">
		<g id="no%20sound">
			<rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/>
			<path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/>
		</g>
		<g id="sound%20bars">
			<rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/>
			<path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/>
			<path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#FF0000" stroke-width="1" fill="none"/>
			<path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#FF0000" stroke-width="1" fill="none"/>
		</g>
	</g>
	<g id="play/pause">
		<g id="play">
			<path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/>
		</g>
		<g id="pause">
			<rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/>
			<rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/>
		</g>
	</g>
	<g id="fullscreen">
		<g id="enter%201">
			<path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/>
			<path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/>
			<path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/>
			<path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/>
		</g>
		<g id="exit">
			<path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/>
			<path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/>
			<path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/>
			<path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/>
		</g>
	</g>
	<g id="stop">
		<rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/>
	</g>
	<g id="chooser">
		<path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/>
	</g>
</svg>mediaelementplayer.min.css000060400000046463152455615120011725 0ustar00.mejs-container{position:relative;background:#000;font-family:Helvetica,Arial;text-align:left;vertical-align:top;text-indent:0;}.me-plugin{position:absolute;height:auto;width:auto;}.mejs-embed,.mejs-embed body{width:100%;height:100%;margin:0;padding:0;background:#000;overflow:hidden;}.mejs-fullscreen{overflow:hidden!important;}.mejs-container-fullscreen{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:1000;}.mejs-container-fullscreen .mejs-mediaelement,.mejs-container-fullscreen video{width:100%;height:100%;}.mejs-clear{clear:both;}.mejs-background{position:absolute;top:0;left:0;}.mejs-mediaelement{position:absolute;top:0;left:0;width:100%;height:100%;}.mejs-poster{position:absolute;top:0;left:0;background-size:contain;background-position:50% 50%;background-repeat:no-repeat;}:root .mejs-poster img{display:none;}.mejs-poster img{border:0;padding:0;border:0;}.mejs-overlay{position:absolute;top:0;left:0;}.mejs-overlay-play{cursor:pointer;}.mejs-overlay-button{position:absolute;top:50%;left:50%;width:100px;height:100px;margin:-50px 0 0 -50px;background:url(bigplay.svg) no-repeat;}.no-svg .mejs-overlay-button{background-image:url(bigplay.png);}.mejs-overlay:hover .mejs-overlay-button{background-position:0 -100px;}.mejs-overlay-loading{position:absolute;top:50%;left:50%;width:80px;height:80px;margin:-40px 0 0 -40px;background:#333;background:url(background.png);background:rgba(0,0,0,0.9);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.9)),to(rgba(0,0,0,0.9)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-moz-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-o-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:-ms-linear-gradient(top,rgba(50,50,50,0.9),rgba(0,0,0,0.9));background:linear-gradient(rgba(50,50,50,0.9),rgba(0,0,0,0.9));}.mejs-overlay-loading span{display:block;width:80px;height:80px;background:transparent url(loading.gif) 50% 50% no-repeat;}.mejs-container .mejs-controls{position:absolute;list-style-type:none;margin:0;padding:0;bottom:0;left:0;background:url(background.png);background:rgba(0,0,0,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.7)),to(rgba(0,0,0,0.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-moz-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-o-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-ms-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:linear-gradient(rgba(50,50,50,0.7),rgba(0,0,0,0.7));height:30px;width:100%;}.mejs-container .mejs-controls div{list-style-type:none;background-image:none;display:block;float:left;margin:0;padding:0;width:26px;height:26px;font-size:11px;line-height:11px;font-family:Helvetica,Arial;border:0;}.mejs-controls .mejs-button button{box-shadow:none!important;cursor:pointer;display:block;font-size:0;line-height:0;text-decoration:none;margin:7px 5px;padding:0;position:absolute;height:16px;width:16px;border:0;background:transparent url(controls.svg) no-repeat;}.no-svg .mejs-controls .mejs-button button{background-image:url(controls.png);}.mejs-controls .mejs-button button:focus{outline:none!important;}.mejs-container .mejs-controls .mejs-time{color:#fff;display:block;height:17px;width:auto;padding:8px 3px 0 3px;overflow:hidden;text-align:center;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}.mejs-container .mejs-controls .mejs-time span{color:#fff;font-size:11px;line-height:12px;display:block;float:left;margin:1px 2px 0 0;width:auto;}.mejs-controls .mejs-play button{background-position:0 0;}.mejs-controls .mejs-pause button{background-position:0 -16px;}.mejs-controls .mejs-stop button{background-position:-112px 0;}.mejs-controls div.mejs-time-rail{direction:ltr;width:200px;padding-top:5px;}.mejs-controls .mejs-time-rail span{display:block;position:absolute;width:180px;height:10px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;cursor:pointer;}.mejs-controls .mejs-time-rail .mejs-time-total{margin:5px;background:#333;background:rgba(50,50,50,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(30,30,30,0.8)),to(rgba(60,60,60,0.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-moz-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-o-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-ms-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:linear-gradient(rgba(30,30,30,0.8),rgba(60,60,60,0.8));}.mejs-controls .mejs-time-rail .mejs-time-buffering{width:100%;background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:15px 15px;-moz-background-size:15px 15px;-o-background-size:15px 15px;background-size:15px 15px;-webkit-animation:buffering-stripes 2s linear infinite;-moz-animation:buffering-stripes 2s linear infinite;-ms-animation:buffering-stripes 2s linear infinite;-o-animation:buffering-stripes 2s linear infinite;animation:buffering-stripes 2s linear infinite;}@-webkit-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-moz-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-ms-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@-o-keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}@keyframes buffering-stripes{from{background-position:0 0;}to{background-position:30px 0;}}.mejs-controls .mejs-time-rail .mejs-time-loaded{background:#3caac8;background:rgba(60,170,200,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(44,124,145,0.8)),to(rgba(78,183,212,0.8)));background:-webkit-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-moz-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-o-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:-ms-linear-gradient(top,rgba(44,124,145,0.8),rgba(78,183,212,0.8));background:linear-gradient(rgba(44,124,145,0.8),rgba(78,183,212,0.8));width:0;}.mejs-controls .mejs-time-rail .mejs-time-current{background:#fff;background:rgba(255,255,255,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(255,255,255,0.9)),to(rgba(200,200,200,0.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-moz-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-o-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-ms-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:linear-gradient(rgba(255,255,255,0.9),rgba(200,200,200,0.8));width:0;}.mejs-controls .mejs-time-rail .mejs-time-handle{display:none;position:absolute;margin:0;width:10px;background:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;border:solid 2px #333;top:-2px;text-align:center;}.mejs-controls .mejs-time-rail .mejs-time-float{position:absolute;display:none;background:#eee;width:36px;height:17px;border:solid 1px #333;top:-26px;margin-left:-18px;text-align:center;color:#111;}.mejs-controls .mejs-time-rail .mejs-time-float-current{margin:2px;width:30px;display:block;text-align:center;left:0;}.mejs-controls .mejs-time-rail .mejs-time-float-corner{position:absolute;display:block;width:0;height:0;line-height:0;border:solid 5px #eee;border-color:#eee transparent transparent transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:15px;left:13px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float{width:48px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current{width:44px;}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner{left:18px;}.mejs-controls .mejs-fullscreen-button button{background-position:-32px 0;}.mejs-controls .mejs-unfullscreen button{background-position:-32px -16px;}.mejs-controls .mejs-mute button{background-position:-16px -16px;}.mejs-controls .mejs-unmute button{background-position:-16px 0;}.mejs-controls .mejs-volume-button{position:relative;}.mejs-controls .mejs-volume-button .mejs-volume-slider{display:none;height:115px;width:25px;background:url(background.png);background:rgba(50,50,50,0.7);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:-115px;left:0;z-index:1;position:absolute;margin:0;}.mejs-controls .mejs-volume-button:hover{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,0.5);margin:0;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,0.9);margin:0;}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle{position:absolute;left:4px;top:-3px;width:16px;height:6px;background:#ddd;background:rgba(255,255,255,0.9);cursor:N-resize;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;margin:0;}.mejs-controls div.mejs-horizontal-volume-slider{height:26px;width:60px;position:relative;}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#333;background:rgba(50,50,50,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(30,30,30,0.8)),to(rgba(60,60,60,0.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-moz-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-o-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:-ms-linear-gradient(top,rgba(30,30,30,0.8),rgba(60,60,60,0.8));background:linear-gradient(rgba(30,30,30,0.8),rgba(60,60,60,0.8));}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;background:rgba(255,255,255,0.8);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(255,255,255,0.9)),to(rgba(200,200,200,0.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-moz-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-o-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:-ms-linear-gradient(top,rgba(255,255,255,0.9),rgba(200,200,200,0.8));background:linear-gradient(rgba(255,255,255,0.9),rgba(200,200,200,0.8));}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle{display:none;}.mejs-controls .mejs-captions-button{position:relative;}.mejs-controls .mejs-captions-button button{background-position:-48px 0;}.mejs-controls .mejs-captions-button .mejs-captions-selector{visibility:hidden;position:absolute;bottom:26px;right:-51px;width:85px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:10px 10px 0 10px;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li{margin:0 0 6px 0;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label{width:55px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px;}.mejs-controls .mejs-captions-button .mejs-captions-translations{font-size:10px;margin:0 0 5px 0;}.mejs-chapters{position:absolute;top:0;left:0;-xborder-right:solid 1px #fff;width:10000px;z-index:1;}.mejs-chapters .mejs-chapter{position:absolute;float:left;background:#222;background:rgba(0,0,0,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(50,50,50,0.7)),to(rgba(0,0,0,0.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-moz-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-o-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:-ms-linear-gradient(top,rgba(50,50,50,0.7),rgba(0,0,0,0.7));background:linear-gradient(rgba(50,50,50,0.7),rgba(0,0,0,0.7));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#323232,endColorstr=#000000);overflow:hidden;border:0;}.mejs-chapters .mejs-chapter .mejs-chapter-block{font-size:11px;color:#fff;padding:5px;display:block;border-right:solid 1px #333;border-bottom:solid 1px #333;cursor:pointer;}.mejs-chapters .mejs-chapter .mejs-chapter-block-last{border-right:none;}.mejs-chapters .mejs-chapter .mejs-chapter-block:hover{background:#666;background:rgba(102,102,102,0.7);background:-webkit-gradient(linear,0% 0,0% 100%,from(rgba(102,102,102,0.7)),to(rgba(50,50,50,0.6)));background:-webkit-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-moz-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-o-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:-ms-linear-gradient(top,rgba(102,102,102,0.7),rgba(50,50,50,0.6));background:linear-gradient(rgba(102,102,102,0.7),rgba(50,50,50,0.6));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,startColorstr=#666666,endColorstr=#323232);}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title{font-size:12px;font-weight:bold;display:block;white-space:nowrap;text-overflow:ellipsis;margin:0 0 3px 0;line-height:12px;}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan{font-size:12px;line-height:12px;margin:3px 0 4px 0;display:block;white-space:nowrap;text-overflow:ellipsis;}.mejs-captions-layer{position:absolute;bottom:0;left:0;text-align:center;line-height:20px;font-size:16px;color:#fff;}.mejs-captions-layer a{color:#fff;text-decoration:underline;}.mejs-captions-layer[lang=ar]{font-size:20px;font-weight:normal;}.mejs-captions-position{position:absolute;width:100%;bottom:15px;left:0;}.mejs-captions-position-hover{bottom:35px;}.mejs-captions-text{padding:3px 5px;background:url(background.png);background:rgba(20,20,20,0.5);white-space:pre-wrap;}.me-cannotplay a{color:#fff;font-weight:bold;}.me-cannotplay span{padding:15px;display:block;}.mejs-controls .mejs-loop-off button{background-position:-64px -16px;}.mejs-controls .mejs-loop-on button{background-position:-64px 0;}.mejs-controls .mejs-backlight-off button{background-position:-80px -16px;}.mejs-controls .mejs-backlight-on button{background-position:-80px 0;}.mejs-controls .mejs-picturecontrols-button{background-position:-96px 0;}.mejs-contextmenu{position:absolute;width:150px;padding:10px;border-radius:4px;top:0;left:0;background:#fff;border:solid 1px #999;z-index:1001;}.mejs-contextmenu .mejs-contextmenu-separator{height:1px;font-size:0;margin:5px 6px;background:#333;}.mejs-contextmenu .mejs-contextmenu-item{font-family:Helvetica,Arial;font-size:12px;padding:4px 6px;cursor:pointer;color:#333;}.mejs-contextmenu .mejs-contextmenu-item:hover{background:#2C7C91;color:#fff;}.mejs-controls .mejs-sourcechooser-button{position:relative;}.mejs-controls .mejs-sourcechooser-button button{background-position:-128px 0;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector{visibility:hidden;position:absolute;bottom:26px;right:-10px;width:130px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:10px;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li{margin:0 0 6px 0;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label{width:100px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px;}.mejs-postroll-layer{position:absolute;bottom:0;left:0;width:100%;height:100%;background:url(background.png);background:rgba(50,50,50,0.7);z-index:1000;overflow:hidden;}.mejs-postroll-layer-content{width:100%;height:100%;}.mejs-postroll-close{position:absolute;right:0;top:0;background:url(background.png);background:rgba(50,50,50,0.7);color:#fff;padding:4px;z-index:100;cursor:pointer;}div.mejs-speed-button{width:46px!important;position:relative;}.mejs-controls .mejs-button.mejs-speed-button button{background:transparent;width:36px;font-size:11px;line-height:normal;color:#fff;}.mejs-controls .mejs-speed-button .mejs-speed-selector{visibility:hidden;position:absolute;top:-100px;left:-10px;width:60px;height:100px;background:url(background.png);background:rgba(50,50,50,0.7);border:solid 1px transparent;padding:0;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.mejs-controls .mejs-speed-button:hover>.mejs-speed-selector{visibility:visible;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label.mejs-speed-selected{color:rgba(33,248,248,1);}.mejs-controls .mejs-speed-button .mejs-speed-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li{margin:0 0 6px 0;padding:0 10px;list-style-type:none!important;display:block;color:#fff;overflow:hidden;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;display:none;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label{width:60px;float:left;padding:4px 0 0 0;line-height:15px;font-family:helvetica,arial;font-size:11.5px;color:white;margin-left:5px;cursor:pointer;}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li:hover{background-color:#c8c8c8!important;background-color:rgba(255,255,255,.4)!important;}bigplay.fw.png000060400000233102152455615120007317 0ustar00�PNG


IHDRd�<D�sBIT|d�	pHYs
�
���
ZtEXtSoftwareAdobe Fireworks CS6輲�tEXtCreation Time11/19/10-s�1�prVWx���m�0DIO��IW�G�߬�e:@�]�Aݴ�Dʢ����ؐ,�E�_�r��<��4��(�B�����,to&̀�P�k������N��N���)V�qZ�1����7p�]���Uh����z�z���l�|���"
��K��i;���5���@�zө�N�t0Y�DS4�_�ۓ~*�m�_�aG�{�h�%Տ�/΋�v���;i��l_<%�R�Ήߥ?L_w�w�������SϐĦv��U�����?g��!��j��=�E��{!֫��Z�/��6I؋������@S�}Z��-�T�}�'D/&�[J_�~S{�6Z�u�w/�@'V#��>���/W}��T�B!�B9~hB!�B!�B!��"�r�7y�糭��A��u�HmkBF���)�3�O�mkTSx��}�sG�7v�[���ه}aķߓ����/_Ar��2�N�kY���2��Y�G�U�V�m5���eV^��}�S��ճ^��j0{�;��b�No�������p8��Ý�3�૟��+�8�����?z���UĚI�I4��.��45��Y����U���l���j�m�ƋF�1i��_��׳��#8r���#���^6�g����'Clr��Zކ'�&��>��mA������tR�C���j���O��9
�vh�wJ'uZ�������w/��p�:�Oy�}~�#�_l�S�S9��	���a�b3��V�����+W3#d����Vc�~��'��5���pd�I�؊�����l��p���
�}hL�������H���`3�96�k��9<π�sxbO<�w��]��~_��'�Z0����	wo�����Z�t�3�`BÄ�����p�M����a�@���>_!�F@ڢ�x�	@@�a�;�����.���q�hI7����y,���Ma�n5z��#�WJ�R���_�L���]/F9���њ5��sу9.Zz���c3�n�R��&t^o�T8"��Cɽ�����oKQj�X�*�s�m��];N�Jq����i:N
8BG(Xi���z�����jL�ES�ap��rKs��LoAhؠ�ך�#I��ph�áq84��YI�����*��%e���6�h���qQ|�S��_�H�Ӣ��+�/�%&w�s���[�+5�\�ˡ�9T>���s�î��;l��F�if `}Sf�}�+��&�1��p0zM!��Y��"�zpt���	�h̡�G"@��I;���֨��h�Q�k�ij$���#Ći˗�X�h���%b�N��x�uE���"��q�o��Y`�3���)�)zA���z���`(��Zi\�|����[}�T��<c'�9����in��j�����A�h��
�rs�ݘ@���|���`.�lc��H
�.歑k�[��'掌�'�K�/�;��.�]���?2lܰ���tH�Ya[�w�f�ٌH���ԄC5�m��,��	1a��r��^Ү��1�5�!�wEX��Ww2ᘩ�Ռ-wh$���{�*[b�J��[4�ξ������0�l��ҹ�!�*�3�2�`�/~k�L8�d�Ƶ����s�8�aobaݑ_���\�j���:�_a(0��@�c�?�SeF	���>iz30�ɔNk���0$9�Ur��\.�$��k�Ď$S {E��EhQE�T#j���]�IK��O@=��P�`�E��)�8��C�8�r�)%�yH��+:~D�~��7�Fc\���k�%$���pn�8�s����،'x���}���W�t��C��$J�I9'JK�o��>��Z�4��kI0�Ya��YO.�)��J��0㫶��G�m#�X01��mx���`�|�������>�b�B�ՠԊ6Q�.R5��v�
�
,0e|a�/o���Gkҷ���sbz'�n�'��z��^��.��^��q~]�����N�EӤ�	=�NL��#�4g%2���,�`E7����!��>��M+1��<� �f�FK�j$��=(a.1����_j(&i�{F��4M+f�`-ωpC�G�L����m�M����ɂdMb�{���96��:G"�
���&j�>e�.�)��� �l�ى��[��w����6��F�*��+���`���T�V��UG"ms$$�(Vmq���ra��� �kbp$���݇�?��O�2�SP�O3�l�㐖�TFҏ+�.KSg�0\�
��������l�d��cl�q�@�f�N�M/
��\^��Ni��k�`�1��B�Ne�;��ZX�*gQ�An�eC�Pgs҈GOh���_[��4�8k��e����2��R>t� �a�e��S.�3�]����h�Go(��9h)�]���g8y��N�`��;jX���XQ��H�/
`�a`����T
���[K^��S���R�s�H]��7��|J����x��C㉰C�G7e�~�&�R�M~3L�y���e�}�`J��'��G°,�^n~
L�2LGq����=��$�~1`�l��|�4f�ܘ��8 �IϞ����
��F��b^$@){����3(�؉��qM!%��fY���Gr�T3���{l��QZYf�v�ؗ�A��fs�IeZ7.w�i�2c}~�WA� �ܯh:c{���2�p�P	3��e6���X�PUy�~j2�ϛ�U�U@��"!#��O��T�¶-J?����x)_�^S��cO#Y=�e>y�z¤�D�-�I9�I�"�v�h�|�J,GPd�V����sS��t�X�LK
���27*�D�VS�7����Ũ�$�(�Xh'HR��A���#����R�l
�X6�F�VY*�e�q}�0�箔
d3��-ٰ��WE��������E\���p�M�op�	��;O�Lw�?�ح*�[��i��jO*�kW��5�ܣ���E[�f:Jɲ�n��}��_��N��֧h�(*IO�9<ڑ�H�QW���E-��j\��
wrY�D.gdë�<,UF`�/mh�u�9l��+p��V�r��R�)�tL/���;[xD���=��wx:��\�^�N��}�:�լSt���_t�G*9[xd�Gr�#�j/{���yF�(�¼�Px��L���LZ=��/0���Ut����;������W�t�+V����x�
��c���%�H�6A7�Hw_�n�
�F0�^���'@������q�y5�� �#A�4�Nch�B�G���938g9�8a5a� �l\��E#nZ�<H��i�-G@�Я	����@��w)l��,?���D.c5e��ln~
�`y�T���g�/G��S-���Ѻdn�
��SK��-ؿ�"N��&�
D�0���8�����#Z̉�D[�h�vE�o$��CA��3�*�X��	'iR�t	�~-Hڢ��Y>�4��y��Au�r�qr�jr-A���S�#���F���#�?�Y�tcN�qM�4�ϔ�9��x�����#ڄmRm_��O�fN��̎,;�[��SN���`2n�4��6Q��ꦹ)����*�/��LD�q�f`;mW��-_�:�أ�xͭFܺNwN}z+�'�{�OX�P��8��PNӍӣ���|�ң�`�
�|4L��'��K�\J��\���{��{�zT�Ԣ������^�X��]��b��-/xM(y����!�|�e���Q ����ȝ���?��x8�C{3�p�T�� �c�^P�O��i�>�`�"���0&����s]7�a��g��71��o4��Jc�
Dn� �BI����ԃa~�W��b♁Q�.n��0/�VfW�V�����L4�I;7��cI��Q�;�;�]K�F���\$=}��z]7�a��S4@A�W!�̟eCv���x
�僉z��5����]ʏ�D.*=�8�J+��7����d�$b�E�8��S_�YrC|09�����
3���í~��G+yH��^����R`NjU��Z5D��+���K#ͥL}"#��ՏKt!�������n��՞��8� Y`E�Cw�vn�/^xW'����c9�a�a�\�8(Uk��|xa4]�|�Ƌ�����[��k�+�vڟ�v;���	q��F�6m����i�aB���L�x��l��t����~�ѵۘR�9zf�5��R|T����Jxm�٬p�}��#z_�A�-����U#��a���4���=�=�����y1��CK@gF�/�#�5��z7�g���Jq�k8ҙ�
g�LE��Ĺ�'��~X8;ͩz��QvM��kv�U�B�*O�5�,x���y��$��"����gWx��_��,<_�C����x�ЀRUR�����b�_�=a�|O�]x��Ϛ�QA~�Dž3�(s�L�%E�ҫ�r�D��:�x⪯��
Α{���)�&	����Na�S�}�S�-L���}j��v˞�p�re�*I�ԋ�+O�`�+ޝ\��=o����'^�'Pb�>�ŵw�i�B{?'ZD�4~��y�����6q滅�^y7�R������CT�P�ᝠ�	��5�.-ׯ��oiĿ�}E�v��^q����U��$�-$��BBwxee-�k�|��Y��t��s-�u�s�uŵ��%�KhU����е�.����Khq>e%5�W+k�]����n-�k�]�l����p������-��ZB�����^cn��ZF�2��e�_��ZF�2�b��r��y�tހtj�\K�Z:gҹ�����;VK�[ ��̻ZB��%tΝ�H�/+�ηA:יw�t�������d���6H�:�е�6��u�]-�o�̮3�j�]�l���ɼ�%�m��u�]-�k	m"���̻ZF�]g��2���63�_F�]-�o�t�3�j�\K�\:��,�=�,F�����Y��aC{�Z���kU�o��tuU^u�\���\�Ċ,(�[�c�\M_楢Wᶔ��$��ǂ��/Ƽ��Ҹo��{}��[s߿5��1�=�W�;�%�Mf��?z4W�Ŷ�z���U�qӖh��V[�lK�a.O�m��+�ȟ����^-�k]��%d4S�v-����<�J��
��W�{3�^�=��/=�Y9��7Ob�p�3�Lvaq29����M�31I�)y|�A3k�*r�Zک3E�rb�h�.�7���|�>&�_S/$����e���i�H����{Bz�'Y�������e�{dz���c8���^|������Sz�u/�^��P���?dχ���;ݡ�o�R�wE�	�.��oc��8��Q4����\�)��lD�$#X|8yYeg
Jteg�בe�"��x�1��o[�9���ս�$�@u�k	y�5c���3�"W!?���
��H"���$w���+�]�M�x�j󥵄(#�C�|�&�=�F2C+iG�i�6A;$d�bXr�j�- �&���=��Һ�U7�+w��L�Ks�f�O��lg�`P2Z��e��e�{��;�^K�l�lR\�����'����c��wzX8�.w�8b�+����{?Y�>�ʼ��ﴨ�����/�/�����H�3��#^��ze��=*A�ꎏK�0��}	�����rD�
�}��Sq̟P�������ۣR,��tOBB�����>}c�)Xb��HR�f=�{��o���o���4}E�h\��m�\�-�������5���z
����n�6�!t>Q��m��ۼ[�me����t'a��qI6��^��~�:?��t^��,��ߋ?fsm��:�|����{?��km����>�H1ﭢM����2�׿u��>�pm�pm�>�^��ri�zÑ�1Y!>EBG4�6�L�D�\�U3��!hf��*'�|��pV�l��k���ь0j��M�3�f��/���*��L�;�>��cR�r��	�9�s3���S�Hq��;j�)�N�sib���j��ob�ͣ������`��6���,A	�h����g9��O�E�(�����Du�7A���9%N�|{�Q��ؔt��٣��u��Ѽ�7���t�>�g�υ�E۽�h���&p������&�4/��=�zf ���n�{_|����V<;��ޑ-?���Y��У&i��Kx#TDtK�l�S<�Ť+B@$$]?3�>��)Yj�2Z�l��V��c:c0g�]�=�&ZH�ٯ���g>�%Q�Ŀ,�vqf���2�	=���\��G	�Q���.�'�t@��#|J�0&��'i0��?�'�z~���}&1�2'���?B2/�����z�x-y'B9[�	���_���`C	f1e��0V�
I��ɗ�,��w����&�`q�����s��m��]镦��Z�����7Yݭ�מ�#����a.,��xU¼�ݨ�W��	\��y�J�/�L�)E�x�VB�0���Ҭ���q�o���9�P�	?���Q/+eoĿ��HU߯_�@/�	}O��밬u�I�@���\�AW���{�i�g���MZo+?�4�M�s��R�mD<��	�
�)�O@];!��6�f��^�q@g����g�Q��+?���ݽ����P�
O��yL("wm:���JC9S{�o&R+cLj
�rEU�!�Wv�7�u�a:wV�~�5ᛨ��jAuW�,N�A�O�����rX��6�a��j)\K�?�����&�mI�?ʯɪ�L�֊���4��##yL
���~��y���rO��׾ϑ�o����О�&��$O?k��~�ڀ���r\ޑ��Ѷ�"��e�H3&D��f��C�J$��S:w33Q&��#���e�Y��I�߾�f��f>�aIV�
sR1i�	�l��i���)�ţ�H��o�zL�6�0��MD$lhR��p΄k˛�M����m��ce�����w��1l�m��o�V?P��e��m����h���M�ux��*��G4C����+��6A���n�"�	�	e��fæU�]��?Ш~���D����b���h�bۿ��8c4!�fJ�=��M芔��d#i�x�+����,�Lۯ��tճ���� �G} ��9���>�t��9����߬��ƭnF�oh��E�fA�;�=gs{z��3뜶.q�ۡU���ʅ���+6���tJ�Ǐ���9�f��OW���y]�����]8'vf�b}��9�����}yM���N�;�ih�{�t�9:�.��Cwa�0�t@�5��tˡ�U��C\��d\�-����mNp)�C0�%�b��[��l��ny	.���[n�K��p)��$ĥ�9�.ٖ�K�qɶ�ϤGZ���_���n�#\�-�����a�n
Ƹd[v��L#\�� s�(�%�����m�NnS�N�Y������:
���J��?���CX�����!H76���U��mm�i��0�3�((�PP8��u�~y��7O�����up��>�3��.�<���o��<쒔<F��?�}��3\���ORu������Q�_�q�O[��G��)W�m2	P����T20;�йGm8i_X�Ə���5x�ΛL��7��}h�)h��do�[i���66�{JQ��ɿ�U���zI��)��x�_z�S8�Ξ�y><���u~D�>���4����D��9<s�-���o�y���my࿜����˫pF�)_1�r��;x>��`F+0َ������k�?���w�}H��W��l��:�svZ��vZ۴��M[�OW�����f�']��w ��Nď��9������Mmκ{���6d�n5��ht�
O�/0�v�G;G�	l3���	�܀k��C�:t�.������`���s�}��O{��Gc�PDI~�G�5�|1;<$���t��5�>��s�f�.6����=�{�f����I���q?�!��JxI\��c�Κ�ٸ���݅�8��=��v�����-Ȼ�C�H�cs����pg�������6��K�˽�����|0w~��au���/i"̛ijV����ut�c�u��V�N�Ӏi��	���j�D��c��_[=2\[�_��h�}��I8kq��u�[?�����1>����	+�i�x��043���<\�F������vO�IrJ�R�W���r�O,��(�g�W�V�joˌ����˚^4�Y�W�Ͻ������x�I3½c�^�F�v�/�9=��^=Y��A����ަ��A�–8�+��{;�ގ��1�muA���i��F����n+}Oc�59~<���:����G�^���9Q3��ۡ��b�s�=�
�&cQ���s�c�9�����d�����λR��}��m\��āܛ�6�۰�z�;�A;ׂ��n���C#M��Ẅl�^�g�v��M���Y?9�N�����8�76�$HB��5_i�%�q}ь�tY���J3�z,͸M�3�[�4pA\�c^T�L$5�6Y�Ǿ˛�bh�s�V���J3a�)6^�L���*�I�f���,}���F� <PZI�(tBь��(v�[J��M&�VX3	bخnf$54�0}An�r{~l@���L��`�7nC;&�H�DM�ʼn��fp�E�S��Tj&��q2B�A3]�T��H�$Mߏ&��*�7�ؗƷ�4C�p��f<��%^5���aMcI�J�Uو'5���B�ae3���	s!���I���v!�be3���FЅ<�*[�DM>�/��^ي$ir�r!��f$I���!+��DM.v/d�\ٌ$kr%�6#TDe3���URڌPX��H�&W�i3B}V6#ɚ�T)]���'�g$�,ÓFd4k$�lA���5C4{\[��?�!�q[C�����	�зe_Y�I�q�(m���C���Mu��Ȗ��6}�e������€y�"O�`�q�2�����#�� �Ձ��#��9��n��4�8fal�'e��� `NZkmI�G�W�%bnBHB"B:�L��4��x�OE��y%k�ԁ�Ķƞ��c��Sc����w�Tb����V���c��&���5=�Q���� kh*[wE�1(J?v���y��?4D^�9�Ʈ�����؉�(m�ر��?4�,N�1wse�_+T�V����ȴ����\��i�D���
��Z�N�+�kq;��\��ieh�Z�N�+r&S�v�_�y��c�A+�΍;��0j"C��_VN�Ma��%M��`�h�vn�Xjو��f�NGc�䛖�_���>ک����f���3gF;�/��S��Q�v;�������ÒB;���O�X���3�+	;�����ʲ�eG7W������N��-�������AsPd���D�I$�%@c�0��W�E��+�%xe>�d��D�̇���尞���տc4z��W"��"X6����B�
9l��d����u������[���A{;B���S�F���'4�M,�P�W�
>�P&{��O�Pf��MaY�˳`�f����)9s'A�����"�e��܁���2yj���_��5w.e��N,����_n~{6;iS��.�=Q�朴O�?]�vO(�b{�kyM�d]rSg�مuva�]Xg�>�#6����'niz�%��R��0��+��EX\�v��'�,l8io�0&�x�>�<�4��s&h䉶FS&�����Mn�F����5y�E�x~1�&�[o� ��^W��ph[�\��1����-�.��� ���7��,1��;��C�u�L]$S���[������l���ڌ�EE28M��H����"�k[$�Һ���0�:f\'�Z�L�}�䏼GJ�3��1�ъ�2�*�ak��ak*�ab^��Ι)!_�N�&�(h&f]��d]�S�&��Jf��4�'���017����*SLL:�ҕ�0��hRb���ab��:yF�gb"��5�GW9��|劕3L佚�e�Jg���4�%���0���0h�g��4��ԗϬ�~&���$�Z@#�2�͢U*h�f�E��Ј�oR(�-�Ie��<�ZE���jYXQFC�:r�����a���B����W��jЯ�4몥1~��bc`*�i�	UQNc�8�zsF�Ԙ,}E��@��Ԙ�}Q���W՘�e}Y͚�j,Ԗ���B�jKkl��������ט�<��L[]ca��k,,Tm}��Ŭ�����%6�������X8\�*P[fc�j�l,��B#Oݠ҆��Ԇ	%�*�R%o�j�m�P�m�@ed��M�ѕ�0��Mj�t�6L(����V<B�'�Ҕ�0���XsÄ�`�]�
)��<�������e#�7w��n��]LJ�t�7lM�7lM�7lM�7L�/4P��&��D,k�ol�c9P-�5�߰5�5U�TX�Z�(�Gh�<�&���jpتE8lMU8�-�1�E[�cA&m��hq,�X[�c1���8�\W�c!u��8BP[�c!���8JBW�c���9:T[�c��u%966��&�����X�`ڪ�P[�ca�j�r,,f]e���-ͱp(��9��8����V�X8����T[�c� ��XΩ�:ujc��X�6֩�uj���8_���6>Q��(��O3�+t��DǼ���b�0mK-��,��*^��\��*t�ZJt
�^�F����t���Z��l��t�Ǔs���a��>�2.��/ڑ�6�k�A�צ����O�C{�}�lV���OV�I�>k4�w�=�zy�;��Na�;ֹ�w5
���pH����?h#��g�\����S�6�7�f�����d�eˇ�
��i�x�z�x��x�%�x��4j���D�f�f��
�)i�������H���`3�96�k��l�g��pxbO��g�.82���k���`��a�w��xA��+�Y&4�@��M��th*�6X��$ð�~�ŏ��7�����H�@�Ov�X|��u񤅌�FKʸ��x]��c�M�gm5z�w�*%Z)Bl�W�Y`Į��V�h͚���-=�T��c7�?�Ho:��7d*�Pԡ���Q�֎ҷ�(�i�����'w�8=*�IH'{�n\��8)��`��������jL�ES�ap��rKs��Lo)��9��5-G�����8�C�ph���,:�8�o�[Y�-)������@��hnpQ|>�)��#wZ�y� �� �D��u��x˺~�&�ˡr9T>���P���cn"�~��[`�
��0��d���o�c�l�o��xE3�C"F>�PH��O'
7|V�[����,"�9��Hh�5iG�p[�ucm1Jy��8Y G��#ĆiKy��1�xm:0A�X��S(t^}@�y�5xl��-���?�rX�����Ã�J�7�c��8Wk�q٢�%�o��S���:����f�p�HO#pS]Tk=L��x-�
�D��W��������W��(�B�;�� ����yk���Vf��r'掌�'�K�/�;��.�]��Q=�#��
۪!9M�$���eZ@p�h�͈D��OM8TܖKH�ҏ��-G�l�%�Z�?CY�;"��qW���
ppu'���^��r�F2*�箲%v�D�*�E#���ُ��Ko�_c�I+�)Ά��2>��+s^��R����H6Ya\;�:�>G�s�&��u��e�|����{���	�0��P��1�é2��VLo�4���dJ�5G�_l���*9if.��I�ȎõcbG��)�����"�����5�vG��.ᤥx����[h(xS��"���S�١D�h9ŀ�����(����;�o2*�Ƹc1�8KH�5����|qx�b�%�O,�L��콽sh�s�d��w$Q�M�9QZj}��7�Y�
�9T_K���z�D
�~�zraL9��Wjv�_���\<J(h�ǂ�I�o�ô���c؝�$�)�>�z��V���Ot��ѠԵ�lhm�`�)�S��xy#�=Z��%
<��;hv{<9�;�x�?os��{/S��D.r��v�آiRń�b'�vM�Z����ӌ{i�C��s`I�ns�_q���Ȧ��P~3T�%Q5�����0��P�/5��4�=��c���l���D���#{���	��6ͦ�@��d/W�4��&R3
 �s$l0Yu�D@(+�M�D}�],	RdM%A:��4�	?���
��-[lmF�b�@��̑�ֱ��@H�h�KYu$�6GB�b�'���(��G
B�&G��P��}(H�3��^�"�Bfy
�ifa�M3c�Ґ��@�q��ei�l�˽!�����;��Ps��x7.���Z#©����r��+��)mvQb��6�THߩ,}��5Y��B�,�!��l��lN��	
���b��K,�B�{Y�!|�a(c8��0,�C�B�Xf�?�B9C�lHk��|�b����2�9Jz�����D
�I=�����YJ�U�p�t���F��z��yN���L/����<e��)E�1G���<|C�:�����Q?~���p;4�;tS�nR/U1��7�4��_��З�t��x�Z~$������+�t�[K����LB�'�a�VnΧaKc�̍��^Q�e�`�Im��}���i1/��=qG����d�D�։8�����s�,���{C��#�C�����*����QZYf�v�ؗ�A��fs�IeZ7.w�i�2c}~�WA� �ܯxi4�W�ye*�Სf��lt/���H
����dܟ7�������kcD9�禍���
��kB*f�K�����W{��,�ȓo�&�'RlaM�IL���+D���(�Pb9�� ˴J<d�_�x���,����r`Zjh�����Q9%ʴ�Z��G�,.F��$�F7�B;A�j=���
ک�R�l
�X6�F�VY*�e�q}�0�箔
d3��-ٰ��WE��������E\���p�M�op�	��;O�L�_2�ڠ@oL�G��K�=�t�]q;��r�
,�/�mQHĚ�(%ˢ�!ϯ�ٗ~M:�Z����$=���hG�#UG]�by<�೪q�**��e����
���T�;�Y���Y�����pwa?�tL/���;[xd��u�� Q�.��H�#g�,�H.$X�eO�<�({�X��
�Sx�锑�	yM/���w�����3�x�7~����*�ŊC��!��_�cx�Y��d�!�&�f����P!҈�S6O��q���G�#������[�|��z�]z��L�G���938g9�8a5a� �l\��E#nZ�<H��i�-G@�Я	���L_���L�22��938g%��XM�%(��_zX��<a�t�ق��Q-�Tj��@�.���B��T���g�/G��-����:���,)q�g�/G��-����
���E���/���8�<c9�&��IM�%H�� i�&g�g�Ӭj�]6սˑk��5�ɵ��fN!���՟Ϗ��|~d9ҍ9��5�V�x?S��dN����_�hN�IM�|�n>m�9�2;�x�Lsl9N9�҃=ȸi��+�?�k���Ѓ�{��gǗ{H&�Ǹn����+myҖ/m�r�QP��V#n]
���>���=�',{��K�Dz(����Q��E>���a0�L>�C��F٥�	.�X�.�d��=�
s�=�
=*hjQBY�x�w/��q���x1k疌����o�x�K.�C6����:=ǣ@>gGÑ;aai&��p4���fᆩ�mA��
����=�r���+}D�`E���aL�9%��nr�8�ϴ�ob	�h�k�Ƙ����Aԅ��͟��� ��0nQ�.�3�Z]��g�a^H-�̮�m�j����Ùh�vn�ǒNݣ�w<w^��
�2�f�Hz�2S��nr�(�h���B��?���`����J-�k��-ѹ��O�\Tz�qx�Vpo4'Y3ȆIĆ�q6�b��`2r+=7��f�)�[��7��
V�8��A���:��z3�j2�V�ѹ�F�K��DF|q����B,yK55'��/�=M7qA��.�J��
��_��N8Vii�� r��0��qP��T����h�����
�۷���W��?]>n�����J��>��&�
���dρ'^��?x�\���%>x�ޥ���[�?w���?w�m�s��ҏ�֟;��ܱ#/��;�����*�]��k!�;����εt��}���εt�}J��~�Cۢ���е��v	���ZB����e��y	-Χ���je-�k�}�2ۭev-�k�maU�5���ZB���%tXK�ZB��@B�k���}S��ZF_���k]��ZF[�bY�:������A-�k�\K�L:�p��y�j	}$t�yWK�?��ιs	�ee���6H�:�εt�����̻ZB�	]g�����&�μ�e���u�]-�k�mcU9�w���
�μ�%t-�M$�yW��� ��̻ZF�2�f���ȼ���m��u�]-�k�K�6���_��"���ްt�<K>,ch/^�t�s��s��mߓ��ʫ.��߼�K�X��s�y5���˼T��`#ܖrЖ�C��Xp[�Ř�Y_�
z���|k�F�;�G���zG�D��,�!�G�檼��U��Z�j?n��s�jK�m�>��i�MP�{����=�ثet-�k���f�خe�b� ��Z	�X����o�u���'U���6+�]��I|f�b��.,N&�q���Iy&&�>%�9hf-QCE�TK;u��TN,-�Å����o��DŽ�k��6����b5?
	 =�QOH�$�S~�rӔ��{�x6���p��6�bUߋO����cJO�����q����pt�ov�;�-�Wj�Nc�h�?A��q�Mcl�G�:�F�\�@ⷛ�3�R�����d��//�l�LA����L�:��[d�{�8��#�m��=�?����Dc���z-!o�fܠz qF]�*�1��Va�I$����������OUm����eDwH㓏��g�H��ch�!M�:"
��&hc��l_K�|A����d�м�4RZ7��x�.x����~i�@����)���JF�{�������~O�zG��a)��헍�B��׼|#_��$�T�yL����N���.G~���a�'c#���W��~��^��������/�wFyċP�,{�G%(T��q)&w�/�15�S�Ȱ���Y�t*���ו=��4�w{T�E���IH��`�B:�اo?Kc2I��}PìG�3���:�m�����|���v�M�+�%���2xW��s3_O�����;��'��z�m�q�w븭��2w��$��6.��{?���{��OW�;������� �{��l�M�1Zg�r���v�Rr���w߇�)�U�	W�~Yf����]����-���-��g���Q.
_o8r=&+ħH�����(�k�jR6�,S^�D��w�*��v}
2�7�F
�9��|F��¬7ڣ�\s]�[e�i~��7L
T�5�3gxn�2�xJ)PqG�;�٩|��!M��YM\��M��y����,[�B؆���%(�
\9�,G��i��h4�c�At=���&��U6��i�o/3
����3{4��n�=���&0��n��G���жh������6��>R���E��'[����`ޭ�Bu����ъg���;���a�1˴�z�$
�x	o�ꏈni�mu�@��tE����b�ا8%K�QFK@�-�ӊ�~Lg欲롸���D�;��p�"��g�$������.�lQ�T�9�'�����(�=ʑ�إ�c����p�O��d��$
�4�G�]ϯ���$�_�5z�'@H�^�X�%��O(g+8�A�y���� l(�,����!��!�rC�S��\����,�s��p��-��+�Ҕ�_�\�w�Q�&�����S}D�}<̅��J�����j_7���Q �]�e�	:����JhFsvW��wS�/��Q�1<��>�G��<�e���������H��O�"��{����2�(����?�*��x�1���r:��I�m�G��	q�C�C�����<Һ#���#��	�k'���&��_�kY?�p��,3j�Pz�G�V��7=�u�Wʹ��=�	E�M��7]i(gj���Dje�I�!S���5D�ʮ�f�ޠ�7L���z�/�&|�_-��*���;��	���^Q���9��]-�k)�Ǔ±��D��")�g@�5Y�c�i�Zq�2���x�c$"�I!���: 5o�~V����9��{C8BR�Sޤq���g�U�OX�;�Y��;�8ڶV�����iƄ���B"Q}H�O�Du�J�nf&ʤ�D^���l>���:�����l���'>",ɪZaN*&�=�����1�T��!�x4���m\�i�f�����
M�ΙpmyS�I66^u��m4z��r�R�77�����B�M���X�l�>��R�B�m�"��ɳ��>P%����f��ߐte@��&�3��MP�>a?��]���lشJ�K6�կ�ݞ��}��V�ѼUb
Xl�W�g�&��Lɳ�y�	]��v@�lD#�oap�ݛ����i�Y����z����}�骵sxy5��Y'��[݌���\ۋ�m4��w
{����'�+g�9m]�j�C����[��Wl���^���s\�N�[����	a�fv�����]8'vf�b}��9�����}yM���N�;�ih�{�t�9:�.��Cwa�0�t@�5��tˡ�U��C\��d\�-����mNp)�C0�%�b��[��l��ny	.���[n�K��p)��$ĥ�9�.ٖ�K�qɶ�ϤGZ���_���n�#\�-�����a�n
Ƹd[v��L#\�� s�(�%�����m�NnS�N�Y������:
���J��?���CX�����!H76���U��mm�i��0�3�((�PP8��u�~y��7O�����up��>�3��.�<���o��<쒔<�3������|u�'���?��vw�(j�/��uا���#ld����6��N�Ik*��w�܃�6��/,�I���SZ��V�M�s��t�>4�4�{�1�M4��_	��=�H�|�_ɒ�@g�$����	�/=�)���fO��6����:?"z��~@W��m"F����E���m�w���_Ύ��OW���U8�Ք�_9�
�<Tl0��i�}��u�gb튵ǟ�x�;�>����sd6�i��9;-Rr;�m��ަ��ѧ������i�ӓ.��;{Z'��l�Xvvt�wtܦ6gݽc
]u2W��d4��|���e-�����yB%7��ӟ�H�B�O����{p�c�2w�O<;��!s�}V�O{x��=�<���*xI�D�����9���h�V�K;�h!�b�;?��C��l������4�-��Wd`�k�Rv���,�K�t?ۡrs�\+7��R����.3S�?�N͡�Ӆ���61�%��׀Pj�=�;?���0�Z�Ǘ�Y�M�Y�}bt�::B�n���ߥ��Ĺ-�a�"PZ��h�s,�d�Gd���+���1�����7=[����>��o��h\�SaOX��r����G�C{��q����m�N[�.>o����'��-�`�8
g@�]p��ɀ�z:v��Xu��L�z�=����EӉ�tl�t�ܫYo�t�yR���`�4�;1�%l�XK�֘ӓ�����;T?�>�m�nD.l�����]��#�툽-��VTI�|�V�o���җ�0��Q�dz�.�ø�{~~�E_]5�0p�nzϰz�(���ߞ^q��(
�Y�9ܱ��l��s2|��`��v�]���tW�6��m�@�M~��m�r��۝ˠ�kAsLn7�A⡑&�GT�p]B�n�۳g�H�&s�Y�����T'�Ԍt}��cț	�N$�Wݚ�4�渾h�o�,L\�f��
=�fܦ���-T������>��1/�n&��q�,�c���x1��9p��fb��0�/l&I�~��$R3^��>L�t��	(�$N:�h�kI�խ�V�&i+��1lW73��	�~�� ���=?6��Xj&lz0��7��rO�f�����OD3���lf*5��8�ܠ�.K�y�w�f����	\���@�K��u�!c8�x3\���m��Ͱ&��$m%ݪlē�p!���I�䄹��Vٌ$krn��y��I�d#�B^��H�&��X�lE�4�h��Oe3���]ڌ���H�&��P�lF�5�H�*��I��*)mF(��f$Y�+ȴ�>+��dM���.n���3�q���I#2��5E����?�!�=�-�d��¸��!���?�`�I�۲������8n���I��ӌ@�:�xd��?t����V���?�Na�<[�'k�r�8b��X�k^���@���V7��?
�^�0�Փ���f0'��������17!$!!�X�T�
Y�G	<��"�ܼ���vb[cO�1�1mly��?vA��^*���`Y�C+Q�DZgk���?���(E��A��?4����"k���Ib�<���	"/�qcWN��L��I�6c�X���I�ؘ����/�*�+Q��cdZ�XJ���B�\��i�ar-n���͵���WS���2�s-n��9��q;�/˼�c�1Ϡ��F�ƀ��W�A5��k�/+�ܦ������D�O4j;�L,��lDDn3��	
D���h�MK�/�Wy�Կb��t�S���3����
�|x٩�(����W\�\����a����Wܧ\,��ř˕���W\�\eYz����+PK�?�Wi��ߖ�~����f� �9(��WB"�$����1gY�+�"s�����2L��W"i�C[�rX�\���_�1�=Y�+Os,J��\!��6�N��W��R���ar�-�堽�!��)s�F����&�l(�+��l(�=��l(3OƦ����Y0s�\�ʔ��� �e���e���2]i�@�_�<5w�d��L�;���W'��]]Y�/7�=����)�e��(osNڧ۟�f�'�\��G�G{Y��I�>��W\��hʌr�Ϲ�5���r��s��]��\̺��N[����:m�N[�}�-Fl0�i�O�Ҽ�'J��%W�a��WH���|���೰�T�Ӂ'�D���=p5��y^'ض�'�M��Vhޖ7�����S����X��o�)D���0J{]�¡m)�sEK�|K�+7�4�?��_2[��mt]n�n��AYf���͍<�;��˩uaO]�S[ȵ�\[����l�-��B�E�=8����������k[���Z���0��f\۳ZqO�}҄��GJy3��1�ъ>�*�ak��ak*�ab.����)aj�Nf�&�(Qs&f3]��j]�ә&���|���4����01����*�-LLh:�ҕ�0�qiR���abj�:�G�c"�5�GW�����>L�ꚤ���}���5����0����]h
~��4�W՗����'���ğZ�#�2��U�~�f�������oRܢ-�Ie��ܟZ����jYXQ�C�:r����a��������W��jЯ�?�1~�� c`**��	UQd�8� sF��,}��@����}!���W��e})Кj�,Ԗ��B�jˁl���������<ڂ L[da�J�,,TmM��Ŭ�
���eA��.���Y8\�� P[d�jk�,��� #Oݠ:���<�	%�*�R%o�j�
��P�m�@ed��M�ѕ1��M�t5BL(���DX<B�'�Ҕ	1���X'Ą�`��]�i��<�J!��R!�s|#����j���]Lʱt�BlM�BlM�BlM�BL�/4P��!&��D,k*�l�c9P-�5��5
�5U
�TX�Z�(�Gh�<��!&����ت�ClM�C�-2�E[:dA&m��h��,�X[=d1���C�\W?d!u�DBP[Ad!��%DJBWCd���ED:T[Ed��ueD66�������Y�`�J"�P[Jda�jk�,,f]5���-'�p(��D�������VY8�ڒ"�T[Sd� �YΩ����9fuEw�uEu�d�5YgM�Y�u��9kr��HI�|�$L>QR%�&I��1]a�y-%6aږZX�Y�%�l����¢5�����jeQ��+�Yw�j��aq�0��l���(.�r?�8�����r�(����k��7�����y��W�9�-��֏�Oi�8�)�K>�����֏?�����֏�SZ��):�u�:�zҧ/S�?�/�xʀ>�mkBSx�]N��0������Qʫa�johl�U�&f��n�Ãs����fd�,>�Op��3]E�1�T	�яj�V��2ڃ��-����p�
�uy��Gp�odl`�d/�e>�v
9��]����A��ݩ�6�����ٞG�ÃT{1�H	�Q�l�H':�iу����ŏp�a'D�:�_�_�C��EymkBT���8�x�횉m�0]HI!)$����FR�?6�c<lHٱd��t���C"��+��RJ)��RJ�������kJ�߃��L��_SU��n7���s����s~�u�U�-U�yy9�c����/Ju�z?��i���>>>~�sm��+�v�u�Ց�νY�u�8����uN�?�WP>�1Js��WiV���_uK�E��ϸ�/r���ˆ_�gK�W]ױ���EY�cl��,[��T�YH�T�����������}x���L#}A� ���G��V�7���^�}>�iҞ��-���i��;}�LJ���X�&�T�P�3�T�#��ߨg���J�l e�'�=��?�͘o��n��a����|7��>��?ǐ�U�%�;�������/�m���N/��I���f�Qփ�z{��<�d��6�d�n�;�����Q��m�{{�5�$���iѦx��g<�$�"�^�%=��RJ)��S����t�e/�֔� ��a};k���_��y�?�9Ԛ�l�z��}m#��G�Kk!����k(�9�G��1�����z��,�Q�&�l�iV濊���#_�<��3�Ξm$�^9g
�{9&�w�&��:˙�u��f֚��R��:ֽL+mW���W^���z%�I���2���lo���Z�f?�k4�W���-�#��	?V/�c^��!�!{u̵ʴU���ٷ�A����Ge>G}�?����v✽��3��X~j����{�zT��A�O^��ʰ�>��?s�y��|����G)�P�</1�1~2�ў׆�R/�7��Ӿsm�sr��"�(����2��c�Ϲ;�~�u-��)}����<�U�1�g��:�a�p�b�5{��3�(���k�!m'mʞ���2��.�~[�)}G�κb��XE�L������p–�aԃ���7���7��Fy�0�@ߋL?󞕹��Khi�@=��RJ)��RJ)��RJ]M;�;����j7�]&SmkBT���U�x����i�`�Qqqqq�����!��	�C�O��Ml�S�$I�$I�$I�$I�$I�$I�q��O�9˵w���O�o]�s�s������,�Խu˲<^�0��t�c�}�av��=��7����_��{V9��z�}��ٿ�^��s��_���y~�?��}e�z���۶����������@��w��E՟�k�$I�$I�$I���@?
���=T���mkBT���`�x��ݻN�A��QA�x�E���W�K�XR��n�,��5�'�$VT��„��l��:'s&�X��|O��&$&��9����X����:��,���bY���`$8�����a�`��/o$f��K�bp5�f���3�	��`��M-Uw���<�-c�{<�����up:8.�\�e/��_�h�G%��5�{���y��'�Gׁ�	�%�CRÙ�A�<9$�{��e�2x���i[���+��L�ld�3OCKG�1˶a�����������l���MI�K�'nH
�A=�D�~=�oZ���׼?�Z������w�F#��<�x&ܕ�g�z找f��%�S=����tZi/HgBZ������ij�r}�#�T���
��Ae�A=�d��������L�A=��S}[ZZ�t6Ƞg��6-�
����W2d�3O�"�T����v:�LȠg��e��~���lg6��LȠg��G�Zz&|]\\��l���A�<ٯ�S�b�٠���z��~�J���}_/f�3O��?ծ�KΠg�T��V�
�{��a/Ƞg�ԑ*�
>���m5\^��\�j�ϙ�L��8�p��^�%�s���@�簝u�͋����9���%~?m�fº��En��J�3���<�y@�����?������͂u�͋\��_f������_f�\���?�Տ�����e�����߲����߲�q���q���q���q���q���	��-�p��Yq��Bm*������*\Y�|�mkBT����xx�흍�)��q ĉ8�D�^��>׻gI@��X�jjg�iЃ����`0��`0���?������ϟ|�:����s��e����Q��3|����ӧO|�:�2|�����.�}��;�7e�GF�����O��6���_�Q�v�������]T��]�^�ˮg�{>pj�z���k�u��o{�y���ye����?��{�-����x���/D:��3D��&򈼹e�^H�y�i#/OG�z��Ϫ��߯_��~�
:�sMe��#M��3Y�#=�2��Q�����Й���[\s=E��8�}E>�Gȩ�T�ڲ��T�g-��}�����Vf�������o�SVw�zV}�.�/�>�~�<Vrv�@>�!?�U���������1���<�#�����}��=�F[ ��~���QڋB�N�.�.+푹^ed��Lo+[\�-��k���
d�W���(}���6�q�$�#�?z�6��Bө�i���?�L���7�!�3�O_Q}Пu���o����[�=��tk�ȋ��M�����!'}/�Ƈd��r2��_�C���ﲨ�:������`0:8�����o�=��+8-�4}�۞�c�ĥX�dq�{bU�����q��©ή��m�!�ƶ�g*Ϊ�U\z��[��GA��=^�+ru�{��LV���	�U�?)�V>�ғ��)��x��|�Y�ҁ��gi��\�yi�^c�U���o��*=�����!����T���Y��?rf�g�����W��s�ʽV�n��*�V��X�#�=��F���ϫ��+[���F�~�yH�\L�~��[���O҇��h�5�ݵ����T����o��w�|Sf���ӟ�+���)���;���F���;:x
������)/�OS�y��U���o��2��e�)Ve3'w���gGg��=�J��^��`0��
ľ����u k�U,�Ks���ؑ5�nY�,��bXw{���w�&����3�Qה��N��Qev�	�]��Ʒ���gcH��˞��i����{���A�3���I�8��h��w��d��u�w���UI��W�q���8�����I�>�+���@��p��Qş���Gc�Z�����\ƪ����U���ߝ�]��/�:����3d�;ɫ:gB9�R�����|GW~����w�2��;�fz<AǏ�ߊg��_��l����y��������=����U��y3=� ��[�6_��3]U�_�����k�]���]�ײ�2��;��j���->��t|�+�i5���n����Οg�Z�Y|<�1NyŬ|E7�k�������?���z/k���>�<��=�Α}N����΅���>�u�Wy�d�ʬ���dz��`0*��\?W8�G������Y����:����Dg��c�g<��2+�������'�W��6��qn؟{�r�u�"w�<�Tk��.��\�r���n�O���>U쏘~c�#T?��+��y��{�Q��,�,^�qF/X�v8�.֩g��3}�ȸ�OP��~n%�hU�G4��(_��sn|W}Tg&x^c��,F�����ѭ���+�<��#+}/�Uw8B�Rh_�����|�33!m�r\7U9�m��({�ѝp���ve��w��[���x��G������]�߱?g;�,�n�ҽ�ow8�]���ו����b�����?��OV�=��Z�_�����#�ve�?��v��N_W�������r�YL���o;�����1�g�9pV^�G�~>�[_��v�NO�S��3��`0������Q����[����	veO\k^8֔��v<�Zbz����\��O�p���b�n$~�}���o�z�3�ј
mK���vU��]^�i�N���WA��#��x�딫���j��t��q��:���E=�
z%օ�q�)Cc��Y�E���q����yRG�-�+u(K\�h�P�'��*^ء��^���q�=m=y|K��vūe���\��rȊ�4���=���{W��1���;=ݷ��x��p�;o@>���Ș�T\Ԏ�+C��=*�ɫ|��G�JO�C��W]��x�1.��ﵠ9_E�б��
��V�q����)v�(��ʑ}��[G��w����Ǻ���{-�o��Sdו_˞��׃��2��;iT&�w*��w�����:�����g׭��S�O��s���j����%Z�[~_˯d�֮���+������w]�7��`0����]��k��I�u��+e�L]���ւ�oA^���;=GR��?��v쯱�;<��y�� o�$N�1紈=:ߥP�V��u��<�� <&����3K�yC��/�4��r�)i=��*/|Ύ^�]�Q�NН1q�G���w>ù{��<F�����V��r�2�n��lo�؍ا�|�m�o��'�qb��Ӌ��r�`e��ef����6
0�lz��sA�_������x7��췣*�U}��R�%�+���C�����_�	�ڟ~I\�Q��~�k�y��#_��jo~DyU���^���`5���p����k��o�?:��ˮ��C����w�������>?�Kv��:A���}E:���_�n+{�u��=����r����q͓�̳]>>��d�}+�����|L�����0���1��`0�l���e���g:��׺񶊝�`W�,3�O�?���]��\9�P����~�[��kO��W�i�Gc~�)��-<�w��.��3q�}��'v�u�w$V���n��v��(�r�����5��2���S;W���k�_�K�ϔ�8B/��h��E�ՠ�'�9�w?K;�x:�x�<��|@��c��Ͻ����V��y���c��@ۖ�Sw�8B��q���]��=��2�l�B�e6V}e��������R�(�������	V��e�ZT��4��ad��e2ޒ�+n�Y����B�����Tq��S����ߔ�<����[&�=�f��[|�����s�z�P�)G�����}{Zׅ�3���n7�j�p�W��wf�t��E�w��[ǽ�;�����`l?��`0��`0��`��{���~��������i`oL�y�>uo���i\q��K�|}����7��Svu9�G���쯿c¾#���>�,�jo��w{�Ն���ݲ�L��=�mW����2u_�����8د���jo�?���k��D���߱��m����w�>���#��}�����E:��OۡO;<���s��y����}�ڛ�k�}~����|�M���'8CT����o+�[W��������U����Q���r'����\��'�t�TY��w��z.D�=��W|��~q=_��y��M�����������Ǐk�t��bS=2�|�ұ�y�N�_}O��e��摽ۏ���tL�S6�q`C���jf��3�#��ܰ�?z�1���H�]�����\"�W���]����O;�2'@���@~tG�:�����{��u���7m1��Q]�PW�V�2�S���z]ϥz��s������3��]v�����xwҞ��:ڗ>�y��`���$j�?tU��mkBT����x���U�u�w�-I�HH��ZP^> ��DEK����F����R�-��� �������h�V!��Љ�0�fD@&L��#3P�ܽ�5{�9s�̝9w.{�x�;�����2&��EKGY:�ұ�����u��ujϗ�[,hJi	�_�t��n��[�K=,����>�|���1?|�]��[i�[`��A���L���~�R_K�X:��i-�S��ޖ�j2<�π��3��]y!m|��s69�_3�������[:��Y-�3����N7
��g�|�mځ��7E��[��?�͓M��s,}��pK#,}�4�}��j2<1��>��;���i>H��ɜw��=��:g�s
>�L�s-�g�|G#[@�������|/�w'��|p�{�����mg��?�;��	&���u�Y���]�t{�UWM_�x�>������|���[��ٳs߾}����A5���Pumm�555�ܹ�m۶�l����>��sW�?>��3�
�d��'�g�V̫,H�vğ}c�8O��%&�;{w�G������~z�'�|�}�]��﯃8�������Сw���쳟�7>�<��?��v�ݣ��y����v��3"��M_1y�i���ky��2��&�{�Y�8cƌ�[�l�<�p+�\Ix~�n���7n�x�}��wQ�=|>�X�}��Et1y��mc�}y�m��G�#�9�wx��>������3
_���Ǟ�ϑ�J�����ɋ�B��C��UWW���'�D��؋�$�d�9v�i%��o����n�����r�ݷo�/���F���"κ�Ϳ��f��߰�`ުU��\�hя��1_|���.�ڵ��ƍ�4gΜ�{���{��W��|��]�G�!��~��'�e��%K.�֭��"�[�/�_6��	�Ʒ
��Fދ��8k֬�;v�ܣ0����+�6m����_2`��$��\��+`C~���/�ۅ���)|Y#2>x�����[n�E�����n��	��7��"��3�|����YQQ�����z���E��BQ��(��t����X_��%{vYq�ʕ+�ٽ{w���ܻ�6��	��7����rľ���W]����1D��dm�q�]w]�&8c��1=�K��+<�4�(~�aڴi�m޼�A�K�����^}����ܻ��&H�<�;���I&Z��i}w|�F���Z��o�1
s��r��~L��ɜ�>�i�����3�K���9��:uj�źN���/z�$� 'H�<��D���8�4�����[o�k����Y����~��\�g���?���t������M_��w�}���.��#6�o��zb�k��g���tA���~���c��Y
�������8^��<d*~�%V���v��:?#�[d������~յǹ�/|��a$��π_�8>�<;f���~�	y��ڵk�m�ȁ��=������^n/�8{t�~���!>:�U�����ao�����d�ױ_p�_אh~�g�q�N�'*&���˗�d��~�y9/�W'������o+���	ه<�.:������r�=���0}�t_�J�
�{8|�*'/��w�����$&}�il�����=ۅwC���ܹ��1�r�{db�-�6���_�{�WdgX����R{�1�o��8Zb��mx�=�0�0�9)ާ�i���6�~'�������'��n&�H���=pC杣�i�ҥK�<쉽}o̘1��yϱe��r��d�5>`Ş={�a�7F�!/�l���m�"����e��w�w܁��;z�
7���J�V���&��i�]�l�Oŏ����%&cg|�D�u��0�t{��&�޷���C�F�Hx�I�&�؋���z,�]�lb�<@�a��_�_S�c����@�`'�����>�?���{�W�^��z��)�<�H�yɡ��߆g�Y�u߾���_~�Q�ȮW�\�m>C<���H���c���r����s�^�<�i�8��c�c/�9�ߏ<��w�S�L��y�t${�;7�i��b���� ����k�.��e�9rd�M,2�����\|��aÆUYݯc�TUU��nV��o�[�샟�}�>���K/ի8)2Q��9�����w�̛7O�;���E��;��c;���o��Yw����a�����I\�__߼y��}t��CL�@WT�C�+***�|�{�n���L�?����ȗ��o���WW���pr&#�{S��m �k����E������7Y��t�ߋ��Wd���L�8�s�;8���g�F���ޱ���3�6�Y�͂�F~��A�	�S�-|O��?��'�O?� ��R3�����������צM����I� {�ޱ��!;0m|��_�}�=��S�K.L�>�/�����y��/�=�<�e���z?������L�f�O�����N
G"�Ɋ������3%ځic���l�]���q�8j�(j�t��z�D}W$+�LPO��^��Gځic��"�����w�9��_�>u<�jj����[$+I'~�b���?���|�#ځ���|�ܓ�/���SS+>��~��j�'�$���^<�Y��&��ML)dp�{FyG�u�y�ˁJ=��<��c���o�b����|�|��׵l�G���F���B�Ǹg;Gd�p�
"&�(��	�عź����@:7HL�;J�?���x�d�8Ǒ�Nq�,��ئ�ob�t��)���t%�Gj���"1b��/>t>
�(:�=�/�oذ�>�;��a�ݑ��e��i��� ޅ�c/VWVV�}�Y��HӠ��
�6�q$��4�`��܏�u܏�^�Z�M�����׋="��Ѣ���z�G˶l�R,���еow/^�8ο)��G?�6`�Ԍ�ř)���x�̙3cm�"_q{�zJ��p��X���j��廗]vّf�Ɋ�#j��@
l��_��[��Ѷ91��)f�OV���}���>3ł?:��[�>�?\�R�+n�F�|��df��_�|?�����r��@�����O~�۽{����]~���ר�&;���݁��q�;vl����O�:U�ۋ��RSS#�?5o�E�6�|��Ѵ�j�ˋ�+s�{���j�������o���?�*��ϛR�B����R��z���?)��hݺu�*�OM|����%�,w��#-����[�m�6����)��}7u?������j��z1��<�@���k�m����s$��Wy��	>W���۟�^�k�F/��`G����j#��{�q76Q>�Q��=#���,�ǥ}�Q����<j�e%�~z��W�zD%�F�Q�T��\�:���H��RD+��9O/}�}������9�L�]�׸�"�l�����y.��t����6�X�eC��h�_�O���W�.ﺦ���W�{繃/�~�;�k����}Xfu���?������ԹJ�mrN����BK?�>ᮻ���݇��������,�7��6:��{�Z��+�pt��w�9/���h�������|en@�����O��F]{��w�8��'~�l/����_���o�U��>e�uȻ�
y���nu�K�9��,�%�����s}h������?_�݇m�*m|s�?�$�)��d�ßZ_��}�l�=�����W�>��*�d�怿1� s��u}�P#.��;r��z����k�+��֭[�_5��6�9�Β|��?�G�W�G>�����5S�}_��MP遢g�H�f�_��o�����(1M��q�M�|�ٯ��jTPx�P�>G�lz�g�M��}�_�lY����7G�Y��P����n�-���hE�/����S��;fR�}?%�'m|[���/JV�~��JT�>��iiꃸ��������q���J��/���@�?�����ၨ�ii�`���y���R���='͝;7�����m!��4�[�^��D���ɓ�f�E��;�9-���4��G3g��.�_��G��+��Ң9`i��
��i~�lذ����=(��J��(}�U����̯|-pG�ÿ�f�F��4=����kzT~��׮]7ߠ�9�i��J��f��񀖗�y��7��9`Ȃ>���?��ךp��q�;����z >���̂|͚5�T-��x���j�A���[�#G���;�<(xbeEE�w���
������wS�5�9�g@�t߉�:�=o�P���
��Z�bE�皤�o�ϖ��6���>I�X���������Mì_���'fA��S�w�A�p�9��=��3������{��dɒ%y�i�6�y�?[�4g�=CQ�Mޫ��&N7������3��%�-3�1M�|B�/�WUU��.�W�y�y�V�3J�<�oLv< 2�γ	ď�v�Y�w>?�4��-��Y'GO��U����	�*�����7��`S�3l�����d��#���r�i8��r%�9�~��qwq�Ν;w�Å�����}�x�U�������SG�O��!�|��������V�~�^�E���-%jS��ӫ�����}0�p��y�q1�V�1K�6�ߘ�<��T�ޝj}kjH�A`�Ef��_}����;����ȉ�v�zqIIɕ�Ǐ����s�-[��u��{�1>�i��9��s�J�Vs1��*�Ʒ
�7�1�_%&~�6y�[�x�2k"����/�OPo_�_}B����v��}�C�3M��I�Q�:g�6�m��1Ms*z�6�v��	�9f��X^^�͝��r%�)��w���Ծg_��ri������k�W%���KL
%����C_sN�i�H��Md�%�����}j��o��༃;g߱ĴQ�2m|�	Y�|m�2�R�	q�ۍ�?�7oޓ�.��*ԚQ��Lnty�O��Q���O�����9�0��'wt2�8��9�mV��6�팿,���:��X���>��O���;��9�l����6�I��oJ���t���`����#�0C>��0��GOD��w'���s�' g ��6�II��%:���rG^ v>�d���|�%�w���`�?�|B�i���{�.����Ʒ�k18{`/��#~ �0C>��?�}F�$�H����M;ן��oᯗ�6���-�ܲ�i��>WO�J�a�(����
�lr�Q�׏����7P�@�
(P�@�
(P�@�
(P�@�
(P�@�
(P�@�
(P�@�
(P�@�
(P�@�
(P�@C�_I��Q��
�mkBT����~x�흍��8FSHI!)$����FRHn��w��H�Y��x3��ꇤ����s�a�a�a�axI�����Ǐ��'U�{������o��_����ھg�W9�����������o'�GW
{>~����J��l�����o߾�����������)*/���N�\��ϱ�o��v�[iZ_ձa�JΝ�/:�����6�O�-���92b?�T����l�k�%?������_2����1�B��s��Y��5�>�:�>�c=1�����O�w��y�^�- �ڶ,��X��z��u��sM�#גU]�>H_���y�Y��v�!ۉ���_m�i�Ru�s�]�X�m�_g�)YY�)�m�]�y,���m� z�1��a�a�axE�ߓG�ק��o/�Y��\�k�6��x����j��gH���������|�y��u��.�������\��a�æ�M&�w����k�#�ϐ�$?�]�M�o��\��Ⱦ,�/��ڥ���Q�@��~6s?)}��,� l�����gX #�v�Q���g���B�����ٙ^��u�の�uh��m?�}{]��.~�}�v_��J;�x�o�gJ���Y]�޳�@��.�)��oqC����?}�>@�X���ߘ�'-����(�W�?���������������	�źv�Ɣ����O�ʙ�R����v�[K?[A}�?-�w����m�Ց�}<G�c�K���1}���u��x�LzަU��0�0�Pc[�<>�g\=��c��}�M�����ggg����	�DŽ���-B^��k_g?��F?���� ����v0||؎��=ǧH�P���g�s��/�hؑ�I
�t��~�{���n^�}���Z��yD������5���X���Wv��O)�"��c0��vY�����Z��|~�_%/�,��p\��ɹyΰ�Z�/���;/x����s��_��9?��P�ܯ5ݻ\�[��y|����č8�����g��ʱL{�?�0�0�_�k3���>��������z���_������\S��|<�)�b|�����7��a�a�axn.��t�a?l�^C��vk��ؽ#���~e���)��3<3^�����k�dl�c�&�jK+���o"e�<.�ʞ`���^(3z����u
���l�+6���v��<���ï�
�k7]�/l�c[`�O���n}���򚄫��G��뎱���zt��^v��2)?;Wm�r�5��o�c����Iz�?�����O�zx��{�&��!��e�z.����������"ѯ���
��1�����Gg��{+ҏ���l�w<�=}Gݽ��Fƨ�^�)�����zIp�G�����K��֜�{�{���e����G��12��ۭ��q���iumf��>�.���}�����~�a�?�0�0��[u���+�7�Svq�����֭�y΅�
�?ނ��}���X��w�Ŷ��v�?��ߩ�D��Zۓ�-q/�?߳�=��<��~����#������>���Fk���"q��z�r��Q�o	9��r�,��n�Y[;�o�:)@�-`ק-�7��({��߯�S����@�µ���K��9��֠�ɸ�>:�n�3��
_[�_*�mt�cm��C>�q��S���L���<�?�<n��ѯn!��>=���<�6�;��ǫ�s����a�a�a�{�xˌ�\�ފ��px�?0׋�#�5���z��я��c�]����x^��l�򼠕��(�f���:~����٣^l�i�n�59����W��~�\;�?v�n����6e�r�����UbS~v����^��UO7O(�|;+�S��G�4|?�f�����*?�r���W~�2�o�N��ٟ���S�9��~d�a�����և���mH�6��m�X�[��J����~�s.��y���m�4ٶO���|B��d���/�����b5��ɿ�y���U�?�0�0�0�0�0�0�0�.�P�~�*��1@G\⟿��K����rKX���s2�(ߥ�纎J���8���'>�X@▼�Q��Q�b���q��wx��b�)����_�K|���v� ��1��M�6ke�e-2Ǜ�5��9��?K^�E��~�9�ϱQﱮY��F�8��N?�~;:=J<�����-�t�ĒyNA���g��C��	\�N��X�K�s)'�^K�g\~��2}�6�}Գ����)��n]O��r�^��j�~�"��{p��29w�6��/�.�z-v�:�+����M{�W����JY��Z���굢`%��
�Ҥl9����ힶ�կ�#O�Uz+�U�?;��s���d�~v��N���D��7*.Y�+v:�ye;�8�}�~��|���+ÑޅN�9���}�{Bƞ#t���x��խs�Xɿk��S�V�/��uJ=o�G���<�ջL'����L��:�D]�6�j�f���gL��z�/�+ؽ[{����r��C�M�Y�q�~��[�{�y������y	c�zA������;��w���9��z�szW���H�����V�ax3���� �ף��mkBT�����x���[NSQ��bDD�F/��7�b�P/��8�p�8'��}��	��Mi�kŵ���R�ޮ�_�/�<5����u��c���U��qq���[�^J�z�F�j�r>&��8e�e����A�~yc�k�Ӗ���,���1+N�:�u2k��7R���}K,��z[\�upZ�}!ʹ v���'����'�xa��⡭='��}a*ƞ�@�<9l�����K�J��׊�]��
qi`O(l$�3O&$�1o�>��?�����t:VVV��ߖ�|����b�	�̓I�ӯ[�z�kޟ$��Տ���w�Z-��\���;E�	��=fψ�v�_�"�?_��f8T�Aa�A=�Ds:k{���v��C-�:нap6$�3O��(�
����g�z�ɰ����n��
�'��_Kg�/�F��� ��y2��C��v�{�
��'$�3OF���r����`�=!��yr�k���jm7�'$�3O*�P���C_/&�3O:�Pz��?}��@�<)*�P��,9��yRt�Za6���sA=�$F��t6������lp��\0�p����g�=a��c�5�2�P[}���i��}�Ӷ��)�5�=������O���0v߼H-�P�{f]zO�c��N����C鹠b�M���,�o^��?������?���s��g�|��������y��q�_޸�7o��7~��7~��7~��7~��7���7���7���7���7������Z��g͊�gj���?�?�>5���X*mkBT�����x��}+��(��H,��"�H$��"#�X$������,�Q����ԈZs�>U{�	�.�.T��}6�ڳ�-��F`���p]�k߅~��b�
�
О$�wݓٱ����|s��Co���A+�q3��lO�x�@�(�0�a��+?�	��T,�_��7��s\���Ϙ^Bl1)�C��+�k�(�FyN"8��dPC�_9��>O0&l�4��Im+���n�w��G�rŰ����<Q��q	�	+����H�}����e��q���~~�[).�5c��6,�����m�uO���9p\��<//?����N�:��M›p)� �Ĝ-�2p�'�uKq`���_�����/���6�4<~��77S����N��BQ�����맨�uM�{���5�%.B�NɊk:	k�N��m�9���*�u�U�|2���%;������]F�aג)��RE%HWc0Mg�>��)/tih�f���	ѸX�>����E����)��<,�6�s4���5�z�b�?��J��\<OM%O#(7�6�:�=	���ӋYA��ƒH
���L�s6��M�X��BcX�&ǘJ�te�.����	3.je(��?�<?�-1�$p�O=�x���	]<Jt¡�Vg��`|I,<丕}�F�Qj]�o%[Pa��6�XY��<��?�Yoh�F��067ၭ6JF�G[�wv)��7?,�@w�
�nM�Ǧ�m��k>?���L�j��=���%w�Z�izFTx��$��kP�8�E��m�	jAO����ހ��>~������؆���B9���	�֤8U��KC�v�jb�L���C��y����;�mjP.� ����Dk���w��U�E�€3�ܨ�����8x�U��J��s����\���ɟ�+;}s�F�Q(KI��Xݛ�ƨ
�1��+K����dX�];Jģ��c�x$��D�׷���X`i� ���@l̏�rn�m$���^�9΄�zBGϞ�Q=�nf�k�D�e;
<���a�>,�⢞�j��k�0B�[p(��$���Ǡ���p�4n��q`�XƓ�	�vϵ���.x�Hn���or�J���5���H�u����뇗�f����a����[Z:><�M@J�9����$�q]�}=H�k�3����鲺t�Q�=�,	7���߻����s
�>��3�����6[��g���RL�؍����?�(�&w�.7C#~B{�]��
��U�W�7��1jk~�e�cG��r����D�.=��K�����@�W�DZM�0倐����0�\��x��v�q�NZ�>#�
����BE�	��)���&y�A}t�?B��Y�m(�WIp�ɱ���|�2�+��\2�� ��)�l�8��tl�@Z.B�����e񅋍�RS��ƃm>d�I��l���'N
a�dĢG3�%���#�)?��$s�	_5=��Y�BR#-k"qGP-�e�"�f����%֩-ϓ37�����8�M9��ϊ�,���_*n;H����EBƱ��cl�~����
˝[��/sa�g�IE2�,z�1�t�:�kL�������ș壋G)��{7�o���nd������{@r�P�>�k�w�k׽��#�kXfy��E���A��B�9�uM���4P=�_�l���gW��؇�N��#�_n��G�pp,Z��Uu�6ȓ��V��Ӱ��0EK�7*|��]�{��75F\�Զ��zQ��z!��	uH�>��up����T٣�o3P)���[�^�6�����` -�d&�*=�%��fY�<�^��ط`_6����|h���3ء>��2 P��q��7ώ����,Ns�j�F�=B���`�큳�C��i�U�)R鐏@L��Ү�����ǧmb<2FH�Rq��ùF���X�i�䎲�Om�GA�����}:�*��u�f�:@ʫRH�.��6���6�j���c�GOpO-
��6H����K��J��U���:�Jǃ�����v<gz���� �1F*qm�-;�
I�7
?��O�(Yr
�de�
��F�
�	�ѥ��r��H��a���ۡ�>�,����3��D�Z��E��Ʈ�qq���7p�?��Ȍ�K����%ȧ$�;�?�Q�r�6�pP7`�a����^=����R�_����)m���>�D3#£�_'
�I��ɭu͋C��-R�ne㯄����ss���L��<ȭ/��R)|Lt_1���<u�}E
D�zl��$H�+�N_2�scۯ-�rH�V.��������֏'���(}�o	��:]謧�6�Fhlw���@��z�{6�P_�?�
E����h���߹���v��K�/�B�"M��h;�����б�o��)gRm �$�5�, �E�x�(?�:�g�U뵅F�4��� 	���߹�E4��!��q?l���A����Yv��s:mR�(G��Z�y�Gq�+w0)Nz����u�Y�-�&����"�Y	='I����8��{��m�L/~�����!����.�B�����A=���缱Y��|z��:f�#¬oh�2Xj��ǼI|1��i3A(|��vf1���
NK���L�ͫ�.����?�r�]�qBS�^#o�.l�%z�⁋
��Y��~i�䔃P��q�u&7(��U;B��l zF�x׎����M����,|PfV�֠�k��'�N��b̔/�$EN���
HA�i�Q=�u-/T�QAD9����g��W���%YZ�\���aԥ��5�O�jr����u"9��B�zp�̬�vl��l=��ɸY���y�ܾ5t�����mE��z�+���M���>�L�k�=�rr4����/g��E�r��~P��nB�[��\g[{����g��Y�vR�W'��
{Fe�m1���{�w�L��;�7�&$��x�c���0����n����&��u�@5sC�Cձm��8H��ef���t��<PJZ��@��������4�K|��#`}a�kRN�'�~IU!�k�W��L��Z�D�NK����̡U�������;��g��L~a(]��!Bjv�(�f������\��B�}�AuH�R�����g��M��<7�O��:���[�m6u�v����;3��=��w�w�n��������3pK��M�������{�.t�"��nt�?��di�b�C6��=��E	�����,��ѮO�
���0�h�v��G��;=��MV%����ʪ�r�����4�H
8r���K썀�x��A�:�2
�e�.���ݟ0N<g����'�����6��%��G�1�ַm}�^j�n�ҽ�S�0Cz���LX�3���U���M;^�^~Xc����a�vGHu"��
1��kN�K�T�?,���r�=�܎�X}6CBW6ۻ�F��\�3�m{4!]9�ử��J4n��5J�s�w��^�D��h����z������8���P�]�z���1�x��~��J8#c�%�Ͼ��cF{d�����o��@w�0�QsP���_́� ?3yB2Đ{|��5����}�>x{q(a���тa�?���Q�%��l���4�ςxmWI׆�G�C����1���k�Q��3iJh�,����K��R���������O`���ʲ���<!�[��Nw��a����Z���x�\Rtv��^ZJ��a\(��Z�PE���� 1��ޣ�h���y0�S�L!�y�QP̞�#R@ӱ&4�a�9'2��ċ�I�E�8X�Ir��
4��*y��b��˼�/#�
x����;�2R~������O7��h�՘U��^�k�
����(侠,���2���)�C�:(ِ;�Q3>��4�)�%���b6�B8�\��p�����e<��S������+�js��p����%<&t{3?���|N)p7b�����?�a�i�D�Wl����X���Z�>;u��)�ko)#W���S�n�cR�x�{[�sXv1��95�_��0K�����ՙ7�>�Tp�5���ٴ�l3�S�"؝�LX��睫[�5m�����Q="u}���pϘ*x�b�Չ����#iM+��@�Z!�	��Ϯ~j��Y�ݬ����$?5���mt�u�] �%�@��݅:4h8ۃ����tu�3�;�
ΑO�1A/r����
��R*5�����i�&j#Y2:�$Z(a�d�@�>'z
���L�����뇶��6Z��8|`�6�"�X1�_�z'
�F-���я�?��X^�A:?1�;��h/K�VB'��vOn�FS���Ƥ����Q{=kh7��M�wXQ�p�\v�͓�O/��.���
�N3��HKR��l�K�"�q��^W��h��1wt��h@���3�e6�N|������I;y��?8t[�[�!����$,ήL��e�"�z��%IކA�k��R�l!3u�8�ځy��?_�W��)�AbC��O�!rz��a��5S��n֗���#�<�43y��6"���R����߃C��Q�&>�[��#
BH�ǽ�{v�e��kO��T�lq(�UH�͵h��ݔ8�,@t�����ՂL�{p����/�*�L"�d_y��k,4�G̖��bD>,��.ok"�D;�|7�[.�D�C�A���#�i���l����ϟ�I֬�����D�q�]+�eE	��_�--����ڰc�����^���L��q�1~�C��C�����C�9��gN�����H�8Bkh��J��#Z�-`�V�o��M�a 9r$�պZ-�h�kh�
?C�$�	�^��tď��9d(�8P݅]ڶ���w[�wl��;��d��n�׆�o�K��d�H�ބ(D������In�I� M��_(��������5)6H/���Y�1�� �QR�k,n��XH��ʉ�����?>��df��&6����^EJ�m���t��{�C�����C�c`���0ʅv5��x<��\9Y��c����}1�06"״!֏��9�dl:'��1H"�<HN�&]�5��6�9�!I�1;"����YxA��K-�y�m|h�d
�"]�����U�.ak�gbbw24�������j-� Q���Od�-��:N�	dG��˥M�����I	V�G=�W�!r6�w�H3����p"��ۋ����#g6*x�9��k{H��<W�����BQߍO�MV��{Kh��^<�F�W
<�L���:w$|�oY��-Q]<ʫ��!�!垹��F�q@}3f�R�%���oĿM���r�D���+�N|�Y�Y���6�j�r1�1k4��i'X��f�\:�e�޼� �~�P9���1�ߍ��
��&7�8Q�ape�����5 9os�M�y�	�K-��u��u9��Bdx7H�V����&�_���!C�lgL �04���yS��}|�qٳ�k�����b�s:f�'/���㼳@!�]%���z#�=�J�s�`3�W ez<�PIG�C����0�@�4������5�5g��x�c��T�G��U�#�R�CC�?tdx��L`�Ɓ8����dgsT�?M6},_��� �\�k٬��lt΄l�s��:m"2��5�be\]\�˛��{xa�Lo��Q�lPwK7���?M^a,�_�lb(�1�?�����3��݌^7��:���ރ��^�us�ϚqB�8*���h�Gx��Y�C�m5�M~�{Sg�9n�RX�C}[����hO�tC��1#W3�*��:;�&_�G�ۂ�&�H|�����5�L���<4Ƀ��\b������D?]fM{V6*�S�<����e��0,�!��
A��ؾ����K��m��m���ߍ�r���O�oC������2�
���#��p'$�F�˿@!�{0�V��YW���oe�,��'��H'���`�r�1�����#�ͿMRS��Y����ZB�h�|�x��H�@
6�YziWl�wQ��}�yqs��!`��~y#�-O�Ց����I�X���m������y����|�*0o@��]ۓ�^(`P�q�ƒv��ef���v�'�OA=B����݂p��C�J#
��֞����q��5�
R������wV&�)ԩ��n@po��]��{3�v�:������Y���f*aW��_�&'
Jk0n����D�x��\/H����D�u�qZ�\ڌG+啵X�Z�T>z'7�Q��q������Ɍ�#K�R.�/C��V��g�Q�Ȭ�����\��`��?d��1y���uM�6Ƶ8ZX]8�^p��wQ�E��
&�1frR��Ki����$G�����ݜ����Е���h3'��������{���;;�~F��K�37�k���u<p��dʎ��+C�����R���Mz�Ə�7)nҀ���� lEGy�l��:̑�I���o�B�<A\���\6�d��F��q�ϡɅQ�[�1<k���N�>��S%|��Е�sTu�le���b�A}A�����ʹ�1�0�A{�K��ʘӺ�tj����dLI=r�	�PRg���_Lb�R���
Ş�l?�␔�)!��[��F��o��wi&k^�CV(t@p�W2���{h�x�H�GRn�͉�eCb�xԉ����6G�������Q��d27\�ثd�S��=\�F�f*�0�ۣ�OP���5(r�ZߙxQ�Z>�~G�AeN-��jY��7�Ҿn;�n?ӹ"P��x�}���/�N��W:݊&��׾��:x"ꭥу;��R�펔���c䛅љ�������ElmG§a=�h�¨BG_�u���YnZ쫭FYs �U�"zM&�:��Gn��u�.�DX���5Xn�����;�}�ԫ%XO?�~2&����Frjj���8��yA���*�W	������I�����9/��u�b)��Z�l:�s�� 8�5��J��>~�i�������I<�k��¶
�٤�^�S�x�[����s��GD����(�+��"E���HnֆA_��\F�Z���%������?�4`���w��_{�7��"��0�Y��@�f}������PEj�m��v:�Q������rN��[w��z�*���5�c?�j������f�7���?K_�P��', sZ(oT
|��Ó\-%�蔒�h���y������\	cK/	˧YGԻڐ����z&c"*�(,����y�E�q(�y�[���q`�a�7Xļ��~�����R���/��{h�h���"�g��=w���ݠ�՗���?���̶�uNh{�g�?tq���m�,�u�[�Y���ot��+�!�hf��.2]�ݹ?�&��wA�R���F�ľ붾Ue���%��d��l�i����q��Ms&�6�X�w-&�Y�3(���G9��{cׁ�֬ǿM��;����v��n�"���b��)�<�׾���e_�1���p���}��11��F#��YX��p�q]��s��,[�%*&��@�D�f��ҹA�ٙfs���,���>��3Y�ԕ;�:#hEL�ם[ROd��^G�A�˩f�~Y!����E���n��0�~��/�A��
�K�m���>^��WY�q�"���<цF����*c��:x�w�|�͞w��%�ehRg������d�9�̕���v�3�v
Dg��h�>>?��3�h�YDk�gC�(ʹƒ�ԕ���S����Ԝ|�
2Q��94�(�?OG�Q34�
f�cc��PopT�Ya��W(�>�@�t�X4�`�LG�ٞp��Ʉ�a��Űl\�[9�c�26��UM6f,����'����C���4�i<D�n��#�x��г
Hz5�[�
�_�����Qt��m�vN�C_��`��x���~
Mb
s�PEx���؇;�cW��*n\��?���׿v�:O��3@f����R�&�e�����m�[mٜC���5f(�M����Ni��YX�xШ���=�4
y�HO�<�0|���3���[��B	:d1�"Z�O$+Kx�i̒=�s��J����g���~�i[Rz'����G�#�v��}�>�?W~p�sϠ?��k��A��K�rŵ���k@�I�|>^x�s�?�\��`,D��̒�����5��W���^���w�D��M���Xf_8<%|8_왉pP�1����W��lm߃���f?4����:��́�_�Ԕv ���M�;k�:p�����_��sj؎qw]$F��}���y�
��,b'��N��=�o�����0,
������~��M���
Y�R���4�6+!��}@~u�j�ct�C��P.�Y(�x�׎����z�?70�WXFܣ�o�����3z����0���c8�R��G��g�0��T�U��򄽻��w�"/4��֏�����C�Q`[{O���c�n�]��+�{�{�����N!�3��<���V��yx�,!C
�b�.��lf���'��\ ן�����gu,μ���w-/��3ۥ����N���X(�c
����o�MD�s��a�#�#0{c
���%�uDWCB�Z�A��Z6�,؏�x�(Z%�����w���HbhTb2��<$��*c���nk���_�א����#{D+B<�!��S/�g�Ï`�9��.^]��ß��C��+>��3�+��5��]�q����p�j'
r�9��FDȬ)~:�����9Gm��x2���-?s�raG"yvU��pa;R���ă� �A�\&���
�?�#��n	��0�ee����d~o�q嶭�!!DzP^H)>�o��ȑ.�ļ�Զ=Hy�7�S�-M�
�?��8y�c���ߧq�|�#�5"�2Б�l�m#��U�����e�Τ�V���bM���͘�jA�c7�Z
�]>4�gb�
���s	2WRsKg�6���
's8qz�TT[�R�[w��)I��9�5x���Wj��
#�!nN+zP��ڔ�	�Kg��TE�,�����?��{�^R�Dݥ=�R�u^zîc������&D��'i74�S�J�ߔ��&H��U�G�[���cr�ͦ��<����׿~��4}څ��h���;���lpAZ�%�X�Z;t�Q?������y��k1+Ƴu6�[������D��c4�Ɯ����*d��B#!}�e>�samh����G3c^��8u9󼵕⸈߂�U�y��B;f"Y�i=�D�=����4��&�����|�C���3���g]�~���WgjhSIXU��"1A5Fr4�{����A��lj�w�T����t6<�/N�� �\����R�t��a|�i���>�T.�Wo>>�x��ϯ�Y���{緷m,J�{gg}�v~)�]��s!?w��X�����G�F��l!7��U��|Cn�fﳅ:.@mq%��臔���Ru?.��:��aB�ֺ��E#G�g'yX�D�u�SW��NJD)��21�ѵ�V��agW��P���q����Ȓ��s�?¶�@�g")���s\�T���{��f3g��o��^w:^�"��{��d#�!φt�}�,n�yWFKv�„X�4��|<��B+���8�i=�-;��X	5l=/xl��w���n�]� 
�+S�Ӽ,{՞�/Д�V���+<<
�����o �����ԇeNp�^O�����OvqR� �wHF3�݁�=o��;�`~k�R�wC���u¦�k�jE�|��qϩ���KV,���*?��xk��}Q�x�U���/M�����=��հp����=犐�^x�Bˏ���Kx���@�[���I���YB]T��➐����Kq�.ὀP��w����AG\�W�ϋ���9���2S���A\�Y\��y=Ǩ�Gj�����բ�M�@�tԂ��vD���z�+���Bĺ\������լ����6��k�6L��ʦ�R�_r�n�l|UAϯ<
���|��!��;��8�_1�g�sލ��C����� >�VB�~�,����˘_�&f���jp�/W�ԍ�wa�O ���H3����I`���u����1�ͤ������+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W����ݚ�w)���mkBT�����x��]	p�U.�7�BiI��o�閖���T�DGqEY\pTĕőQ��qT�eap�uE��M�4i�fiӼ&M�gϙw���%�ܗ���|�4}��w��
�
w΍"�%�'L(�s�y#��6������	��	�	S	��	g����)�Ӎ<�!���0����esUE�M�KX@XDX<,��s�	3X&��|MdyTY��o�ou}
��,�
�-#�$�"�!����9�	K�<�f9��r�=r�_���1��ݜ��d�j	�6���:~?>g=��j��e,gsYM(����������1������l`�. l&\��2�{7��mR�P�r���n^��O+���w�����#�:��x^��o2�_�cǎ7�߿����������q����'N�h#at0Z
���5��>D�ѣG��ψ��:�7�]
a������ǖ���w���}B<~.�^�E�/۳g����Ǐ7�)z�nF��q"�=��.B���w�g����A��&��u�lK�6�7�Qj[��A�_�{��Lwҿ�ǼG�ͭ����|<���䡙e�mmm��ڵ���qa�;'�-S
��o�����ڝ��+���)�_C��Y�G��.�y_�NC.�:���l����R�.�޾�r��lˋ�ݷ9rvG�ψxq���l�&�=+J|�[F�����㷚m�����H~y'����r����	$}�ޱc� /7���j߾}:�C�?�������N��E��#�{�,w�.޹s��b�c�����bc����|�x��(ޣ�@�;��Ç_Nz�-���e� W766~�t�	�)����ōo;x��l�pߊ�	|�[b�����N�>G�b��_h�?��޾�}��ݢrzAT� J.� y�,����e{����J�R��sl���w�pߪ]1�o~Kȿp?ɥ�({���D:o�1~�w?Nz�fzMT~&<�s�kz�/����3r%�>t�Г�ݝJt����O��
ܷ�b���ؿ�<�\����n3z&��.�[Υ>S�c�mM����`)�o%s�VɃ�9�Ar�ڂ������狊	
�����?������e��R��՗i�&ӏјڼKs���~������*~}���%,5���.�\Dqb��
?���θ�2��/��o	�?��㥬�=rj��l�61b:�O��Ȕp��gd��F��N?����"ә#��E,��Y��^E�"r
��
?��r"2��ev�l��Q	�_���:����|��<~Z���_E���x��v~vD>���q��\C���1��}���I�G�_�����k-�,K������憾�-���`�{��u�뽌~‡�@y��y]c�f���7'/�0�e�L�x���:��|�|T���l���:��R��.G,��"����|�}������u��677���Zj�X�c��H�I�g;ds��sΪ�b���}�'3�v���� �:ޛ�6�V�b�n�=joW755	�q9t����hQs��l5F���32��u��^lpy����b�a�g����{[ZZ:� �Fn���,t%����ɚ�	.]�\a�З6���G��!�%׾���XO�xlV�t������eU��@�#�i��\��z��]Lq�����:��?���	��I,[_����r,v���{�:��]���%Qܗd�LMr���]���K����N�mJt,���c��/��o���f9��r���)�ȏ�O��q�t���o��������<g�G���l����-�����<רq��+��c]�ֈ�Xl~%s/-W}늽{�4r�|OO�s����H��J�7���젬ӑ����Ή+���w��t������� q�LÑC�p6������.�}�Sd����p��*�E�;t,��t^����l$��c8v���&p�a�װ^�ߘ��1��\�5�>����7䬉Wh��w2��b�����Q��
����x'���7O�G�φ�^ζO��)�G����$�Y��~I�Lzlxv�?���~@�?��XPl�6��屫�=D��q�|���c���������=ӵ��6��@U�-����%�ǃp�u��Ȉ}s���lq�v#�XÑU���b!�{���s,��8�c�ޡ��B������kW�a��`�^V���M'��P�{a�dqd�����G�9�F��=f��x��I�y�Ż	i�|�%�a��c�\z�����!�ی���.���G�<Tc�l-[L,~
u�GT�CL<�Ǧ�}�(~F�ĺ���'9��~n�O�l��l9�Wy^@t9��jN@|�����3J�#6s�
��Z��V���8�7W�j:�p�@zn5�Q��Y��zظ
�_��3�ᅨk>�?�/�G�wB[.�(��o�5�:�.�Q\Ga<?��o�"���?M��T���P�D���u�0Ϩ<��=�[�\��1�o�� �m�K�~�ó�o���c��˜��c�D߯ƨ*b�d�1��H�ߡj��?�s]Q��o~�����>����}$t&)���q�Z[[cc����1��tB������߮��_���ظٝZ����1� �`
lR��P�wp�$�Ü��LIx�'-n���Q�Ԝ ������)�e�w���'��n���?���m''��֓��\뵎����+4��	��l�5MMM!���w:tH�I�{Tmk�$���m&�ō�i�]��U�}Ĺ��}Kx���}3�J��s	�����"k\��P��oU����vuuWc�T�꿿�֗^�M��T��g�����#�bI����Pv�o;����G`
X����׀%a����߯T{����O����o� z
������sط;���=q-��H��gݽ��>V�Q�ψ��X���8>F>_����5�I]�/-��ߦ�<�=��DE������m��f
��7��E�uIP�[�;��	��8���\Y<�bX�^�{�P>����{�в����@��4VC����<m���r91v��or��<���o���!��_��v��)�\��V�����f��y0�����t�=��G�G��3lt��zŜ��9��q��ɡ��:��of�'j�ro�����϶�
��%�{�7��/vy��9Z���ޏ�O�!��W�/}����؀��
�,�
o��h?�s�_2c�_��f?l�3�|�[��rA�u�{���r��n��bWX�g�-3>Pο�!�W��@�����rA����`���C��\gb/d��3F��aϿ�8�7���%�r���?��j��G,(2����*��W��9t�:�Qg�Ğ�����6@�y���a���A�+Ş:�Uι�Q-�3��L}�1��z*���+��?Z�s��9��^O��fW���Ԣ�/�:y���e��=�Sj�g��w��s�a�9��{w�Ow��g���>b���c^g���w��8e;�����ϽJ��N�}��r�W�;@�{``nioo����4���\g�>�ֿi;�T��Qf��4���W�����Y��R �t�o~��-�@�6�?�Z�9#?��`.Nw�w~���1,��\�0ԩ��jqG�Qc�ѷ���[���7�E�uX�h{	��uO���`����W�p�Xf��f��{׸L{���D[֝����7��o�����9J~L�dL���e����f.���.��\�w@V�g�f-�獺φ��1��$�Eq����H�}9rn$Β�Z��z�y��������g�{�"�L�fֲ��)�e}�Sד�����-��������r����Чz{{��r�p"w~�e���e��/�h���������=��5�z^��|�[B������p�7A���������킽>_�;୮c�gwc�F�����q�@���T83�]��~6k�p� �SnQ���Ph��]�������˔G�1��9��]V��-��d��T��=�l�����?�VA��}� �fP���'滻�e�Y}��o~���ؚ����Qn�5$Q>��0�Eܽ
�~Ay%�آ��
;�37^]__-q��x���k�S������c,W�;���c�����U�p��7�e�����и��1o��{�S̹���q�	�7�\�|�sK��gY���z7�Y��(�����o���s*�\�~m�_�O�Ρ�[��&�O�-��
+?�/ػ$1��:�5��s�������Ƽ��\A��P�a���~��7-q6����;9�9j�a�~��&~�Z�:���VY�(}�;H�K��kW�/�W���y��B���5�U����L��350��#��)�=��L�|Bx_�6i�K�g������A�_����>a�ˬ�J}f����
����	X� K��W���äR�{�|���(���b��,�f~�v���C���ˬI=q��<�~<�	0g s�e[��_��K�`�bg�,,`~��<�b�PH�o-�g�K׏e>�\�d~�1��\7�V���Z���ds~3\z�fۇBj���=z�H��T6~�`�.�7�Ŀn"c�=w;�y�g�Oc:�7n=��u����P�ma�!�9�(�#���߀������������������������������������������������������������������������������w#�֨:2iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>Adobe Fireworks CS6 (Macintosh)</xmp:CreatorTool>
         <xmp:CreateDate>2012-11-13T18:40:53Z</xmp:CreateDate>
         <xmp:ModifyDate>2012-11-15T21:38:58Z</xmp:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                            
<?xpacket end="w"?>&
�� IDATx��}y�չ��T�6=3ݳ5�̰8�&,�J"(��j��1Ƙ�+��q��
��j�1.�c""oܽ���$�G�&7n�P��H��mf_����:�}N�[��gzz��>O=��S]}N��]λ�9�Q=��%;d����a��qP����fP��$��\��12$Ap!�@
���<,��#
���nq���r	��Iޫ�G8G����C"9d��P��7?)^'�kyQ`F
�M�A�!�R��0x��G��OH���sD�	@�x`�yP�QuG��ȿ;�H0�#�х���,����C~F���/�^�~���W-X�`�ԩSO�㊊��\.�_�"Ƙ.���4̈́aQ�0"�X�����q׮]��o��
# �[$(�4$ܒ��5��h��P$�z�[6n�:uj�ʕ+g�~��gVVVNq��%t1.MӴ�8�[���S�L&�]���;�l���=�ܳ��w����L0��3hn9R�P�E
yx�`=�Z�j�%�\�����]�}H�|y�A�eY眛�at755}��Ͽx�]w�lnnN���R��`g�r$QE�Br��M�>ݿr����<�̋JJJ&2�\"b�Soq�Mι����Y�8_c�i�3]\O^�eq�y���{ϫ����m�ݶeǎQd�a1��G���4 ���>d�V__�[�nݙs�Ν_\\\�̍K�4�iYV2��uvv�mll�t�޽w�����oz��:�k�ַB��~�����q��ՅB�c���8��[�i��1&E��w8�foo��_}�e�]�?]]]R4QE
�1镑$��V�^=mѢE��IH��a�C�m���5k�l߾}{/��Kg�h�y�^�_��_�,X0yΜ9_���>��vn�`������m�ݶz͚5{��	J/2��WF��E�|pմi�.t�\^9> %>,�J���|��s�=s�w�hllL�s��WMXI�L���ޟt�I�˗/?��_��w***�j��Q�3�L��{ァ�;�ߵ��%��PN�ǀ��p"�P��&�������s�=���L�,���=x��_o�����F9n�W��p���qh����>�o��������&	��,���}�ҥK�|ꩧ�ߒz%���p"ET�8�PD�/��s�9g���)�?���i677o]�r�>�`#�o6u�@�/Q�1���n���˗_WQQq��i:�`"��z�'n_�h���+����DCFq��Cr��mڴ��/}�K�����b-�<��/����p�ƪ�&�SA��W?u���X߸q�7�8�+=O%�/�a$�~��g�q���W"�",�].@2bJ�!�C������/Y|��ǟ�i�,⯹o߾׿�������y�_��3�
Nb�I\Q���|�Ȥ�e;��s+x��kjjN��P�4�����/̚5k}$�G)�F�d�7�H0(w��ܵ���M�6�G]]�<���`F��_^��o�5d�ԏD��%��#�*�td���'�eo����̙s���^���e��>�앓N:��R�+���h5 T���'&�544��c�9�����x��w߽⦛n�	��
R"����ٔK�%�k�����9,�����-˲v���i��5C�M)���X���+��s�>�!7RQ
`��N0�ܭ[�>j���9O�����k���s�y��`2�zc�#�\�������uq�RU��|���͒sZ�l��h4z���4��M�~�r��*�5[|���bYO7�׹�|ѐQUH��i�,��+��2M3A�������?��Ȁq*�b��ŵJ�� �@��o@|��Ðۏ�
�1� Ƙ~�.������m�s3#���O�`�� �t���F�u�?:T�H�Q`RO�L��{�-�,J$a:�h4�|�W.����G�)*G�F{�*�&"�D��ސ�i~1ɡtIKwO�S����-Z� �w�9�b��E��9~��1�"(Q>��C�H�x1ROtZoL�0���G�:N��H&��?��O�v�ڽ�[#�D�� �M�������a�Q���0�\W��s�wL]�|��\.������i(�wE�H�C�	 ?ҟ��P�4�
g�=��%������|��'o��������|VJ�k�0�b̂ݳ+�8����o��/���e�i���|�͋\.��䤱 ��7�w2�H����n����'�t�i�[��={��v�W�U�\�J0芖�-�85C�'�)P亇> C'�c�"c���~��/�߿�
�M�ة��z��e��Y��E6�&Bo5
��ӧ/Y�d���� c�6_}����F��7ɷtM���u�Niii�鍊n:A���)e/�@���/���5	��D"�������[��ryV�X��z/�gR7�}z� @�l�z��3JJJ&��eYƆ
�~��7��q-��Rms��FzQ�9gUUU3~�_<��g��l֬Y��c�4;�H,�pd�{��y��'�|r�]���'�^�z2\"A�2$�Pq�Fz���9s�\(��,��|gѢE���\>'/�������oo|뭷��9q�p�U�����W_�����[Dh���>���&L� �rɀ�V�AS��߳r���~�p�q�4{W�^�0r�!c
*����nw�ܹs��n\�n��pcá_�GA��	����x����i+..w��
;��{��8r��:��<묳.�eY|�޽o�[�n�c�2h***�^�x�---k/���~����x��_�~_cc�&���s�](^S�k@��	Uw��~�V����K�,+y�m�=	��P*o�,�D�����?��o?����~�J�:@�Y�O<��F�y).Aii�1w�q��-�4 ��~�?@$:v饗^"ԘeYhii�PD�h��f�
[:��ɓ/x��7���K�`x���|��׬Y������<��碋.:v�?u����p��g��3�D��s��{��">��v���9�]]]��_"�h�0�%mmmƫ���Q(w@]]�i�`�z���sB:�t��9���I$�Ɏ;�s���F<�?LZ�x��#O�2P1�rI:hv�׾k��̌a���u�]'#�r�Ol���kZ��ӧ�?˲��ظ����f�����T������C=�u��+��/��1
��&���e477�L|��y�g��9Y��r��$�����M�97�y睿"Ru*�9"�v��O9�����_
1���`׮]�[�e"�ܵ����^�W�;
�|���D��ϟ?�D�97֯_�]���UZWqī������9�---k��/1�դl	��6I�#�|�1_��W���$�U
���ev�L��H%�umٲE&*P5�a����f,^���!r���������0�n��i���/<N|�_��\�ؾ<}���5�,���L�t��8��/�n��[�^���d�[h�-񢻻{�\$2ƴ�3gNG��JN�d��0����v����#^z�I���ۻqÆ
�з�L�T��S6%�����HVUU5��1�@�z��2
�sn8p� �9RT\�*��DEEE�_|�m---ko���[�М3	
��}8|�p#�\>����+U�ɇ���r��`���Md`*�|nH���q�H���®���UԬ@�4x�ފBƔ bA ~뭷���!�&��:�n7?-œi����{������..d,yB,,0_z�v|��Gԇ��F4s��Gu��X��6���5MZ�1��q�\�t�nQ3����!J�3�<��~�œ^ˏ��I�y�h4z����_:o޼�Ȗ9u� �/�C�
���x<e`�ft������Ԝ3�{4S2��lڴ��y����	&r��Y�f�P����!�eI'"�͞=� ��h��;w>;w��	WHW;-���BG�={v2`q�J��i��Ƙ��/}i��׀���Z[[��|��WM�2�͛7� u�e�Vf��4�>c<3f̨���dw�s���DV2���7�M�<y��[`�P4=��/�w�%����xN>M��9a„qRoX��x<�U���$�v�������jN�`$�����7s��G��˧������"D�f4-��DVWWW�<cZuuu=��*����cHhϞ=�;w�3g�|٥�4A���p���T@����r�x�9oiiً�%A�K��9^��?�XZ
���`0��Z���5j���u��߿��c���=эa��U3�1^�@ 0��%Z[�l�&^;�r�$'@���q���Ԍ�z�U��� mL6*�F��_~��U�P�%K�|{�,�nؕ����g��Ο?����s�eY���~z7
p/��~����k�"�8�Y�d�)�����~�װQ2����o{�_��_���7��2��Sv�ȧ�I�|��~��'1��8�����[2`5�x�
�ړ��?�D�1�Ϝ9�Tr
5),��k$���\}��WΜ9��>ē�'d�A��S�N�%�eYVSS�Lzp��je��
�Σ�����N�0�L �G���d�c�F�oawww����]�dɇ�m��t�BZ��ԨtzԼy��P�D�?8��شi�f�|�^*'����i.��/��eY�gn���W���S��7XJ&���_~yU0��=�K<
$��)�S�����Y���W���1
�7p�i�Yz�7o777�-�EMc�]v�U^���ւR�!���CO8����'J�>��n�ܹ�#������-[z`�wN��}� jRX�K�zꩧe�VVV����G� ;�hظ���u��_>�wG�fl>�6H'��z�_�h�O<���{NҦ Q�_�\r�
7�D"�䉺���,Yr1��Z��X@_I�x(��'�h�И������k��J�=�eY���ܹ~��ϐ��?�!Љ�&�i.ٸq�)�����{���"�%2&-Þ49�R^��d2y�������-��Y�r�����fPe��K/����Mr}��N>�H�\֫��zKoo�Y��r�<��~���[[��:�>�w+�n��N�����Q[[�Y�l�r�z
��ӳ��o|vy��/�3���_|�&�;v��~���t��\�(Q�0�e�q�"wG!Dy��z�G�NJ�`�����>(ZR�Gހ���Avp���E<cƌ�|��'�TVVN�_�F�͡Ph�h]�O�����"��fc_뉡���g���}�M�|:�����޲I�Q�G��Njk�$���9q뭷�6MSƑyQQQhǎ7�5�L�qʗ��!#s4���%�SOP�`Є9Y�����Υn�;
F"���~/r��a�z��Ͳ֮]�w���2�?~���?����� ��/K�=�Vy��n=AI��3h�(��?���555�e�eY�ᄏA���ׁBۣ��'��POOϞ��4�5o޼k~���>����dteq�c8�$٪�r3����C��׾�X�@�����W\qŋ��V����pS����ŋ&•w��o���E�R��H&2��H����G_��� ��Ն�60�,Y2q�…���z��H2�/]���={�Đ
F_��}S�
̘`9R��l=�6l�p�aq��܁��R����T絙H���{�,i�H��$)�"�t�^�+��\,k�
�b�֭�� �~Yi񧡏�r|��i&E<���?��eHu^���_F�A��Y·�nI���]R�$1��H=8_0����a4m!s2M�L��O�����&��@������L?ɟ~���wܹ�#i"�oܸ�+�����KU~��R�ء��@��6�F�:�裏κ��Koq�\E�eq���ڹs�ӦM��P���;\mb�Τ6yK@�c�i&�l��ؼy��HK���"T]�YKy��z�)4yZ݈L�:u�Æ
�N�6�B]��ѻ��>���p7R�֓
�m۶�`ڴij���c�eY������_|�
�8�������sM�a�Nqu�1[���Ϋz��o�����i�N�شiӃ_��W�A�`���p�����֙g��D�(R	d�D���_�ꫯ~U��œ���CTEŖ����g���y睷��v��uLӌ���Kw�&��/ @��]������Вj �����t͚5kn���]�gg8՜R.��,z��~�ӟ�bŊ����'�Жe�h4���f�O~�0H0���"���)�hjjڼ~�����ZHJ�@
d
�����Jײeˎ��k�����!6x��3U��b�F P�N�����O�>�{�'��%:::>}�7~�}�m%)4��l9�S�L�Z�j޼y�WRRr��N;�a��x�g�u��
�`0���
�͔\�dɄ�o�y�����~P�a��裏����?��s�=wX}
��/��f�…_�2e��UUUSt]/V���4�C�m��։M\�%X�~!*�$ @6(��H�Vy�>���.���~�)�b#�Lvuuu����8���ּo߾|�A�-[ڶn��B�9s�}�_(;���kjjB�PhlEE����c�nwPl�&�I ����O�y�GV�\��ls4�uTi@;(�f������}��~��o|��zƘ;�Ƒt�<��$]4�1&7�d4�"
�@ۮ'��·~��+V�C�_��=�T:��h�i�UVYY���O�?�y�������2�8T�KJ��~��7=����	CBͿ��!u��&�e�n�*]�tAF��Y���I'�T�lٲO;��cƌ�\\\\�i��'?�K�Tz��Ro-3�jll��+���jժOv��� Z#B��v�I@$ь?��퍞s���N;���|ꩧ�RQQQ�zK�^o��rk���m�9OZ�7#��ñX�������޶�����Zm4gJ�nImz9��V)�@$i�pE�F��Z&7�9��j����:����P���~�@�&đ
RN��=�-*��S}��Ԥ�3�M3�4RBI-𡩧��)�tlD9��5	Pz����-0�D�Q�S텓~9�
�#�P��=�Q%Z*�����>_Rŕ_q��yD%'=R���v+0 G��Ө�)����2��( ���2��( ���2��( ���2��( ��l���:ihhP�Z���u2iҤϗ��HB@P���:�<���&M:�\�$�p*���B�$��]m�d`����8p�S���$l0��*���l
�p3�@8E
��l
�08���w��J!��Q��ݻ�hGo>�>���
��\Ij���f�$$9��q�7�I�
�CM�˕mb��1�������x���9QӴq��2ƘLQ�e�C$�q�#��v˲��������p�0�R��6H��C�-G!�$jZ�c>���)*//��z��u}
c��OuI����W�s��e��x<�NWW��X,֭��o3��#�"�db�<�����bjII�]�Oa���Y��"���w���A$y���s�i�jc�v���`@q@D�"�����񗗗�VTTt��i�Y�J�A�v@�0�"J��L��Ȥ��B�k�kqI˲��>��ٹ%�HDa�{�Ũ��w�y�PPF%�vd.���r�|UUUg�|�����![��Bܴ����4�O
�8�L&����h4�Aƭ��^�X��]�r��4M;V�JƘlz�U��,�`,����?b��\�!�N��$O��***���4M�{�e
B�4ͭ�h�O]]]��D/�9U1����ӊ���KJJ&�|���~2c,;7��4�O;;;Wwuu�s��� �2�DD�7�*��}�xZrsE��H䙎����<��|Մ��+��������\TT�MӦ�}���<�ǟ:|���~Q;���E�W��4/IDAT���6UZZZ[YYy��iǑ���x�4Ϳvtt<����(�
�*�|��Sb+�T�gVVVv\ �T���!�d��������p8|�TT�W�����fC�)t`���_���Kcr�K)"L�4�����+�Po�Z�A�������c��i������u�����
�+���Ҳ���ʰ"��҈n�����.�z��#ӬL�%����e3������f���H�����zj�L����FQQѕ��Jy;R��X,�����p�+�'���aD�*)�h)/]�uOmm�b��-;��ə�a�~�С{����&<'�\����PŖ���\�&o�����~EUU�.��4e�F"�x���yj�Z�.�F�'M��s��!���� R�uO]]��\�yȬ
�9�F��5�z
ٶ�Z�A�"-�8�V>rZ��r���MK�ǶX�������F�?mP$��W8�K��E��{�r��C
��ċɑn0~������q�;���V����]SI�y����A�l�%N���U¡PhNII�
�1�������W,P����'C
��ijze���]�z�FS[[�
����l��rc)�� �<�'����T`�b0<����n�XŒ��666n�H}BEW�I��H^I$�'E]�icǎ����˲�577�����\�O1�P�Ɲ�g-�khh�1�&M�drΩK�6e��I�������Ҳ�s~Q�z���B�y�3�}�:P�tǝ�P�BD�Tⲉ��^^^�Ų��{�[\rFkkk�u===aC�[�ݔ����>����Ų,���	�I�B�4�����UUU= V�iQ���z-���]�)%���!��4}�+p���
��cEd�����?qC>��'đ�(�v:ҝB5M�!�X�&M�M�Ӝ���s���k�<�)��`ee�ωA�R_=�>'F� �\?�幺��ᗒ��÷_P��F1!2@�-����|F�I��!c�"�T.�����b��A#k�������d+d�}�:�Nι]CEE�d�dzD	'��הU-��@]�R��SE�Pʕ���!�/�w��1��~�С��x�|�y����@=2ky�h�Fޔs"
wغvz<��@ �\�)��[ZZ�0��E�{��	҃���:e�ĉ������LPS����ғ��w��5���6����䜛�^�9�@Fty���~�r���_��f@\�׉�£
c�A%���p��X,օ�k�6)�\m��^i�>�����	&���¾Q�\���T��1��*�&X�x�'�B� ���+++� �%�o��׉T\�ms���z�"s�aﴴ��;w��%'/�}.�7jkk7�����s�!�/�2��ϦOZZZ���)E3�]�r�<���-�A+�l6Oyy�i���ݢ9缷���a�#�ca�r��+��|K���7VUU�g16�s���Oo��wtt< �.�i�6���B��u��G��T'�)(**�d��0�̱�����Qb�U�{'N������ì_�>�k ���	�www�3Ms��������r��a����UTTL�4m�8�sΓ���O��0��52��f��P(�����h����ڮ)݊���g#H�&Mӎ�����ŕ��>��N��H0t����d��e}HL4�&�ܢjH��v_P[[�q�ر�`�����,�d�i���2�����aw�S7A�8Z	EEE�"�}�D��՜����1Ɗ�~��c�9���@�����4M#�n	��~�h�Y�r�
�hX0�#\$8�;��d6b�4M��0a�yꗁ�1�K�A����w9�23�1Ɗ***NF�ޟز�S��
�{x<�Y 1g�0�*Y4�wD*�\.ל���G����C�X�)b˶��eY�i�r�n��!��d����V����1K�x<�W�Md�b�{������>҇~)�Lι�c2�|�0���d�YU��:'����2C"g������[���5ҥbN�����+&N�������,�D��ӻ5���MԼg���|A�S��Sq�2+..������b��LT�r�z�"]�g�2n�#�����4!��H�wII��C��#A) �/{<� +i�4�-&F��ꋤ����J�o&�ܒs�˲���Ӽ^�t�鍠�H֡i�d³�i�tk	��>F%I�R__�q̘1�з����A�4��ݻ�[j�$���"#�=0嵜g�����a��!�|T�,'b�U����VTT����{mGG�ndg;Ң"���ݻiα��ht�ݦ8_#ٚ��V�"^.Y�J&�Md`*�|nH���q�H��g�eY���c����u!��s�b�&ds���?O$�0n~�I"�d)���?c���������ێϙ��p�ӈfN@�D'2��Wy�|E�[��xM�+�皤��p��9�H�aD��<�'�C�F�X���}^&��8�{zz�hmm�� ��4C�-/��{� ��c�L���\.�a1d?A:R���q�#"ET��N�9�-��[�|T��ΗC�ٚ��
����������͏���8��h�# >��
voFA�|��`1��D����F��I�!j��ZS���.�F�����w;���+�zHޯ��x�؁�Fq�G"������Fv<�Ϧ


�s��8Fn缫���H'2�3]�Z��F=��H"����E�.g[
��M�EYAӴ2"�V@,�j�u=]>��z=��Ml544h��}b�>|��'��v�k<�T@*��&"cs�4�"{I���@���D�c��}�8�)Y�N�֨�4�m�H�������.�U��/�4M�8i�R<�&^;�r�$'@������~S�H�X����b�N�C�r�G����F��:t���4�*��e��������E*�"~�'����B�̣�h;���:�1����b��� Ӂ�ݻw����ʗ��hmm�]��4}�ھ�
���O��G�y�h5�x�
�ړ�����].�X�����
@ă�W�-&:�d�;k{zz��¹�S!
�r���n�b��������
Z�����w].י�<�r�d�c�^CCð6��
ڲ���Z�'�O-��1�tz����|5Y�h�b��rhP�
�=��>�
�I�&Y


���蝝����̦`��WVVNokkۆ�Yz�
�<�F�s��O*)鵶�����Y�������1
�7p2{�d�w�x<l���\.�q+))����}���,��x?lً9�5c��ݻw3�w�K3����21�]2&5K����NV��ҹ��p�i��\�/�c��$�֐�R2Ms[KK�����5���XR˜���e��J/0Y�)K3�Hj,9�<��[�W�5���n����noo�aY�>r�;^L���sy�6h����^�w���D�
mC�[t#S�E��E��Rj��/�X �
�y�����ݟ!�;f��pQ���$�<����sKKKk���U��1��J^�X�y$��۳gυ"F���
��]O�4i�-^s�������L������ߚ�)9�>�y'�;�W.kKK�˲ ��򔗗_��E˨s%�5㏍��666nDvg7�� h��,��u����˲������ls;oq��͙���� �Mt�\�+++��G��e#L��>�&�m!j�涎������w�H�	�E�%�ƌs��iǂ�:G"�EkB���۪�/����mmm�M��INw���I씵���.��������{������=��҂�6�t�JJJ�}>��$r�4�:�R�.ok�?+���i��������^;4~��(Rt�I��c4_Vr�\=�6Mj\b8�D�j�0a)͹�w����;�Pt@k���7��,���ko"���g����رce'9iqI@l��b�"�M[�cX����Mi�&�+�����|��r�&_3��Q�7$E�}B�;
g��8�eY{�W\>������a�'r���rƘGtfS��8C�'$�޽��^`�����
�f-�g�inonn~����p�k�7�zm�c���3���_VVv�pIK}�=�YE.��<(W���DZO�
=m`��%%%����V"ᶶ�;E��
F_��}R���zm�%��p�P$�[���T�B�{PTN)PDz���G�o
�xR��D�	���u���TVV����$zzzn�`Ps\�‚�^��OSO�6nܸE��"��|��������O8�5�I���aKGU:T�E�jM���S���/D�Xy��h4�����`w�!�J�_�����_�v��E�$�<�D�jiiyG�(T����~PC��]��95���P(4����ڜ
��H$�=p�p��g���j�v&��[�����b�555=�3�M��Y�P]�&
oK�'����Fd����3�R��s!2M�R�{���~;\w#e�l��7�bB.2!�4��---w����!��6�6��r��BƕC�4��c����
�B7�>D�"tz����0L���RSS�-�ϷD(��p�[���---�
W�S�3��|kPh�+QTl�
[��������$z�xoo�ݢ	t�`���?�A��'(���'�[hI� Ӳ�O����ttt��N5'�f�;�*��Χ
�ǖ��]��ddt���5vww�jkk��f@��@!b��> (a������;;;i!)�5�5��w��]�]�@�@ p�p���q���C0�����x��Ph����?��0M��X,�{��'��;T��{<EE�<��=MӎA&�-��<&vCpZ���v�, @����	���K�S�n�b�s�{,�ڙH$�o$�0�A�������������tMӦ��?�.�0cS{{�:����/D�pEmI��ݡPhvqq�)G
@�eY{-�:h�f�a��xc<o���a]��>����v����j���4m����5M;V�/�����i��F"�G:::��m�ԵҠwjQ@�,P��$m��\._EE�,����i��t풞��kA�E�Q�v@5Q�!h�z	�4w���<��޾���/o �2q@��ۭ�&ɶ��������	����\�SD�\��#_�6cSOO�sP�o�zH�lл}@���ȑ��
x<��`0x���-Z�p���.y��4m>s�M�!�4�����������tD���q��pn1@$94Ԕ��tot8,��p|>_iii�d��{��i���R�XP(f�g"�s圇9�]�i�3�o����)�B�V
OSOm�7$ۭR:�H"�����v��:@-����f5�V�K�6��߷}7�<�UW�E�BQ����d�q����^%"�hL�M^�)��V�R��:BM���amk�R@$)�"��'�2r�jG��*���F5 �8T\���BE�jI�ߏtq����6w��a���k0�(y�48:
�(����2:
�(����2:
�(��*��nMb�IEND�B`�silverlightmediaelement.xap000060400000030255152455615120012173 0ustar00PKx�f@P>&���AppManifest.xaml���J1E����I(Zep
�T��1���KB�os�'�N�.�n�p�}}����q ,*a(��S�uq=�-��˱�-+I;�cTό��ݷ*'����/>l�^��j	�X��:���R�qh���3d�O=�@��
a�	�	��eJR��{������3eԹ��͕���!����\>�ȿ�졨ͭ%82jw���xSO����C��PKx�f@()��.�SilverlightMediaElement.dll�}
x\Wu�yo�i�4�e�G��c;�mi4�?�ml�8V"Ŋ%;q0(��'i�yÛ�mEq��@JI?�t?ZJ�ڦ��k�l�iڅ��.�Ҳ�t),��Gh,t��9��ͯe�P��Hs߽�{��{��f��w�
Z�ӟ|��0\�s	�����n�ҎOK�_�1��)z
���%s�T2�WK�yţ-�=��g�'�����ܥӘ��l�~��q��� ���ގ�6��>�sGqY�
P�H��
�����W�Ÿ����xK�F>�/~��k�xL�ӆ�c����\(�u��z��&�������7j����Ci�iJVM	^�g�����j6_zR\�q�V��Y���K�����'z�
�*^Z6^���!��,�]$��aX�T�p����
�ݪӐ6d��u�^�%č#P�����h3��0h@bA�=r��AE��@?ׅ�7��0N��7G�7a8`�R{�
�B��
�b������/>܀�׵
��E���D{�̩�>��b_^L:��]݉,�w+��'�l�.*�=z#5�&*e���~�:�Q�4�L��@�C9{	�`ڮ}Á}Tr�k�F+R�VD��-���S���m^2����;ħh��]��.�NUɲ6!a=Ø(����4�:gB�	�Y�F�}Ȅ��U@�ĵ�g+ks�7M���m��J�vm�
hA�2���!�wT���rEm.}��B��~X�hEB�������-o��C�/��>q�$.��e��l��NcX]�Ln�$_z��D����K��"����K\v�e�/�ـ��^{ ��W���דI�B�
&<\�1�
�ۄG+���<^�0��v��'���b�gZ���� %l�w�M�!�%w�:�5���Ŧ�X�򢉲�Q~d�n����۰�����>,�@��q��6KN4)���l�U0�I�ATP=Bܠl��!k����GP�R�c�@��>�f�nҦ�*�Y�}H�2�qQΝ����O���q`��MK� �ʈ[,�o�A|Sq��}5��+#�6����U(��!{~B��c�8N"q���p#~~�(I��n�8�5Q���ꄈo�JdQɠ�ʖM�����^7p+��^����ȫ[��ݢ���(+"�"���[�����6
���d9������,���RG����
آ=ǀ�)j���J���BH�관P�;x�����mdDѡ^�M�B'��:LS1�^s�:�q:���,EORp�����k�ǝWC������u��k�-�g=�+����im��'*z7<���in����Wm��r��o�<�G
ڷA&�#��
�ݏiU���z�
V�k�&�qw�Iz-��v�=cB=����8;z���O�*�=�l�]�ތ_�Mv}�{��I���� �n�H
�g�g���}@׫��2:m�3B��1{�ߔ&^���_�O$<�h�3��:��$�A�5���i��2��0HI%�f�K4��}��[E7���^�5y��.�Λ�ƿ@��L��ꀋ)ko+����\�KAs��yY�sLD�*
(>�C��j])���ڟ���h�A锵��SB&�R��?4����ғE��-\c�4�]e�{鶿tW�@�w6�[��r��}�`��6xZ���7�)����`>�vm��p��6j��D�a��6i
6۞hۢ�8���Cߦ�z/�t�ظ�[zp���m7hO2�vK�׷��r����Ծ(�t�Sd�a�o�L�N/G��=�
�N��K��[M�[�s�['���G�)0����9�36h"�W��5c��}�dpTߤ="��=��w��N(ƥ��C-T.!��j���v�d���O�k�{���}�=7��&6�NQ7i��։����#�@�%�ú�jDA�D�
e���1���6l�)ý��G�T�q��,�ug�Xo�����>c1���v�UjԎ0ɰ�y}�dS��UV�k�*�TZy�x�y���dSH�K�P�/��ahou���5^�냂@�>�����V1�U�����4N��źL�Ī�����'\�G&Q!y�v�D��zmf=7�l�eM��v��
i���,�c�[[v�S��v�A����&��E~J�1�Z�G���>tM��W�H}�F���ª�޲ZUF����O-c�> 
�f�r��'{��sQl-��#�0���Z�5QP}�>!]"�Ў��AS�w
_̡{bFۧhP��%NTZ/vZ��!��,����j�����t��(���s�_\CѶ�p�)Q��5��X��
Wl�ο��@�>p����"����7�t��j��J��t��G+�-v�-���m89��/�ա���_�����[�\m�]�"�І�׷�[�-�#C��&c��@�Wi�e,�;f1[|ݖ�V����}�����]ey<Ȱ�����kZg5�ogo��'��s��i�6��d��0~���h����i}��e(
��=�ґ_�!*t�Y0�#G�iI}m�"���DN���A�ja,d�i�킁w �wc����^L��,2�ޭo����^�.�8�bk���y���]m*�v����n4n4-�?hȾzԿ��+�o���uU��x�O��_�����8�άKJ�wB)��ZJ)��J2�h��\1�j���產3j�`�秿A��r���)��rIKf=����L�6eeV=����b�H*
$Ba�O쬭l9_��0��d�>��1���ߺ7���;
�:�ӘMB�|p���,gl�a"y�H�"����al�|�|�H��l&K�υ\6_<�]*�
�����%%�,�r���Յ�/���g���~t�B2�.hJQɗ����~���F��"�4�,"W3��9���T�Rҙ�xV�a�>l@U��8imYYʇLT�4��"�sG���'��6��K�����T2��N.*z�^	_�`-E�W)�\�JI���J>MT�^g�(�K�WJ3T-�,aR[�%��˅!$W@��3�Li���2r��;�Me��|2�ɔ�_wf�i�|�f����Ϯ��"���ż�%�˃޴ޙI��z�a��sL�9�
E�^]-,}XO-̔V�
v,�܃^M]Χg��s��zf�ڢR�])`}��P�8lK���P$Z	I�*�B6YR�-ȾS��R��(:���2PQx<����gI��;����]ʤ�����s4��2R8N��<
W1U�e�f�Yd>��=�l�3���:= 2�%��.�o�2il����'T��$SgY��7-�G��p�7�bR���
T3�����JAI�F�K%5�D>u�PR�d~;�_q�g
����E���0��jv9����L!��P��o��QY�/�H�3����#~�ר�ר�k���ʉ��Kb����{D|`�Z��r�S��}XY2{
�?`����gh�-��ת�sё咺��D����I���-+}����M�]B�VƔ��$���X�Z_�
Og�8Y���ޣ�l�&��zWgȋJ��i4H/�IH�!j4��q��P�[lj�oL���ZQ�P.�|���\T���bL=��К���&��;��k,V%�ҭ�K�X:XcT�Z�\��l�W�T���#�A��qX[�cZr��JJ��s�L/c��C�U��޵T=�̟C���|Z�@�^��\���_u�_�!��W��1����҆�A#�^O�I���%n�iLg�+U>F�"A]D��jSUm�|���k�M��m��Lq9�%�Q��y\�b�ʠ[�P���Y]�qMf����"Ë͜�*��q_��qh+�jRK_M5ւy`����`�d~�ZY��9�A㾸�nC�S���o��B�����9~���T��i�[5ZRRg�_����7�yL]��*G�oĝ,f�h�j�q�Qpa6��������ƲƸe������k�h�,��}�ЋV��_�Y�ͫٗ�|y#e�䄱�y��LeJ+{ֺ��)d3yEHѐ��vǫ�Ƴ#9�kZ�4���D�[�x��<���/��Y�V��/�f�u����/Y��Ʀ_ 0��M�˧��2���Qс�g;�.�喡��YD_��`�A��N�����e�!�7�R
3hQg�7��_C�6�,%�L�3�	D|�D"6�"��'���b��` �'&);����D"�NV�{��S�F+����MyY6M*F��P���
V^_M<�;���[w��}��X�:?#Gz��Ӕ�Uy
���V����Y{_u�<�\R~�Es�er�.ū��Wͯ.�_]4��h�E]^���g��e��WU��%��uawm˸Y�PW�W�麬I]��~��,,K�`�Gp��E�\{�P�f�0"�X��2 �C��P��q9�"�p��F��?
�"���ţ�Dm�:��|
Z���.mq)�'���Ee2��.�N�{�jh�&u^m��5rH:�l|D�nw�Qo�9�?T^fV�r����q���Q4c�d���P"��B	-��X|Ϩ�Ey"��D�A_,���F��Alz��c�0��fX[ �y��?1\@������U�p-'$
�8m姶�j��v_W?�kf���/�B	�9`k|�x�iG�������`�8��ф?�u�1=����/���G	�F"�p4�#(�P$��B���`���A�/�l�}+w#�o�u!��j�T�:�.���a$Z'��5�`0�6���z�䉰D< ��D(J�C��C����#�@�.p-M����x�ˍk|�����+��l�:v_�0Ncִ8D�h�Nӭ�E�����`����GG�|
��y�2#�g
,�d�mD�Y��:�Sj�d�)�x=$:Urл �=ь�P%b���,ZDXu�i>�X>����Q�i��jG���Y��Bl���J�3�?z@�,�l�P��? q�O������ͯ�{��ơ02?̄���W��Q�l�m�b�@{+7����8���D���C�~֋�!��BD&����U�4K �h���:���s^�ј��QO���4�^��)���`YT�/
ƫ�
���P��X�r�|Qv��T�ƜMo+�"8���/�������ˀX����E��sj5$BG-�Y�BiD�P��ѵ��}z1RJ!P��fRho�#Iͪ�l�,>l����$ixt���3\;zu#z�k�)ަ�������S���1_���r�O�!^]���[1UG\�ASy^��W��O �V�-z�)���VW|�^���D�q��Sg&[�I���=��Pbﵡ��
��%�2y�I㗹�ϲ�14�{��"��<�%�<z��LѣoCyzx>�L�=���%mY���zS��~+ӻ��X{��b����J�ư�(�ۼ��^1J�W�U%�S�5���/kߐn�-��g/�D��]ǸhZ$p�4`���Vc��i$��Κ��Z����83�b�G�=�3�Y��*�(v��d.�E[���N�^�d�S��}�O$�Ԓ�/�(֌��X�1e3u��~k��Lӈ81R;-U���k��xƯb����E�tL`(P����Ln9���c�k�Y]���*���Pcs��&�닡��U�R�*]]e��9�����4�۵(�q<���8��K���[;0K*=��lXֈ���Иlz*e
C2�hM�d*��ԪH�]�3�}4T���o홑���Z��g�ԛ�ϲn7F�W��u�T�Ұw���!�H��,[��mi��P�r�c�Y�����H].��Z��6�G�v`�x�b�����;�+�!�S���d!�}7�u�j��EE;��nr9[�X+�*wm�#3˙���e�Y6L�ֵ�L�Zƹv�Q�&�u��Hb��r�#��s]MVJ'�<v'o��{!���Y�}�@0O�b�X(��G�h����&������BX,N,{&A_<Bt����a�}\N'|�p �L�h�g2��"���C!D��h��[�H<C`\��x(a�
��L�|�h4�D��\ DX�ɐ/�ʢ|gŸ V=�a_4B�q�#9���h{=�aA�kF�Ec���-
D�S�^Y7�����A��n#F-�����Yx	?5t0����D$&Z��F��c-�P4���X���3V0�ģ1�f�Fd�O���͉ƣt�fҬh�l	�l7�+��Jb��IR��(�Uz�k�e�x���1�}���r�f'Dzil�+v����:"�o��wޟ�������ž�`��6����Z�"�[;���vr�u��M�������?a��L�C1o��@��Wnk�w�dw��NJ���=�E��oG��n�_%ۢ�;�U�_zi����n�
�`�O`�	�^�W�I�["��^��]~W��d���{9|�|����~�f��۾����P��;���A;����/`�7�gN�����8���i5���or�,�?n��6'��)��N�0��;���Ծ�?��/r�w��t��I��w���	�<ĐO0��;���� �wq��� �S?�A���a|���=�w:��j�>�a��:*���בL�����z�m؅�q}��Ϲ~͆rp��w��$��;����K�{sO�Nw��u���t��	�n��t7q���=n��f7�{��x�gȣ�/H`j���p#�E=1R#�jG�s�t��Y�A��2�F�A�K~�������s(��.S�W>�a@����L��g�Y9�S��C�1?&S�S��<��W9���f�K�H>���6
ݶz8�qe���mT�4��8��!��ٍ:�� M��b�[�1pa�/�Ԧ�s����7��QO�l¶l�!R{��(ϒ���nDY���L�
��i�<��o
����P�="��20��B-X�9=5޲	����t�����z-�~�����6����h�)7��47�����6ƒ�D���_�S��-pϠH�Zs�|�E�VZ��a���TVOy9����Ԉ_���+�����>7��S�������zj1w���ʵ�	�𰞺����>|��u�����o�n�=p[P��ż}��S_��<���'�>�!�z���3z
�s8^�S!�{!g�"�`?D�A=�!�o@��S��7A�����߆����#��?�Sm�8?�S���S�"�p�p|�Т�#pE���9]�3+L8hޘv4���c���뮫�5>��"�y�q�F���;��?��A�3|��j|ʄ�l���`>��M
���9����8|���r�}�� Io����f��=~�z��#~-F��K��|
�~�7��p~=O:���vx��]z�Y����I�R�pY���/�U:��c
�����K���J��q�`���c�aǭNK��^�8��3ҳ�?w���W8��4�.%����HS��L?+�4)���8�37��ں��.B����zX��4�z���2�_����#>�m���'1|�uX��p}Vr�/��$m��H����
ƿ��W\߆8:��u�+n�p��������4��rr!	��ܧ��:_�Z:?�<�:Fyn��Ou�D�#�t9�;���޷0L�����k�|Dtm�x�	8��'�\׀|�kم���;��]������X�a�'���'��'�N��?��aR���c|w���Y~��$��	?#ݫ�����f���7�+2k<�>�J��n����w!$��:��t?�o#���oI�Y��@��o1������.�ܟ�p�{U�(k/I�?˗�[�
��[�i��w�gܧ�Tt�T��Dt�&�w"om���7�;m�ˏ�W�q���y���ܛ����O0|J�O�]�A�7 �W��o�g��pw��p�o����E�g�i�û1�
���N�����1ļ��C�3���–��g��Y��Z���f�8�`����a��������Z(�*��%�.������dE~��	�S�s�_�/�}�ې��Vۋ8N���K�_�����E[�_"��X;X`U�B��;ja��,�r�q�����`��^�*��ћ3��,)��fM�|1$X��Y��3n�eus)qs{RM��4L�͗d6s�BoR�T�/UR5�-��!舶XQӜ�	�b���>���L�
8�_J��Y%=~!�R�\-�P�����ڬ:v|
h
�#GP!4������8�H��T�z������29�9�֝Z���	t+��p�w�
Į T�u���t(o�u[��쪹�]Ҕ$m#�X�XH�RK�F�5�+�K�H�A=R��(���,���9�I
U�@�l�L��R)���\r��)��/c�󴫉���Wp"YR`n~yaAє��J	�f&��
�+�H�S��1�P��rMSl<O�<�����<3�^���L�,k��)&��䅠��WE:)hH�NL))��E�+Z&c�$��{�բ���Q�T���j�B��Z��9'p55�����M�uB��F��)z��l%bwj��2Ƃ7L�G�ZV����
���]5=g��
�;M�&�����HҊ��%�.w��4��R+b��R���{i����
%g�]�×�Q_��!(�E��\3����AAτcى�x�/ٝ:g��l�rnA�X˦��&4}SX^�V�&ov��7�5/b��
f<�w�Y��4��
<;I�C�sb������o��YUl�A�}"�O�Ws�l�^q��ܝE��S(�d��&�ʺ!�LQ(��1,��ZT-*"�n�.�
��3f�@N�ȼz�F�Rȑ!=c��/-���C�ֳ8����v��_�Qt�G�;�fJX��h���.�ö6E��Y�ͪ��C���f`��S�z%
+��655�����}�m�.�	��f�\&���:���,r�r&]KYim�Q4S5�z�c��b^-�2�"��[LVT%`�Mt�X�,	
�kVn�">�d�8V,���Z_�]]���N�s�Ǖ�prR��6�:��ײ�eu�����A2�6}��v��P���.�@�(��)8��s�/�Ƿ��ܜn���A8>/�-���JK�"h�����25���5��9�-Z/��UW�
���9�ip�S+z�e���,�#b<�!8Cj���G'��Գ
T�L��	6�9�Gy��F���6�|�,C+g�
Cd�:?�SDd2==:~�kh�h�,�?�c�Ԗ�(�M�bt�Q�Gwe���r��K�-�L�V}i8aSf�����8fR�&̴�T;GV��M�U2~@�����P��0�%I.���)+B#i����߀ZO��z��jf?Of�o��<N(��}�(�q��qU
aVCW@+��;����ĭ�>-
1�3.�.-�"F
y�1�Sm3�D�v�Ԏk�袯P�&�Ѵ:"F7�ƅe{m]vC{���>5���ljr�T-����t�b��c�e��I�L��Se7�@>J�/B��X���g���0�'!��]&d��fW�M�eDU�JRP���b3
���P3�!ߒU�im-�ҧN�*u�|.�e��d�N.��Q�=��9^�	{*��Ų������N��V�)l�l;���+�E�-��숌r�3)4èk���i��+��1���5��аd�� ��Y�|Lɢ-'|�uf.���j��m�F��aY��0c��>ɕ�N�Ǝ$��+b�P�w�2�eZ����^}�7�"�F�;�>�xl
���@��5���TL�1��q�*��o�7C
TL0��a8R�38�.����3�+%��!�y�p��#�`�N"|	���,�l����xp��k'H
i��2>8��9�����)�w}�k~�z'1�V��^U�BGΤ[��i�&��,1}p���F0}�~Ml�Q���_9�5�PQfg	�$�"s�!|�sJ,5*	�zm��2B�J�$+����qMDaV�Ϛ|e�D
�l3�dY8�9�f�������h�昋*n6�c���T��4fIc[����@+Q���l�;�eU0�C���yT�<��
\�$
��u�7�Pbx���nP����;�=��h�������ƥ��2Ą��"��U&�NT��fw9�h
�m8�n!�{��}���ҋ�W#H�(�%Hk�b�M 9n�Q#u��1E�nȀ�ִ��h�2J4m��C��L%�%ZTb~a�A��Nh7��ˈG��
���]PxS�R�]�\pX��ߊ4z���w�x�u��M�Ίq��&Q��w��А� ]7�u�]����1�;/H;��/���[F�1�V��D�U�pc�UB˽c�a�7��p��0wil�
�,
����*Z�ݨA�k�4G	���?f9��(�f��K�C��EԆD�G����0V���ܒE/�y��7].����!KOM}�F��!�JUEݺ ����jT�})}.$����ʗ{�K����K�zن�5F��H�RF���xnM�-���+p�h���zL�z7�X�\��)�y{��4$�,ύ��Obz�9#}��	��-Э��G���w��8?)����O��ٟ����C?�����������]��6��G��{\����V�$����=��
�;��{�;��~#��S���vW;���$��NQ���iA�����mmv�
CLH=�~�3!.S�t��Cr����>i�R�K��m-t�΁��Kr�_z��T�7jϥ�����=��†8�?��y��P>��h�o�
@n��l���ڐ�K_��6�
Þn��_E�u����
;m6
1N%_��
��g'�DxRg���:/�e^�E��̊V�_�`�"�����B��[��ޞ˭�
p�i(Z�w�����ӊ����$�n[gH2��J�_��p��a��u�0ᾼ��!a�
kCd*���-����/�!�J�w2��}qH��vL]�F�䢌˻�'Qf|e�^`+:{.GC�������p |[�6�]�
�>ގ
���<N�P�m�uQ�q����EJ����h����6�����{2����v7u��)����\���b^z��r���ey�Î�u�(���6�.JrD�M��Ġ���>�����!}ӎ6�\��p�}�n&CT���H(�G���f�"��-��$�O�7�;�%�U]�{ư�
ȫ���	�~�%w����%�O�����P8Iœ��C�T,���P2�NG@��(@&�2���ɹ��^���q��ռ��7�D�p������'���#'f�f.'�3��߼�7��/�����gt�ڪ-�19>3�ϖ�™bY<g�{����F+�B��#���+�@��KOփ΍��X6K��ŝuE�s��n��W?�V?���p�N����1����r��6:py
}�9�q�<pn���G���a��XO�������1�:�닣�Zi����wq�Ys��x���-�mDc����W����8~�/�^0����}c5J[.�v1/V��}�c�=�z<�W�OP*V�b�"�,�n�Oh��{Ծ��Xu��V�YbmL��{T2�7ƾ}��]��˵�>�Y��rE�r�7��G?���҄�g�������,�݌t��\d��쇮p��y�{я<�1VOj�0��2�_������i�i^���/��־��sTҫ��>�s�#��&Z�H�VMW+���_����������PKx�f@P>&���AppManifest.xamlPKx�f@()��.�SilverlightMediaElement.dllPK�0controls-blue.svg000060400000024150152455615120010061 0ustar00<?xml version="1.0" standalone="no"?>
<!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#0000FF00" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="144px" height="32px"
>
	<defs>
		<radialGradient id="gradient1" cx="50%" cy="50%" r="50%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/>
		</radialGradient>
		<linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#0000FF" stop-opacity="1" offset="0%"/>
			<stop stop-color="#0000c8" stop-opacity="1" offset="99.4444%"/>
		</linearGradient>
	</defs>
	<g id="BG">
	</g>
	<g id="controls">
		<path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#0000FF" stroke-width="1" fill="none"/>
		<path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#0000FF" stroke-width="1" fill="none"/>
		<path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#0000FF" stroke-width="1" fill="none"/>
		<path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#0000FF"/>
		<path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#0000FF"/>
		<path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#0000FF"/>
	</g>
	<g id="backlight">
		<g id="off">
			<rect x="83" y="21" width="10" height="6" stroke="#0000FF" stroke-width="1" fill="#333333"/>
		</g>
		<g id="on">
			<path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/>
			<rect x="83" y="5" width="10" height="6" stroke="#0000FF" stroke-width="1" fill="#333333"/>
		</g>
	</g>
	<g id="loop">
		<g id="on2">
			<path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/>
			<path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/>
		</g>
		<g id="off2">
			<path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/>
			<path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/>
		</g>
	</g>
	<g id="cc">
		<rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/>
		<text visibility="hidden" x="49" y="17" width="14" fill="#0000FF" style="font-size: 10px; color: #0000FF; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text>
		<path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#0000FF" stroke-width="1" fill="none"/>
		<path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#0000FF" stroke-width="1" fill="none"/>
		<path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/>
		<rect x="49" y="2" width="14" height="12" fill="none"/>
	</g>
	<g id="volume">
		<g id="no%20sound">
			<rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/>
			<path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/>
		</g>
		<g id="sound%20bars">
			<rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/>
			<path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/>
			<path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#0000FF" stroke-width="1" fill="none"/>
			<path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#0000FF" stroke-width="1" fill="none"/>
		</g>
	</g>
	<g id="play/pause">
		<g id="play">
			<path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/>
		</g>
		<g id="pause">
			<rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/>
			<rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/>
		</g>
	</g>
	<g id="fullscreen">
		<g id="enter%201">
			<path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/>
			<path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/>
			<path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/>
			<path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/>
		</g>
		<g id="exit">
			<path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/>
			<path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/>
			<path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/>
			<path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/>
		</g>
	</g>
	<g id="stop">
		<rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/>
	</g>
	<g id="chooser">
		<path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/>
	</g>
</svg>controls.png000060400000003544152455615120007125 0ustar00�PNG


IHDR� �R�sBIT��O��PLTE�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������yyyxxxwwwuu�rrrpppnnnmmwiisiiigggdddccc```___^^^]]]\\\ZZZXXXVVVUUUSSSRRRQQQOOONNNMMMLLLKKKJJJIIIGGGFFFDDDCCCBBB@@@???>>>;;;999777666555559333222111000,,,+++*****.)))((('''!!!     "�-(�tRNS�������������������������������������������������������������������������������������������������������������������������������������������������������������������������o{	pHYs��~�tEXtCreation Time11/13/12��:ytEXtSoftwareAdobe Fireworks CS6輲�IDATX��V	[W
&����D#�H�V��[TH��(�*H
Z�&(FqAYTԀn��T��g��{w�L��+��z�/���ޝ;'o�c�)�d�h㡠���8�	TTc$�����|\1������Utγsn��k0ֈ��N��j!�zJ�o�[S�]/�?d�o���8����v:W�oN���ӹG%{��X�d�=F���#87�)u,ј8���Wn[�!;C[�)��~\����6�k��'���[�'�5�+q��g+"خ�f2��/,f,l��	��r��
�� '�mk�m����3�_����q�V�#BQ�n�� �0$�s�ݕׯW�P�vh!|�yL��� s�`�~ue��G��&�ЏuX��s��SJ��Vb%����Q��+�_ԩJu��P	C�^�M��^�A����2[,����t1d;����dV�Z힅g4����T�PM��6�n�䗨���1/��ˎh��,��m��p��x����.���-��N�QB�����#��ks���`�I0x�g�����*Ľ�S�����R-��]��������B�M@B�X�lٺky�zmU9����	�	� 5�I��-Q��f/�{��ü����B(��D�P�Ʈ�#^��t�@3@3F�:dŻ���ލo3AT`�
4���a�2�$�/��� �zP~(ӼE{l�y0A2"�ɨU������-�ťUQ��'��dt�"Ad~�P��!�J�W}���a4*��D-�#D懂�2�;����r�z�Y�d��4��׆HR��O�w
"�CA�CU�=5����J^D�rB��~� 2?t?�r��h��hC���1�������sR������M���L�E42���.�
��W�/@���Z���+F�nj2?�~�IO���0��-�c� �h����^�-H(?tr�b	�j*�c_D����h�F���5�̃)F�BR4i٧�����S�~|��"D��IEND�B`�flashmediaelement-cdn.swf000060400000157342152455615120011514 0ustar00CWS��x�̽y\��~�Y��}SD}7��Q�Aٜ���q``t��Y̊�-5�\2�DCPSK3�$�\�c�e�����-��������|>�����^����s�=��s�=�>�C�Dp��̈́t��gO�e5��U�Lm��l�C.e@��^-���9sf���8��">qĈ�	I�II��k�3���f[���@k+���F���y}��aO0�٪���h��j�&
e񬉭b�v[|b\"4d(��[�Uz�h}u��X�������*-e�g�k��r��V9*���ֱ�&v��`)e�L[�f��c�̆vAGw��֎+�T�W[-G�TMa�UhՎR��V�ZG;��͖�\�T�Sfe�vKg�����
������2we��a<�
&11�IJH̉A���Ѷ�8�d�]�"�>�(����G �0���75��Œ,ͤj�e
F���ˆy��Vr�?�
<���t�0�:��?��>���ԯ��À_	� sx"�ը7�l���"��奈���O	^|'H�W7������z{^��.~]\.�,Y.e��y����S6P����g�O�o�o��3��}w���w���t�c�Ҁ�����A�����U�-�����	��;�/��4�t��ۈn[���~��°�aa�������u�q�k�?-������
�L%=�yp#��id�y`�\�lʽ��YP�x��yo�v󢷅W7m{v��ݙ�������ǻ��i�d��~��k��k��6_���V��r��Yߤ��w��Qw�-<0�ú����(��w���q~�h@h� [�}���<�%����l���?˳T�	L܈���G����%q��ɿ�f�u��q���4�n,�ذ���yߎ��s��h�~-}"�����Ix���z}{��m�M޲b��a��mT��G4�k�&6�ֳ�&�R�4i˂��Iץ�ޜ������'��V�_S�o��ף#5-��xO�ϊ�ʖ��,]�f�ܷI��T�ӧo��N�xF��X����z���˭-�Mm������'׶��������t��XxF\����K*��^��Uk��%bWN����ؔ��tD��B�u������<�.�;���X�z����X��EϏ��y�
"���x�I�ȁ��--��II���}S������ˢ�g�4�H��dx��~�F֟��xm��3���􏝄L�_���Z�7_{"�6�X���x��Si
���O�%t5�.���}�|ٷ���s�c�w6܍�F��^"'e�}vL%̵��|49��t��=qt��, ��.� ��J��E<��h���%�w
�����!��~S��O��1$��K���}�BE=o�m/���
H�w�>�w��k^|u�V|ܱ�5��-�ȶ�Dhb���_,>��S�Jx��5�٠��	�qqc��'n8|��}g�uI�3�m�&���j<{~�Ѫ���_�2uʔ/���o�Ⴧ�V��Ib����[�y�ѠkD�]/b��/�m%�J��<1~E�|l3�,ݰ�G��������k��['x�x|�H�5-�S�6!�4�$�����Z"ȣ����Ϩ9��0���&�Km�[�Bm��>[?�xCc�~,����im�Jv7�m�S|9f�cQw�@퓙
����*�Ϡ⾟�S�QHȪ	��S�E;������W�M�'���@c]Q���"��#t����������ˁNJۖ��`s!fZ~��#Æ�۠�K
ק�Mz-��4!����ܦ��w�m��� �?�~�����w#��a����_�/������W�Z�[�-���Ǟ���sr兾�!�o�i�|�m�?%�����ɻ�'']�x�|q�}Ȁ�������=�N��72�ג�ķ��~?�����w�ތ:+=�z�6�Ւ��>G��ވ���J_p�����׉�Ͻ59��eu���]?��C 0��ܘs>g�܆���	� Zm��9��
�M��o�}��4ϗd}@x�<�;�+���s߱�	=�5
���
$�_RL����������?�v�K"����>z�OŸ����q�I�����
[o�g�H�˧�q��e�'���6^ϳ���mݾ�5�H�6��3D�W~�'�r�u�GB�{b[r��k�W��>x�t�١?-��ڼe���̭>=M�e�T�@����)�s�\�����47�������5u�m���2����9"4���i��l}���$"m�A����O��!k���7s���<�������e�Ip�m"8�we���S�EM���氕r���%��z�&+��-�)�̗�ͷj�ǀ,�&��pxTچ����F/\��{It�T2L����]�dЮ�k�g�o=1dk-�jK��#[�a�|�6�y��Y��g�������%�\����S.��6^�ܨAo��[|��tn�ȗNj[�c���ȖB�-�x��3K���$�@�F�/y	��e�{&5>7rڢԟ	�,�x�7���a�A�DϟJv�>���Id%�̯��}r�a�W��]��i��j
����U�ks�>��>�-��z��|��+ϥ�U�I�����>.L�tjѥ�K/�hp�sb�/'� �a���4~0m��>-�Z�걱�tZ�yg%_n}�n����U7g�ܴ}TT��ξ�K�����T���x��Z��ZJ��d���YOkz��4݈p�daa��׫ݨ?�٢O1�#������5����{��E��:腷澼�W��V7)��,���eR��-�	/eũ]5A
D<f~���5ۚ�O�0�Ͷ�Z��A�� �Z}���V����m$��ۢ��N�~E��xl>L��Z�%���gg����"=��NӬ.oܹ$xP���x*9�)Sf_$<98pq��\�����QQ��%�`"w�S���R����b|ӔA���9k�����S�~䗬%�OkKY~YY�o��d��W"��R�-��Y�"���'W/��?<�ƿ��T2�T�p�"o};r��$��U�;H���=����:��]�x�p��������%�xS�Zȫ�J��g�ȩ���'� UC��?Q��J���~���4
D��zԸ��M~`�
B�~�iW���B�n-���(���h�K����M;���L

������~�+'z�~�z[�<�, a�z����+ E�*�Q2d克$�����7j_-%��0�Ʃ�/��*'�1M]ڿ.�c�l�gN����>�-ݽ�~��9�M��=W-���o�C>80?�XZ��K�e�86�����SI�ҭ$t\T���	�w<	늭�E-��)!�T2����6��������Z+^����̡ƭD���в�F�٣���m}OC�u����������t��ZiH�N�2
�ޜ�yyBc�$f%"�rmwQܡ���7�Sh�J��{^���H�}��jt�)É���n
_8+�˫.TU�g{�����0��SS��ehH{8!��_��}�ˇ�'�=�2/����yՃ*�?]@=��ѫ��#����q+k�/c��O��8�g�Rʱ��'G�"����xaE��M���/�\!���>N/;�ѿj"z��L����V���^�lv婼]�k���>�lq�˜����i�˫'�#��T�c
�	�� �����{��3WL滍g���+��;C<��5�l�T�J川8Ӳ}tR˕����e�(O-:i��u�۵cv����
ҳ�N�s၏�~=܇M.��;��3�\��}���B��3%����i�����j�+%mK�y�ˉ��ձ%r�d�j����'ǻ����7	/6���T�����
�,�V�O�)�+��&�
	���B����&]����wo~i��y��Xf�oY	��7��,�z�*`�����_���y_"ļ=K�u	c�:wE[�]��Gˊ�F+yS4s~1�u����{/(3�+<v\�D�p�f�..q�z��x�����۲N}"�l����D!O��@�ثK^�=�~d�c*������'�Q��E��??��fF��۽Î�����D�āo7)��-%Q��7t�4u�ֱ�]+�Oxe�4�����E�Oc6o�0�D�v�kA-��ԃ�Ӷ��Ӗ:m?�WO>�iy�!�[��'��ع�=_Y8�u�j���9��b=��i{_=�XJҲ����?�MmY���9����-mD�CdKgl�r���[n�y��LI�A�,�^}�����7&��V֌�a=�X�K[�Dz_�b��E�?��O��~���𗼼���ӴK&�r�⁣��B�����۬Z�"�>i�U��&J��$
*8!5��h^�'�����C͟Ui�G��M�g����v�v�ʏo�z�|4ž�C�z��\�_�~�a`�i�.���Q
g>���ߊ7/��w�g�ϻn~=x����+^�����q����ڰ���7��6z�G=����q���^[���S�$2��E��i�/���Յ��S��}����"�At��2�"��-���w�_�y��\�=�"�f�ӈ�"�H�"[�n^�y�=�>c'�Z1�O�*:�Hy`������,z~ʪc�~C=�����>֫i��^��b�7Y�|��&* �[���*J�2L�J��7���)�7�i�tI@b��~��M{S��T"�m%�R��MO��4'�x�EH󱖭�C<�5���7�5��fɣ_�vm�$��6��…>-��o��M�qڢ����M.�~:8������ڕǟ���W ��Q���߲��Qo:�m�y�4?M�v��ˍ��+����)MK�ә�QIⶂ��g�>Ex��<w���&^o����7^�����k�XM���$Y����s_�ۿOܴq4��5�4�N�)oe�])KI�K$x��+��j#��SIjh�#
O�]�N���	ھ$��$l�'�Y�>) ��^��
,��g�9��{+��h��ml�L�"�����;!�z��}D6oL�n��y����Z^����a��D:��8^�~j�!o��Ɲ��tk~[�p�?��.�l�D<䵭38m�Y�煃#76�J��+�eaÒ��Itn=�D�3��F��Y�L��7�h�צ�9y�sKVo~��ƭ�Qg�/��q�B9�/?[�l^u�Ǧ�ݧ�L_����ʼnQ��
����/^��޾��V}�?{��ʪ�t	D��)�Ȑ�_�Sy�p�>~%Q�w��ح�p�‚��;��5��/�m�]���E~����S�Zzn�W�9���x����,Qig~����g�Y��')�M9��?�Q�����0�7��8�K��B�IK5����k>�W����_�h6-~a񅁫?Hj�S葬ڹ�r�ZI�j",����s�{���i��~ς����G���h�B��-8^K4y��Q�4��m����h�j�PU�W�3�3���Si�Wt�M�5�Ծ��yp��xiL�A����ZuR�,��y�V߂�	�7���c}ä-RiC��q<��6>��J��oȉ!�#w���tR��ӿ_��r�5�/���y{���7��k��A�M����$?����{_��CO���=,���u+�����'/$��%��	>�.�w��V�~u���L�]�d�|��<E��d�W����qbpޒf�܏Z����\�<0��vȮ��������;���P�H�f�gџ��;�����e�
2<f���\�:�J�Ba41�e�g7*<$�4��^��pxjA�ʈg5�6�ɾ�$K�,������w���%RUQ=����ƣ�B�A�O�[0��^������+�ח~��4�P^LQi�\S�O����_W�?�D��ӟ���T,������{Yps��w��MJ1�l���>�~�j}��*��!p�ϞDc}���!����j��M�Hp�T�g��j��)$h �i[U��f�)�*�=r���{���#��C�x�bž�۽�%����u��7&
���w6��ue�_o�{�6�����.�.�k���昔��k�ͯ.i&��
�n\�=<���s��*m�#����{�-+ތ\:``�;�^�ݾ��L����|]�M���rԅ����nh�G�,�UI=�;�oխ}�5�k!�Q76���|��ݫ�¯��R$�^�'-�A�]�ϲLy���NL������"=���q�g�W�];�.���/o��>�z���z/t��7��rO-���K]���_[�x�!5�>��ʾ�S
D}�T�����K2�����f�٬�ھ�~�����������\�����/�=�}��!0�h+��)��⿏'�\u��n?�g^�d��/���������[��cV~.�
����ON^���퍌���g��$���/FL�V^a�`"�j���>V��
�!��~]�Bh�?���	�ie���Oz�^H�_>��Q^M�׮�m�`���Cz�G&��@�[������Z�ǍC4r�Z�ݍ���湽�٨����q3N��<�4��H�ɴz�&B����뿫�}M<�ϧ_k��;k9�h%Dv��;��Dt�C��[�����V��.��G��ޚ!_������k���
�X��]A�.��=q���{�v��s
�M!'N-N_AHt!I��4�3��R5�Y/f�\��ϖ������7ׅO!‡��a.&ʞ�Q闾��5^"���'���Gz���O�[��H�穼mK�I��!����{�,~�wt�kAْJ�>�M��K�n\=���O���!-m�?<q�{�3jI(hrֻ�5��L�`D���q�jy=/����8�{�����/�,��r��C�	*?�f�;Q�p�¸?_[ybJN�޵�~�YrJ��)\}��5W��~���#����z~�+vW_�����{�z2I�R]�+���g�����'O��wj���I�"%�8�?i��N�[l�j�]Ҽt��F=O����b?z界

d��dĩci��νv`�B����=�������#�<��>v>sP�A�����7ƽ:�/Ē�T�_��Y���O��!�w�|1���'?�gm�������F\������ӯ6�}�)߾�����66����}󢁿��<{��I��W^�����&����C"H$�K���dH�H4D�lJ�H<I �$�$��dJ���d���dI!���J2�X��D&�)DG��2�1�q�'�l�y�4��_y2AL7�;Ƅ3=�^��a"��L3��3[��>�����J2B2B���,��;iH�ocXcXL�q!�a���<���-�I�p-!c4�d��� �1�\sΟ�q�a�
�Zl[C
��h�����	,%W������
�b��(���́%A�q���@\���O鍈M�����B&�z�
w��`���v��K�n�t
��ݙ����r~��g��[��n�4_CF���^�!�-GN����4�����ĥH׀
.�����+�i�ǒ�3�>��q(mJ��ơ�q(mJ��ơ�q(mJ��ơ�q(mJ��ơ�q(mJ��ơ�q(mJK鉰R��j`uPI��"@*��m�˱�fr2�A$�RD�(���XHۡX�X(�_��C��*��� ���B�"�)EP7�R��n	�K���%h9z�\�=�G=�Xt
�jZ��\�8.�]Nʱ���<($�"�h��Z�e�Z�UB���2����5f��lP�;côKX�К��`��3�s&�� �H{�C��úu$�!_�J��
D��}/q)`��`?�Rdk���<�I�t��d)`�
y�O�4���4�J�4���F��|:�O��,?ͧ�Lq)"C�}	)�Q��R�X�ل؊t�,C�e|j��ͷW�y�q��7S����f�
����+��
~�]�uW`]����t	`��0�q
`����n���"2d-���Z�}�ž֢�k�����Z�k-���Z�}�Ǿ�c_뱯���z�k=���j�<~#��q`��Fu�6Az1��K�x�&䤸�k1�ӛ� �<�f��@*M��kv3J�%�����s���i��!�(C+�� �{o��[��V�{o��)��V�=�V��f����\ww��=x��6���"�@J#�Z�ߎzގz��p�M��&�V�F�����N���ki�;�b)��/M��2�Dv�;Q��(�N��R����ӽ�b#��N`��-~�5����f@:��A�}H�H�|Z8
H[{G��Y��<�����~� '�,ῃ6��/���;8�w@�5����^~��=�1��!e	�]�a9�R��wQ?�~(��zۇ�܇m��6��m�~hm/�!��#�D<�xq	�Jx%<���Up5v5v,m ��{8�P?�~�Ñ�:��u����!��C8_�p�a�CX������R6��@�}��l�w��#G<�x�,�>�al�0X�{������al�0�y�<�rA9���GP�#(����v�<���֎`kGPΣ(�Q��(�y�<�rE9���GQN���c|��~@�8�s�9��Gy��<�Q��(�q��8��{�T��(�q��8�	��8k'`��<w��qē�g�"6�?��_�?��xW�I��$��~�H�:�}�DM���/�w
��S���V�7�O�*>��;��;��;��;��;��;�}���Π��@�'�B;�)�z9��E	�b��X�,Jx%<�����A۝^����O0�A`�@�uw{!��tLG`i$R�"%1�~� A�G������ l![���� A彾��Az,��g���"�0�&�,�xz��~�P(�G���=1�a�R�`:1)�c���'�!8��{X�o(�{!2H�X|?��4�10$�c�c�E8��H%��H%���C���0D)}#+!�����#=1����`�}��>�~���P�0D���`�8��	"�*"�Vົ!�7I( �J�H�����O�{1��� f����� ��$�/��@)�i��8�Hl3��? E_l�/�/�����pD19#�9[臶���Xy�A�H%��X���~���;� �������R{��@i�,�ZqH���~���Fè�f@i4��X��X��X��X��X�A�� ��3H1)�����*��)�̸��1�t\�ho	��@@*	M�#2���`:��^�3�(�$2��&~ ��4��#*{�?p0�'e�P�ô�o�ӑ��i%b� I@c�$��i:R������џ�Q=G"��p�
�D�$�O����81�y����3�����(��>�L8 ���*�JEK�&!&�^��)������و���G0�	H}�P�Pls(j��hD��6{�c:�A�a@���7��a" �0�j�3e��
���0=1Q�����(�s1�b8�����H��_09G���@�9w��8��8;#qvF���'~0K�a]9�M2驀��0�������� ���B9G�T���)=1�jc��<g����ϣA� @�F�'�3>g|4Z�釥I�ɀT��Qr�?Q����t�{���D�F�E���yʐ��HE�R�
��ʣ@~�*�(�%Q�$
�D��+�wά{W�?OC����0��8)r@��4�Ꜣ��a`۝\��!�	��;�c���t�d:XuRzR?�����?
y�')I�C�2��aZ��Q��������Lgc�O��+(5Cqb:�1@�DϩD[U���h�J�@�%�؋gJ�6�DϜ��h,p�R�M1p�D�'R�C�C�t�G"�h�TD�f`Z����n�#Y�N� %�F	�a�~0�o���~�� �9���O8 ��\�3��9�1遂<������x�/�w)����)%K��5��Q�8�|�$E� ��Ȑ�8��#
b�.�t7�Co��3�F�;���r��<+�m�e|J��3mw��������wg�C�|�A?�H� ��
���I�{\M"�5�אzi�z8�U:n4!�G~�.�
q�R�5��])��c��<R�j4��.��
�������+���c�_W�k�
�Է�ԣ|�N����J5�K�r�ztћTޙvݝ���R���&�%K�;u?ٕ|M�ij8��CS������$�~�\���=203����/ScB�x�[��V����er-f����e�-�j��%�c&�2VT�m������Gny��Ta��޼,�)]�A>|�6��xg��h���̟�cgq��*)���y���%��������������F�|�)�j"����ƣ��#�3����x����N�O�G���xDH�.��+=���D�#����������:O��������Z��$r߭����{�y�i���Y7t���/u�XL;���f�8�b	6�K\M�_�>�G��<f6��^Nə���ش0!�,K�����ċd��9C߸a��w��=����=
���ö��du��o��6�'���ÿ,5n�e����?S�� o2�x����	s^�}�(2���/�z�nG9 ���7#��ޘ��{�~���*z�r{���(X\y���m�f~�u֓��/�n�q�Y�ds�$''C��}7'iu�.�����@R����֓C�4�N�7}|����~X*��&t�2(�˙?�	>�Zľ�)?DtЄ?�P����7]��[���\�#|��O��R�ե���7�,�^����g>?�(�(��H:�m�)��{Ѽb�ҭm��};���i�S٬�#�xC�!qu�(l'q<�9q@t~�菈,�Du�<F\
��[�
.+��Zp�眵#��ۿ�W�iHS���O5��������~ �l��4l��gnl�?s�;�<�s�
������vݐ
�-�[H/q�����W��)�3��6psB>#Y�����=���_"=`�R!x�bHȨjFo2V�S"�t�G�Un1ۙr}���"��gA&1!�)��,֔��r���X������eFsEJDB\��`��V3�#F'$�F��vG���
!��G�@BI%�QL�*�]n�*)��_^���뢦�j��Z���~+�;ц��L�&�6ν��.��=����|��w.��n�+R��������a.���L5B�=��Hk��U���W��uP�uI�x��x_������z��R�Z5�*Vg���"J0�p�?-��;l���a7�U��<"��eЇ�b��J+tUed��?��I��~�Nn`~Y�_D�$`q_Rm��!m�����Ip���j���U9쬁6�F����Ir-��hd�fw���$�;r��3�E՗;L&[��e�� 	J0d��Ԑz���np(����@AH����a���ݣ��PҍJ�rf���М�Tc՗M��t�(Ǣ7��U�euX����u���P��m^�����’|P,�����Mz��
/��Q�w$=A˯P�
�lWj��Pa�q�C�����n��Jh՞���$�}��a�Q}�CA+yh��V}�z�#	hо<�@(�K����-��C~�dT�_�z����<��~����>7G�l��~��Q��G�^�������
��_�"��ʫ�S�s��G�=��Ǿs���ܗ�B�^z�K�k^��~�Y�,�˟�~�@��NS��%��"%���il�]��[��5�A���DZ5�wi�,NIӞi��՛���R[1)�sT��V��l]�Eo5 �7T�FUc�o4۽��v��&I���
�U_��)��:]\
[&*a,V��"��~xn��4�Y9j1�`CA���,�$δ�+��Џ8�a.�f�
��т��HM:�&���0�۹|�4��]owذ?������l]�n`���Y�Ti�Z8�H��\�Zfx�J��F��S��W�?f]��Z��7I8]�Y�wkO���,)���lv+���q��5����Ƙ���ۤ8�Lj�R��
�R%QA�М���+ys��ԅ��
V�4���h`�6��+�3 ��Vѱ���s�1@͂�0���u䫰ՙ���\K��M7�%:lHk5Itz��B�몭�	�'��RG�Xg�aG"]
�%�٩E��v�Kg�"
�J��b�V�c�R���X�`�A:��d��
L�
�9�R�7����v����B����9݄�^CᲠw�������:N��Qo]ug��6:��Z�
�N�k
�#B�:R8�8�t�D�����Y�j��9�v��.�dY��_��
�v��,S��M,���ԓ��^er�E��}yQ�8M�7�R�7���o��<�M ({��Φ���Lwz[/�B��{wH�U�J���K׾}x�:z~����!չ}�O{���KG����P.#ѹ64������t58��t��qf�f�u.��>n�1��QD��y��etji_"�l��N%:���r#0��*�SY:f\��6�Rʶ���`���ee�|m�+�3�j{�OY%[6-�Po�ym�&[�T���W�;��`��(9�����$�Jp �M�1�#��ݲ�2���	�`�;f�.m~�����e2\�X�5p�I2,3���v!h�қA�/�v���ak���,h�C.�ܽ�i�غo��b>�j_�sk�PcA�Pw�).Lä�Q[�$6pKH�:o7	d��!�6"�$���0�n��g>��*��Q���u�cк��`}��﮸��Fa1l"6E)�S5uhra�������	�pt\�t� ���=�B��N�i�ٻ��Q޾e�*Y�;	ѡ�L���^)�7��!CJ�1��0t����������Æ�Mҗ��M:�t�>�Ma(��$�%�C'ӡ��9�,���+�~����|{�Y��醄l3�#�C�@Q��޽�Q��A�v�H$!wх��@簚�*[��f���El�pQ֣1�C�KE��
�Pг��G���O�#.Ym��S SU55C��fG��zY��+\VMgN_����e`ˬu�v*�ԕ6ք�B�f�+��u��r0��v2X��(��c��_�b�������ͰĬ�Z��	t4�ӕ��ҙKu6=ݐl�:��e�~:�?�j9hB�t�-6�z��4��6.*28�H���c��"w5�t�	M4!�|�CE�����Y�z�3�4�0�sf���a5���u9��	�˳�h���3,��l`k�3iL����w”8'�N���2_p�P�m��n�1�9���fg@�Ɩ[�l���ts�3����X2@�@wA���o/Ш����@�����C}�BP���I=(��jk���M4�UƱv.�s�]��9˺hӗs�.�la��;T���`8>�����ݺtP��&��ۨ�uTUK�#����Ylm׋
�v�h:G����ڝk�O�!ؽt�&�z_8L���M+�˻,�m
(�]�c��	��cr��p�%t&ӽ<���I�x��v��t��� �1AXg��NͿs������tt��:Zڭ�RcM W�ـA��@��x�T
K�ӹ�D\�7U�Co�r��/�?j��F��D���N~T��E��P����J��rf���Z��H�u��-lw�^��)�j>�t�Xi�t���,p颽��F{Y%�_�G����\ƚ�I��4;7Io�ٙ��nQ�N�fn������tf4��Y��'΁c�-X��cmt�㱼ۣ�\�j�u,���6����d�`���:W,R�p@��}7ѕS7�6�nR\�8�4}��4���#|��:�������N��u��a�4GOӠ%g;�LW�
t��h�u�ak������(Ĭ�a�֡��QT���o76jPv��Ur8}���:LP(]�0�B���T�-�J�8͊�y��~�����.rŬ�<�~,��l��JB��R��#��:N�0�\@���n;ReN7�^<k�m�,MѮ�F����r3s]��\
g�O�b�K�y�qv��Nѐ�ő�B0�E-����SÉ��T��xDU��Q��na(�4|,�"8���r[l/�m�#��YEm�&�nSYfڼ(��0�>Fs�����,V�Mf
=C�+�ML�3X�i:�d��!
��8�p��s!J�x�����`�4�x
W���<�u�tB�X���@��B����04��a4���lTB5E_.g�ѿD��抩�Y�L�!�qq
���ԏ�<��>�>�o�DzaAOH�㤁��}!)����N��xq�Ů��#w�@C&g��
g�^��@)�SQ��岆t��^s�Vw69�ѐ�f����I	�����87�2�㝑��M�K�5
xkG;���a��,���y#,����l���ʜ݉�}Q��X�Q;�}Q@z{��M����e7;u��=][��w�:WR]u���7
�b�ns��-�6�t���l�'\�٠d.aS(҅�\�;��l��ک.�w �$�+5���3x���`�aL/���0�^��W�A���nE��C�pA��Eϊ�r�r�c���02^X�.��
�3�����ǧ�C���Wl����0�Y�Ⱆ��-�-�;Lv�܎gMk���AޙMJc�X�#ҰҌ�&u�����UC�̅?:W{6���>;c1w��_Į~=ue&�F�����pa�ս#�&ѱ8{�q���N7���Nv�s�&j��퉸N�q�w�Hr�4��1���M���Xgs�����[���,f�P��N��Q��+f�9�����OC"�>�ud	�SX���M�0a��)��:�w����Q��X���:�&_�F��s��sZ��V�j!�m8:��h�x�c�XW�~�;��N�(F�=v�A�	4��d�>nY�x��b���u�J��b2���Z����ĮQxwjS�n��i��NWD�/pwIs�̥x�X�����MP7�.~-w꣪F���ۛRԮ���^������U��yE���o�:��%Γ���˙2Xf��:�Őյ�l�3w�"֙K1%�!��2��ԋ�qEF{%W!��نq�L�j4��L�.��͖	ֻ�vD�����=����^.U�6�=��:�k/�h�]ߍ@�/>4�%�Y;Xg��o׌���w5.����߃�8�Ι��!x��f����3r"trE��v����Oii�}�@���>��wz�a���33�"D��pdO�'�Vc��{��b	 ������t�L���LI�.,��R��'�]Z@[�~`�|p|��yꑅ��x;�f\e��cj��k��3�����ƚ�I��$�I��������f�����v�|�S0�+G��BIOK:��z��f�j���M���$В~�M՝^EWX-�j�� ��_J�.�6pA���y�O�šq���C�NG��eR���{��*���u^�)�ļ����7�B.�}<�y7�}���m�'�u\oZr%^���w!5��v�*�I$����VK�n��v�7��s��ۂ�>kUA$W����9ЕCS�N��g.�=��7�f��0xr��������o�K�����B3[�.�h���r�,�:���zMP���ٷ�p�]&;�Pp!$�O��v_��t>^z�J�[@>;���M���5w U�m����ȏ�П���.vB}�A�oI�Q7S�^;��?N��`t:�hQ~f׋&�]�WM\G@��e�b�����e[���$�z��+�Oxa»?�>��{���0�H�H/�m�@����q��m}˝B=��um��i
�4��ro3�N�#�-@��������?=�wz���vp���w��>��n�I�
@�&���������A��z�k��*�R��WE�*�3�j�.'_���7V���W�3�s�yK��X��wI�B��%\��*��\e�h3�1�Gȝ�9^Y�����X�N��B�F1V�((P�sIs���]v^f���܋#d(ӴcE�r'O�B�'���D�r��\n��M"�$�L��,�^�1Y*�r�:�"���Qe��%���8��ڢ�n�!��q����낍�"oNlg�A.��"t(kgQf>�k�cPekҳ:3p�F�G'�=���:['�Bw��
m�Z~^N��1�ͦ�nQ�R��W�r�a��Y����`}W��؝�~�νF����f�)��5����9���=87�n9
h�*�G���e:X���b@�'�Ufd+t��\��{n]�ݧ GQ�F���(4J?`�tΑ��Jg��z�!�]/=���F���6���/Eq^�;eE}dhU
Mv~�N[�
�@(w��'.O�{I�L	u�b	��BL�p)m�.7�X��9��9��9�,ԩ���:�h�v$��/�S�+����F<�H�tTc^�Vr�@U���x�����U"U��y+���`�dWN�.�KO+�(��:�F�=Q)L���iD
�.;C�Π�����\p#��boL�T(v��8RY��#e)�&T�4��������X�F�T��R>Op\�g�3���T�QI�~�9��f䚒e
�cDj�<mnH��X�i�y�J��F��Ը&��ՙ*���V��Anm��$��ԉ��)ڛЫ+���}ao*�EM�5'9��ci���YI��΃�.P'�M�ˬ,l�p����
emu��f����pX쬋d�8J�$�Y���Y�W l��cw"v�:�)�RJ�{a)���|�õ(�\+8��
�2�Ԣ�Bn��ekt��wn�ؠ�%�(U�͗{����_3�?���^4l�W�ꫥF|�����!�-�W����X��c_�u|���d��1/�9|u����ת�c�]5��?^��kXx:�!�x0v7��ل^6Ґ����s���f��+��t㕸I��6aZ�=�KR�4��9Bz~�{�)�J���R<�Ka��I�=�_"�[�!M�����=��<E�6�(;C�NW)�y:��@�����/�i��˚C'h9t-h��
��B%M�:e�ce�7���Щ̙Shaחr�t�2C��]��Æ"u��.�=���]Fv�����x��Cm:X1�(�Z-v���tYq�\J�SܳK�0kPa<�yVs�!���u���(h>\U��~�8"!K���
�s��Jn�q���p��5���O��6q�=�y�u��L{�r�ю<�d􌒩�������p�{���;}�H��K�pti��L�
R~\A;���tN�L�*E�"f'IL�t�=s�i��*���o{��"���,|sR�.��ˈf�
}5�`�Vg��U���ݗ�_��L�ތ�ۙ��~��Oo4á�3S6=�p�/s�=�G#��%�?�|�c� ^��t�O^!�4�y)�)�l������.N)�&���Įo	x�^���Ǔ���������K�&���ϴX
EV}��p�w����,gMЇ��r��<����E���J����8��v)��F����h3��H#|�9��1�W��OO�qwO�з�!/�q�S`�X�1���#�\ds��)���������� +qK9�� v}$�4�i��XX�7�X|��Jo|��̟��Kbs}ᅫ�[ZR�5P���ͅ�l1�2W5��vI�X��7��"
��'�&�?o,(�[]d8��~H���B:�F�}�+����1��q���Bh����!)��bp�e�F�_�`	�(�mG����b;���C�t����
P��R/L��N���Eװ��x���ȁ�a�m�l���I�I����L��Jv8iL\t��\�ҫ���^��R֧�}��Į�d�p��C)�N�v����,V�Ο+�]��Iۿ��>��?!�u����/�$�(�;}�(��O���/T:��RI�I�ƋK�(�J!�T���O*���/2DT�rF�[9#qZ���+g���	i�����#���u�T��J5�M���q���D�{9�X���C9�7s��
YЧeg��+)0��EhP�A
=�2�'�6�!��sp�T��lqx��7J�
l=p���m��a
�ӇS��g
��	����b
3�h�vh�2����8z(���̻S�BD:W��bΠ%�a��D0�(�I�)&��LbF1��"0�i~/R�*B4��E&�P��{Y��z���^v�L���8vf
��P�%�2�i����0�x:S��|�10J*��S_
�ndm�Y���Q�.~�R�Y��� ��DF#��r9��>)�3a�Ȝ�qOl��E�
K{6�=�����ޱwǯ���P*��/�ڔ��/L䌐nR����8�L睮iX�*��#�MЙ����T;�v
�*���"c(U*9���/
`*�5,c�d��3��zX(
t�i�J���V�I�SR��cG��/�+8�? f�ǀ^���f���T���`m�
��2� Wo�Z�զr��b�%�����&�<��sJ�b��c�JH�1���	����C����f��-:x&AB.���\|pD�Օ�S6.���X��D��B�VS|��"*�O�G#e��!�{)럧�PI��� �p$�����0�1L�۸�`W��Gr�����V�
�y�}Ϳ _�ݩ#>l��n|}�MFߟ�j2qd~���R��قUva�GU�ƹw�8��jPw��~5޷c34:��P;{�m�ܣ�J@_�����_�)\ZB�q*�c��{!��ьߠ0�6�9ce�X���3��=�ġ6'�!���=�R�������U.��R�C����6I��)H7W�t�����wP��l���ĩXr��j��h^�]=D�f#LV�c��N	�	�\��Ֆ����pb˅1`ir>�}����)Ш�U*��9ߡ����}��t���>1�E[��@�Z��s�f�@\b��wzC;���_M�^��
�}9�Zͽ�\c�0�|�X�|��˜�83��ұ��f$�W!d_����w虝�L�n#¿RG��@VO0a*���5[Y��b����A���}�ڼ���jd�W0%���!̒{�p�\�9= �qN_/���>���Ŵ�,��q����/����\�Z#5��-�����Q=�^�Y�?��~�T��N�	�-����� �Z.=@��f
r5��
�.;<6csT��
�O�:���
G\���N/�1E1�:�|��f�8ߧ�31
>7Y;�{����
ng��q=€S
�g��J�P!�2L�s�O�
�4�cR/�v����X
?�0EJ�vip�I	p'!Vg��Sb]>��<M��F�Vf&�5X���!����F
�J��	�Gf`kgF�FE��~�� /?O�P�c��K�o���#�V�I��=�%ny���ө+^�$M���7KR�!�s���V����LW�5e�B���+&����iE03.uC����@v��:�|�x�*_[��!�Q��*�*�
�&_��Q�k<��=3��
m���ʳO[����*���^&�']�k�XU���ߙ[�N�%A�	��u�]׬=(�WV��
A��]��[��PCo�ׄ�{w��w齷�>g�}%���������̙3���9s�}I�ߤS/%�1~�A���2���Z#����4�7�����|��ԞV%\E����;��]�g�ֱN����wb�*���Vz"�~�&���J"Y��(?�O�٦�CoV�6��}��i�������x¢��FS����]Hgb����l�4��z8K_Dt���-����S	��/�4�}�2Obi塑��<��f�������)P�-@ϞU뭿�&��Y�[8Ϟ���b���,D͢s��W8��~l�LR�r&Lu�a-�{|'|Ғ\2,���/ѓ'�}���Oբ���G%��=����ʿn�%y���Ey2����ך>��ԫA/�
���3�؏��C���m�+���;��?���V�Vh{i��4�XD��f1�>���Xz,��5~���ߋ}��6�w�5*�������M�xKo�nS�]���4h?.�p��lѲB(��06���?��FS�2fԂ�`vj��KҷYi��$�Û�|�ۢ��|a~NwC3���?k�P��b�=��w�}� ����[}�#�ҷ-��;Jʳ�COWR�����Ұ�7��������[��F���
��)Ϩ��k�6%��R�Q��y�՗Qo=�Y�D�Fu	{��o}עM�p"6�2O7#�9&�ᩓ��e~��V:��;���ۧ�/o�
�瑫�p��v~���kTh���+�|�����JG�/���q��k\�g���z�xM��E����M�����z�W�S��r"j;6�{��8��ϰ�Z�/h`���FSK��c5
�]�/Q�����Ⱦ�l�
��mU`��F�_���6p��Ԉ�!�7p�8R�7��Eg�ZW�q����~�J��j�׭�hU���[���-�|�y�h~A��-�k��9�~�o���g5�'�W�*5o��q����
�=���u�?���/Z�x����?�,��ӟ�ꭾjE/ԪK_-x����Ng�OH_-g�z�T�Q�뺦��t�ʪ�U+V�TM�Z�jr�G�>V�N�'�֯ڰj�$��U}����,i<K�’f�����,i)KZƒ6#���%��6��<�Gx���t�']@�?�ؽ�:r�M��'ͧ�"�zR1�׉�5�:s��.FR7#�;��I�)�'2��4#i:�ˌ��F�ZD�8`$"�a#騑t�a�q��fR�b�����do�+���|�J>o%_��/ZUsD�CO&� IH�ɒ�lĪ$pX�Yr[�*�F�|�'��>�L#|(9���L�K.֓�H�4�d[r7"��eF2u=�z�|�x��;Fr��ɞJ��g��Cȭ�T`6����}�_�W����ҟ��_~ՊUN,����	�1��_�njc,&�e	�d��a�ob[��ML8f�ؘo�����?���?��}���2�P�7���j���U���5y}ю�����=��0�G���lV�vGf0ÎJ�
�t���d8�G�<����<�r�ݙ�o؅�2dt�B#�ue���c�wgF�}&b�g=\�s=�S&Y��^���[�b����V��1/����0[��e�p�%f�c�ʯ�c�Q	��g̯d�j�� ��~;BQ���b�
eFŦ��nS�t_������p���*~Z�N��,P�b3�H���t_�������m)�e�|V��Qh(g�eT�Rk s�[�}�Ҧ���*��3��ۂK�b�<N�
B�$��X�0+3QXU���!���Y
�*BTG��^C�5�%�G�|�G�ʂy����j#񸈩+b뉘���C���k b���g�~����E��^�_�KQ���(<)��k�yIx^�W��U�yMx^�7�'Uxϛ���4������[�yGx�{Wx~'�
��E�������Q�|$<̈́�c�I���d
Os��������|*<�Lx�,<�υ��Rx��VB���|-<�Ok�i#<�
���Mx�.<��
���/��Gx��`m���#��tB:�x�u�XC�'��
���@?�?0��F8
c��`$�����(uTF�G���`,0uL&���&*LE8
�΄=�	sIs���<�����"&�-A�:�r`�X��k�u�z`��&&jl�2��-jlC|;D~P�x��b������_{���C�a�p8~N'�S�i�p8�.0Q�"p	��į"���:p񛘏[�w�{L<V��gs���D{.b; �����.@W����z��>@_ ���A\�F8
�#��@���Fc���8`<0�L&S���4`:0h%���`0�����B`�X,�ˁ�J`�X��a�Yl@|#�	�LSl�ہ d`�O ^;��@1P�~�<��F������L�A.��G�c�q�GfR��N"~��4p����\~�D�K\T��E�+�"���:�o"���w�{@)
>
�uѠ-�ht^
RD����
:a��BdXt��A؝�.@W��htG�E�E4�h�����to]<�������_�5�xf�.��C�a�p`�<�J<3�< ��c�q�x��VZ`h�	��3�I�d`
0����`0��Յ���FX�`���"f!��:-B�X,��!��J����hŁ5�Z`��lD��ͺx~+�����~�� �(�|�E�]������%w?��=@+����������!�0p8
�?'����p8��Y�p�\.!�2p�
\�ŋ�ʋ7�n��;@�*����6k�7��/A}/A}/A}/A}�:�Zg��!^ǎ�z�=�^(���5��k��n�������Á�HC�<C�5
���cL&��Ɇ���=���f���`.0h%�A�߁��3I�;.���o)��J`��	k��.�b-5}Q4MM���D�OE�u�h�U���)VfS�ʦX�M��b
6]��
�F��h��6#��
lCہ PE��v�@	���
����Fs?z}�`t@)@)@)�0&�z�7D3�ً�Y�h�#R�N xY4�X�a�iv�OE3��j�5À�a@�0�fP3�6�f�b`�0�f�D����fg����ۂ]İ.��+`aͮ׀�
�&��4���6��"��!2J
���M�NnA�	C4EB{S~h�,�=�#�EV�Ȃ5ga�e�,�:���Tda@Y]Š�0�,*�� �0�,*�� �0�,*���2X�Y�v�ܳ���a
OOS�腮��}�\����!�PS|2������`��L�3�Y�`�X,�+�U�`��l�A�(2E��N�(v?��=�������x�8�#p8	�G%;��p8\.WM�u�&p��m-�|{�#�Ns��@��݀�@�'��,�Ro��}����HZ�� K��Á�H �F��1�X`0�L&�-��`�3��e&�Y�K�� >�M����"`1�yK�e��}�`9�@�? ;Y�<�*`
��l�[��@P���]�n`/�8��#�Q���N?n��?���)˒W��$fU�dOӒ��%?�$w��]�k��ȿ�͒w�M-�;Kf��l��(��Cxa{���@'a���݀6�쎠'�X�>{��s���n�_Y�EK�ڒ/Yr(X�X�cK�nɑH4�d�%ߴ�[��ܒ_X�KK�ƒo[��%�Bb0��f��W-��%�,9��-�{K�E��G]D�#\@}��M��eK>g���`Ǘ�)
��"�K�e��|���̰d�%�d���BA^C3�aR�ْ�"�Ғ~K~jɀ%[X�Kn��0��"�oK ��%m���?-�K~eɿ��V�����[r"J|g�b��Xy��%�#�8�8��	��H�� �t����)ȟ���\�:q���dwDc-y�T�`c�ּ�+�U�p]ȿ[�[KB�pH��7��V�DkK棞���&�!,����2�?�t[���ƴ�;!=�q�.��d7�;�؏�vClDz"���3��c�\������	�V�[K�cIx�r+J����N�E`*0͖�_�k����R���<`�m�����a!� *,�E�Ŷ|�����|�����RK�_bc��k�u������<�냘��)`�6۲j<n�H��	2�26
�g����e|���U�?��Ö�!���n[�b\ԿJ[�����I��d6����N�٢�~�z2��9h��C�
��-Z�?�wҖ���9DOg��d�����n�����6*�]����J�7a[)Z����@')�aL��+TD���i�g�Ok�@ML}M��הm�Y�wD�bMy�ה)5�_k�V5�|k��사�������Dx�iˑ5e{����Y¼jB�5aj5�%�wA^W����z�eM��R^��)�?	e���5(��^>x����H�"~m�xT� i?
�Ԕ�=d?��VS��.��~w`�}�'���H�@�.j�� �=�"�g����& �w [��m��(���y%��O�I�NH)�����d5Sm����>U
vOT�#��R����'E��V�z�~[�u�G¬ѥu�]�n)W@�Ga/D�I��� p"G�?B�Xj�O <I�`�֧��՟��>�SO�9����7��!`max���^�.?]���`���\�̅Bv6�UF��K��f�HvH["�b��kxp����t��yF]��S��)F�����bd>1��r��e��r��gD#��pF4�Y�Hn6�6�m6��6��6��6��F0�F��F0�F2���l<'7A6?��D�-`'��E#��!�y�E#��_�V��np&"5�� �]#YV	���
l#1�L&���]�0��j�Fn����#{!����`
�O��^�������\�UGc�t�l$g@���9���r�?���|`p���v�_�5F%9��R�9_�9����AL4Q1<�"_N��$E^@��Lw
�;E~�"O �i�`]�`]�`�S�>���﨧�S0�)2%E6I����"�$��"�C�y�W���_��(
ɿ�,[�`�S�o]��
—�G|�1
N��S0�)��LV
�9�"�#}���D|�b�G�7"�L��,�[�|�ǘ��@A��V�D���V��?���px��G��O��M����R�
�Ƚ�Nd�=@p�ȹ���]�Y�o#�Pp�BE3i �� ~2��-2� 3��T��!�:�5��S}EƿZ�5����x�H�/�B�2%U>�X��
E���o�-,U&�)����+0�uW��4�݀
@w`��aF*F��KE�S1ѩPB*���	O�Re	K����L����zP	2�!܈�*�
�b�#�#���B坑n�v��A�:`�:Q'й]Ho6[�#ƛ2y?����H���@:a���l�H�D��� ��!�ϴSa��I�V��79'�.Q�P�C��f8�""�e 6S�YL�ˑnI�ҩ��xt��H���C;�F���WuP3"�u�SθMi���e�
W���\5��Q��1�X���6C!�,��*�/KӪŪ��a�O5�2?1�c�����_I%wpj��;E�6����k���v�[4^�bC�%�'���m@�BӮz�tE�����Q�����q�5D�(�oePH"Ec�٪
$9yJ��U#�6A4Ū�ݯۇ]�Ո�ʧ���T���D��V��d���[S�#O}1���cw�ji��;/e���?��E[��?jr��ˮ/뾵Pv�vt$l�a��,�7EeT`�/11�>����&��TvIy?�2ּ�B�JQ�ѼN��U��3�eּ':2��r��yV�ͰuyC�$7�L��VvG���ybb,7��Vf��[޺�D�ڮ�)E�+��k:��js��`z��	�������q�T7���)R�g��ڶ�a�e(
�'i�=�i]W�
�ރ;/S�c��i���q�bzw,kTVd��YH^gmFOj�����8���p��pL�!�H}D�G7K����!��̟^���ӫ{�	U�t�}��"�3��y�ay뾜�o��#rO���nXzY�Q����O�[y�yn��K�Z��:��>�3"���[]���o#t]�h���-NY��`�a�%�z�CT��ׅ����)����w���m$+i�G�Q�����b���D~E&�"�J!�k"/Q���oO#�*1_���j�xQ�RI�1q�$/@K�&���mM��������G�����5�~O��S�4���"�#���4#�1�t� �*��LJ6'�E�D>!Ғ*���H�t�Y��>�־PC�Rѯm�4�L_3��i�5�b�0-�[���1��ߘV��8X��4�?��=��Ŵ�fZ��V%�1�j[��ځ$���$�#H�N ����H��]Ajuy�;�c=@�	���Do��}@�����d?�z�A��)��DyzH� ���P�g���|8H� ύy>�� ��B&�_�M�E�*:N��l�U�W�D�:	�ɌɪP��iM�T%8�V�6]�X��	�,���F�w�@:ڍg���QŹ�lg���]��BU�,U�"_��Kg)��L�+JU�Ԩ�f+���Z�\V%m5���e�ש:�+��ڈ~enB��f�,�%�Z�8�nQ;�������D�:�iAF�Ih!ӊT����L���T=*V�KT�.�f�Jjw��0��{g���U��:=8�$�����������A��� �N����קA�9�,H�s ߞ�=��ݸ�ںȔ�_R�\F�?� �q�?Zm&�Z;���k�יv����S����q��N�='U��\1۪+�ގ�*���8i����	A��C	���]�r�+'t�εN�S���T��J���}��ǵ�Ԣ6@с��2H��Qt�ӫa\�m���j7�I�y�<�|EG):Z52��v2V�2N�1^�'��DE'):Y�)�NUt������L���,U�lE�(:W�y�5��Jr�j}��d���"xO�bЎl.F�@��Ö���̶!ޅ-EnW��[ڝ��V��d�@{�ՠ���>l-h_�4����6��gA�6�mD| �:�m̶�a[A��m���v��,:���d����t�:�mAmc@ul9;��q��3Y[��bK8��]����n�Z�E�*�O��j2;:���hZ��C���6�i�yR�ô#��cG�b�;��ǹ�#�\;���N#8õ�4Ϻ~�1��M\pl⢓����+Np�	�9�u'��H���h���r�I�A�vW�=G����bX6����-�"�t	k��u]�:�.g�@W0:KV��W�κ���YW�5J�k3�X7p�3:m6��odt�lb=��z�na�arE���v�[�-�h�Z�r�~�l��%�:�f��V�����}Ut����N�<R�!��|�uZ�������8Eǃ>�MpF6���&���&��fS@����{�4�}l:�~6��	z��=�f�f�id�L;��\��:9U�|V;��y�zk�U�(�P�0'�"�ɟkgX��:�Ktښ��.ӵ��
%�RM�*�Y��kT]kA���zg$tZ���R>�6���V,��l��ԋl3�%��2�
z�m�ʶ�^cA��@�=��MVz��Co��fj�PM�t�Y�&�D�m�t�?�v�A;�=�9�.����kD�{U%�ݯ?%�]��5AWb~�r�Q��U�qL�����	]-��*��b�V�g=��yE/��^T��\v����9p��ͯ����A������-��6�~t �:�w��apt�
:������c�p��?����<���m
���:��_a��kgШ��a��upÎn�	�7..�P�)v�
��.��xW���:�wg/D�)8̫z���a���2��5��<n�6h]�1H�}�U��,N�c6�1��������"����-�.�ȫ�*��`�5m-�R�A����Q�6�u|(������n�#��*a;Hն�Z#
�y�"]�G�_�FtcM�[�1]���jAN�R��Z9Yk�vvp:vr:�9��NG�.����w+
��>�rZ��8�h?zT�B�p�8��9�G8�G9����`"�'@���Iy�1� K���SA��i��cL6�.s�q�+-�0h��T�5KQǿ��&t�]�sQ��΄~8�~����[��F^��BE)�X�s��K
Z?�Tc�U�
EW�	R�m��;J�w�*4y��-�k@����m�u����J��I�b�]��.6��nT�qX7��7+�x���uշ���m5���n3���P'Z�It�ji9�5%;�bC�|%�:bw9���N��	�:y�(��Np@��A�C�vAø�#��Q�Ǡ�:�=����ӑ�G�ô�Nk�~B�뤢��:Nc���g@�gA��@��A�@��A��@��A��t����G�t���t���t�����Ӂ;F�w�N�8�
ʎׯB��&��5D��ڞ��ו�o(��T�Vxm��I�3uZ۳tR�l�6�����;�|Hk�.��잱AO)u�%�T���T�v�o{OhLz�Ѥg�LR`��ܢΦ�RS)�+Z7���N=��N��#��	�8A_'/�	�9��R�'h�V9��qRC�`��G/�'1�q+�3�)�/��_��]��69�a��U�V+X�l`���u�Hn�ǂn�ǁn�ǃn�'�nU�ݦ�]�NP��@��P��H�w�R�N��b��}�w�AЧ���a�c�.�R��i�3�2��sណ��g���Y(xX��wD�n2�'��l��#�d�cBݙl�yBo0O)p�3Ee-t�t�I��bJhK���R<�d��,w�J�+�*V9U�vRk}�uR���N��	6:y��`����(z�lðN��AO�A��z�����9���JoԬ_T�~Ii㲚�+J?W��)=\Wz���pS���m��;J�w�"�rO�3^g;�x���R���7x�i��O}+vti7-��MK�5�=�eĚ�^�2c-}�iY�B�oZ"����+���%cc�C��6���8�ݘ#��7�Q��G��*�0�㨑�6ُh�w'Л�N��f�Sf����,^�ڌ�?�����P�*�$���`Y稪�&;OU�<.PU3Mv��Mv	��sMv���Mv�Mv=�Mv
]�KMv}��Mvô�J��4�
|��n�VE��d�M�_o�;���Mv״�f��3���d��U�C�ٖ�ȡ�O��i��V���vV���L����ji,���:Z�^K�diF--���ZZgK�ji],M�Һ��D6��n��d�1~�d��ރX�L֓XGL���؏�l��4;���+�}�_���ٕ=z��1�����Q1;ʴ`)-���O�JX�A��9�
�6.�l�q�dCQ�b�a��_3�p7L6���2�H�{�dy���-�o��F�Jx;���0�,6Ʋ*���q�U�x˪�`:u�M�|�c��x��M��l>Ŋm�T+�nǧY�=爵����Da:��Ӏ���LK���"���V��F:��A�3���"�>���R���P�K[��J��k�y�"��p��
�j:�h�NԗBU��/�������
K��*�JK��[XZ��--�5���k-��u�V;�zK�DwK� �hi�`n�����o���j�-4��-��;�q徆���cm����nfY�&g4U�:/D�P�ru܇���*7�b;Q�4JaW*�,�}چ��i}��w��R��F�Y�_�{���}dVI�~2�j��G;QM�T�&{�~�����`6�j���\k�c�|����|�ŎcJ��~�9�l��U>����V��b�0�<h�ӘX������|��bj�N���������R;�1���]���=����,�P7CS�#�j��.����e2��Bf}�b����c�:㚳0�[j��a��殮��[��n�!��w�clxw1��{���:n��=�c��|{�����K������xf0�M6���Ʀ 0?ds��>f�&Z����~�14�{��b��΃����q��mh�3V�
��,�!����0B�VƎ ��XuCK8�X�nh��3�CK<�XC�r�"�U�pܕ
���5��|�#Ym2g��T�4�
V��Y/��^�Y?�`5�s��GVs6際8�ah��r6�GOqV�����$$���c�潁u���u���m=�u���!C�;Ag[�|��U�����§��6��-�����~a��:�О�nZ�R��A��ϸP����37!cư`�Z�3�"-���lV�^j��Z,s��d�.[�r�+5[�;|׬Զ�Q�";�{�ڛ^�u�ҭ[X�74Me����w#$\��A�P�����wY�W�Hj��sS�ۋ,���2��*�KK�T�˘��
⹦�Y��QhԿ�֫�Ǩo��N���xl���I������;��)�؄}Ղ
�Pog�V6���d^��$t�0��]D�.B4	��3�
7��]���w�J�)X0��h��E��[�On�GE2�
��~�߼_8�_4���t�A*��|�
Ӈ/:���yY�!B|��U��.��0�>\%҆�i?�9B4���XMSr=H�qK��~��w�y���� 3�?J�z��т}Cc��{K���4�#����R�
�:�ļx�bpY���nɊ
�<��C��b�8�⨶���^<�3��o--�qr���'����rUMK� "��	�u�@�>�(�!�j�!a�@1���N`�+>�|P\�ʊOv��j,">(\�`����H`�[nH�\�M�7&u��m�MiO�bm����ư�1�^����g��#�gt���Rg
�ƃ�4�2˕�IWr�0:��/_f�b��QӨ��4�]N�G���ځ����r���z2V���ʑWVz��w�'�#=���DX�JO*���酮��r*�|_�,�ȕ�R��p1�1�^��iO��ŷ	��`�,��'�BO_��4��L ���撹T�����U|���W���V;��"�F���j�'��b�f��[/r�����l^��F��$���"�m�b�(��'�o!f�9�����(h�^$|�ū<5(��?a ��3�_�l5 �hR �@'�w�"�_(E�!�jc��g[-�;DN�?C4��l�Ej��RM��[��;o��z����,�K�-u���NGu��(q:�TGvE%љ��;U���ʂ�Ţ�na�+�5�P�`��݄�H��^$��`�����?�����`�88H��·\�Y�\֊��ZaqY�"��.ku�u���w�
$��'�N����%H|A(��։���D�Ɉ����)�DU������l���@�t��ِm�y��
n�<��s���:D�m��������D��C�U���^�ಶDX]����]"�%����,���DH�����8��һDx��j��Į
�+G�c�V�s�e87���r抄�4�6���wU1��9�O��(��l;�/M�mh�h[;���o�X۩�������"�Z�DZ��a4�3j`�ë��<X)�I��u��g��!��<g���yi9��|%��}Y��I��ʲ��Zy��[܃�=����Ξ�uַ_���`����w��9�r�ڵ��v�$Ԏ�
�1�.J[�G��I
<��i�i���Y�iy���Z�k̙���64�홑�|l��y_4��N�esJ��N�S���N�A�o8���p�/R�©\���S��NuAj`8��A����S�N�t�-m(|P�i5Fϻ���
?���k��,YgDK�9��ÓY��ڮ$��<W�$���;S�6�f|�H��4n%�$��y�e�<wm��vF�Qk�Vj^��o�GAbt�1��c�b4�U;&uIoog��41c��k�6��x�6��EI�bk�,�bb���Q=�nPQܞ�a�Ħ��رī�)�j-��v-L�W\܌G:��������:��ʗ�!
��)��i���U���B�6�^���p]�ځivcz$,bb�@��0|7DIa��MQ�>�.H�n����sv\=邊�f;\?��V��8
d�p�*�ê���,3�Z�l�n�R�1���v�m���Ⱥg�^mF=�HQ��I��y3��f���2-�g�;g�64�Y���'�̶�^-0G�xisI��>���p����zB]��ͳ�&���)��|U4�:�+�hC��H����l��OUg1�Xo
��-Q�H������M1\��d��mm�b�G�).�F�y%4܄*ԋK����/��3l7����R��tD��GP�g��0u���Ҫi������#�N�W�o�y�:�x%݌�m���#U���z���P>FB���d��	gO�Gf�d��m�t�ya�2����1�Y����0�`���N$��U��x^&�,��+�b81��Y�'�`��b���q�Hx�ͫo,-�KK���"�����`����,���#RWښ��=9t=��'<�����8D�Ky���7]�����4�W�#�����b�R�Ua&�ģvJ9�|�ȃ�6A��D�*J�o�|mWB��F�>�ᣟ�����U�S��&/�ڥ(]l�1N��V.8%��E�5��ň��2'#u�t�t�K'�W(��j����آ������Z��h�i��E������no;��	���j9���Uw��t�s����a$�^Bv򈲓C��=�(��ʱż�r���m�����N�6�[����֜�9u�U��I���G���d;�q
�<�Ɣ����w�Tx�ͼ��gh�F��H���D�{��������+U��/�6�Et'�)��`�X�j�#?��dlZ�kl�Z���.�k�c�U$lH��W�aU�i��3��&.}�z�m�&��f���Ȯ�-4�B
gn%�6[U����v;-H��Ag���E��C�\=l�,P#綒IҍX�w�D��aKV����qQ�;1�a�Vhk�Ҋ�%����Ŗ8�����E�,�Z W���e�a���L!���{hj�t=����������T���2��ƌW�Ah�T�9*~p��py5]�U�xUIu��{�N�B�;��*�,�Ν{_?%�TM��؈�j�&��5�����Ԉ���,��܁�\�#��d�5��AvATg;��xA�Vt�#U��*us������q|�������
� R��K�?�;�V��6SO�Rwۚ[�M��-5<Tj��WX�|=_,�G��"Q�r#2�𚠲#m��נ��^���:�R��&�BM�*_�ɢ��H�D�&�3����F�q�H���ƴ�ٌ���<�ةX�|�Af�㰹���M����l����C<�u���m��ډ0��=v��{l�P�:��A���2ӟ�[̮/�g�u�N��4��w�M�zq���\����J~/��i��>J8G���1M���9�j&������nt��T�1�~A��]ud���F���t�-NY�Ey��t8���*��#8JU�ģ����q��LU$&F�"R�3����s�z�|���j�(,�k*�`���>?�3�9=�X��j�`o���z�[v�x^tGP�⺦�>�'FUNy��`iu
3�3\���9Z�B�����@�7��{�f����6��M���A;�׎$ف}����3��GB�e���^�‹hoa��������c����Yq􂎬�
�MG�i�h����(�\���>��m'���`��c�;����.�N}N����ȣ�-/�#ͧo,�<�7��B=7o�&�N[y��v�&�7IE 7���jiC�mԃ�a��6?�s�kGmz_�I:ُ���^�Z��<O�m��ss{���:.�2=m�2�����7��7��1��v�{|��夸�.
ҕ�՝q��g��3��^}Ti����R����u�uţГ!�����	!۹�|�Aw_�V�\�Ѝ��d�_��'���}<�D~$QG��h����(?Ƴ�q�!\
��l�=�K���g�ır�fmvR�����H�yc*��,"c�H�.|sl���رؑ�$w��"���Ǯ��sX���KO�Y�9�gl�Y;��]R�~�.L=�	�`���Yr�|�1Y?�0����f��f6l�y�n�y�V���W���O����<�u:3_Di��W�Z���JaL7��<~�Mì�3�-
��h,
�a8�Dz`�G��
t*���g���̘-�Z^�G,UR������^��7�Zi7�_�Z�V��:���6l����&�uw`�?o�~TF��[f��۾�o��[e�V���bB��Ѝ���Fz\�8-;Jdi���-��iwl��;�MT�'2/s���,��T�D)�\z�XH�=K�&���P!zy�I�=U,q�*�l��A��3��|�I�	��N�Q#0�F��ޙf�.ӫv�?�^����mzy`������=f�^�k���L��gf�7�V`��q��3��͌C�W��MoL�0�Snf�����꧑L��C���Le����tJ�6��F�w8�P�o�M�y�
�kNE��<���Z�լ�BM�KC�Úq��
7Ǧ��o�8jf3}�f�q��6ǩۿ3������EO��O��G�t^��Y�i�,�(��a��e��F	m�)��G	m++�~�Ц���B�nԅP��	�8ﳥo�]P���Nr�*��KJ��4/(c)�K�Y+�C�F`I�1��?ⱆ�����\�g�B�=�,��AE`	�X
*�@c�Y0�w������{�
j�)���J^�n%��CdE ��"s�:���C�GG��Y�ģ�tR8���3����Rj��
��![\�`��ϛA�&��Ir�q��ь+aj���.��et�K��_:G���z2���%��o-�ҿU��_��;K�~X�9�"3�,�*��[�:XO��eHÜ��&��Aύ!�_K�c
�w��z-�}Z�Y"�n��ٶ-0�]e���n�M�.�7-�xȏ��)���L�2۔���*�KK��pTQa��6-��jw�A=R�a��QY�(�t��̣6'Ec�ڜη-��������	�l�a�Y�7��53Ι��f�q��M7�͌�o��`f\4}��E3��k.��M�|3p�̸b���+f�Uӷ�\53����f�q��-7�͌�o��af�4}��M3��[kn��M�z3p�̸c�6��;f�]ӷ��53�f�Qj����R3#����l�o��ڀ���D�Ta&��Lc*1���3O����2O���)3o������"U�<߰P=E��w�9�-��G'a�`%z�W�U��y^�ӈi%�óf�k;;�/�!�m�J�6C����i�|�%*}�yoST���6=�T��������i�^��i��J�s���J_p�1��U�����җ�t���t��MV��K����W{���wY	���{���q��s�W�G��sR�����Wz�^)
��yK�B��T#��KY���Jx�}��1Tv����23�){U�!��L�M��
{p���H�
ܠ�� ›Ǧ� �{ٛ���M�W+�	��(
���nZ.g+�V/!�,+�^Y0]���z���\W�ʴ�R�ph�����{H��Y}���l'��X�:�HY�'DT?F�ӑI�QJэ���0)�*;�ӰWKt;R��#S^r)����F0u�LNK��$�o��}�;Y�_����udY�L�.]��Be��}%��%��+�T�₳����UG����C��6�Z����J��t{S�r_�7�\A�q��-�V��l!D߬�/�`xJie/C�c)��4��z�B.1
���T3��Z
��;J���E� +�ș�c�̷��<���۝D���m�S4bM�kD�� �59���P�7%�8m�UlG7F�o6iߔ�k$,�UF���JQi)9��ؖa^w������M�:�Ҩ��it!�c�pC]�+��@��][���Q�m>��SsY󹰗o�I�Ed����3��= �6��^$�r��>FJ��zv����|u�DahM��c��!u��jv"X��`��S4:p�6��:V�_�
�ں&�,pu��;��X�c�&洈޽ɢMV�YBU�T�!uY�
4�did���UV�UXe������_L�ط0������@HE���T#�Ѕ*Mz�)�L7�l'Z���:��mp�)���T�,3}
Mx�U1S��̧5
�4��Y�Ej��S9���9*l��[#[w�̘���F ݅�)��0-j�ha&Ԡ%_!�Շ{BӅ��f���+�rZ����o��M;�x�X�q��|��w!�1{�k�����)Z)T����*DC�}j=R�[�ejXO[z�(i���-$
��xh�	�t��<�e��dm(B�e�*;Q�v�zS���{��y۹��S#�8��o�c��z�!n3���%��z�� b�8(b	_�[��Ͳ������#���K`�R�W��Ŷ ��Լ����"Q+���ez���^*���D	P;�i�0�Z.Ȓi�G��=
�b|%vb�P��T�T���R�(?p�5�4--%E���ZĸObȋG.�w�SO���Ǫ))�44�.;�)����h}�����d�%#2R6�M	�E�Ϥ@���Ec�XcG�)ꒊ5�+�:S-��\ꁮvbkΓ�QϿ,C7Z�`�נ�ؾ�����RI�q��Cm�h����d)��NҦڲ��|t�`Y�0u��^O�`ɛ�H�.Q�6��8_���a�FSz�UB7�3BYD5ba�(:L�<�=����%�	j�S�q0�"�\;�$�����R�$�O��k6
}�;��+4�,2�v��j���&L���U�*�_gM�3����j�b��;�@ŸF0�q�m#���O�Z�?����?kmw/��9��ч�k酄k,m�3�-���R�-9W�W|s�Za��#�Lg�:R����A�X^.�p�h�''%a��'=O6ɓZj�k(�sJ��u��qЌ㩛8N}N��l^-�o]e�q�?�p2�����n�ĩ�B8kR�=7�{�`�jq�Ó1\�ًݩO[�9�Vt�[0�ԑ�[�&�N`�E�����s%,t�P�8J�W�6���;���Ҏ��w4/����4�t����ÐUHy�w(���5�0rX�*>����9�E�.��HJwe8c懟��ʞœokūoke��א��"AWNZ�rr��|��=�4�>q�����ھ0�O�R�j���H�����_������
�R��u�T��X����x�Xb��,-Ggt9)�t
Na�~���ʫ����&S��ƒ�6p��[{
[���¥�n�|�mw@y�#v^��p?�TӘ}3�Mf�
��Rc�6Aj|
�&JM��&I͈Ӻ1N�l��Ma�dh�-���)\��Ԅf��`,e,z>��z%�\��6_�m��C� VX^Nb��c��J4��tDs���>�Ih���v�w��;�����v`YqwƱ�Ē��,�׃YP��r�D�0�����!H��W�{o̜"3Q7�yd泈��A���N�4�e�Ŧ�c�T,0!$�AIN�O
�&;�y��Y\׍f�0|��>ǥt`'?'�9U"��Χ�Q�]��d�����@O��5�I?nr�zW�"�i���+���v��������͋���Ѽ�sј�I�"{"�B�(m�E�S텟;�"����d*Tf�u�jsG_���]V�~���Ř��n�qN�i�u�5�5�v�^�.g��@=q��p8�/�t/�8:���xA���S�����R5����%]�)����YI[����x�ZQv�� <�՜fr*�&0��2��)�}�w�����X�:O��-��>Kv�&����^H�*+Ջ�r�(��$������uu��p�#�°v��3��NtΛ\No4���<��Ne�d�6�bg.�pw"px�D'_m���GMF%u�(ٙ���ęT�$�Y;m�;�i�u�e_��{�`^�Ç2r��A�7�>1p�����9���Q�=�l��5ߴI��q��D?�(&z�6��d|t������Nw���gg���;g�gȼ�ŴI0qa��;�=.v�"Z�����ˆڽ���Ƭi�=�T�����<������1TaIT}Enu�3}��=��]��Tj�5m31�$xi5hU�7��;�-֤��d�9���7�g(W�8܌y� o%�-"n����V��Z�zPl8X��1�.�
��͢XN��zq���NO��)O�B��>�v7L���S%'�P;$�!��3�< �
܍k���L93/�$��%yЃ���W�q�����)���6�hW#���eͰ��2���V��������2F	%�^_7��6���>��t�LI�o�zdc�)�G�(Z��>K�����-.�Wd•��u����?�\*r%XlQ ��;�qcX��*���R$m+g�^:XY�h�bi��.����fq5�eO��A?�L�T��<\^�$�'�|X�F�?����ju,QO���q��Ј��>���x睪l2�e�94�+�$�L�U[�|�!��my�a�ڨ�m��˻Ǩ��#����D�M��}�<�*R΀+�>2ʡ���/{���v��$��S�2����0�bc��e��\=]�X����v�i��X�a��q��y��u/4�}�P�^��ݶo�9v����
��0�0VjS=�W�eF۟�*�_@f���q�`�QV:�a?�9�G������+��pV�#[M�D#�~I�H�U-�;�	t�$�9K�g��
��g�s�2��G��E�Q�?�#�?��#���N�P��=BmD1����A<�5���:�:��5\9���h�F�@)s�sY�]�}\��,��:�ќw��KY�C���9_:���1C���ܞXy�'���=�oOz�ۓ�=5f�(}�NW��-�է>]��)�;�#��m,0�N������me��꒠Ίi\o�}���/�E'�y0�@90#�ef_u�x�zU�0�=�ka�iAo.oa�}�(���P=��^H�#�oC/���f?R�}s~�
q�,��B�#�H�aA�7��G��M��B�W)��*��V��%�T1�J���j�<�JKik��S���QC����n�5U��N�����i�M��*�4ѼKF�]RN�6P2�l���~�3���*�GЪ�қzS���>eK���[�Tuόmz�7��ؘ݀����)��&�6x�60`�LY�m�����|�?7/��_���F�q"nĉ�sN�8���P"��5;�V�ɳ��m�iУw�3h>��u�t��9�(��1[j�n�RįV%�P�K��]�o�rAQ�
���ʴŴ� mq���v��CMW�!T;�5�u5Ll�h;L�C�e&T)�c�%
=�*���&3z�15t�T�}�Q��o(���);DE���냫��eՂ4e_�/��s�e�̕rd�őx*��S �j������Q�N0�M7�a;G͒��.�G�H�G�i�<����W�XL����hM�,��*L�\8�[�&�����Dy���>c�����b��*@��}���j*J�1$Ai�s���u��f��x^�����zY�;B�z�,�
m��"�H���֢q3����50{@����x/c\�5�î��p�u��:b4\�r�:��]-d����FS�|ۓ��+�V��zi_e�@�%h���<*}���|�P�O]?K�3�W�Yf����`yV��I��2Z\J�X���R-���>��-/%_�@+J�W(��R��
�[J�KM��DB��[�T
��B!:$Z���Uc�N��5ӯB�4��z��u�ef�F<��qsq�&"�������a�JQh������z<�s�2}UX�Z�E�eز�y-P�ԣ-ƾSf"M߈	��+�Y��z*Z%��9$�t0���RaB�^������V�܈��ު�#�<���3$���hS�P&��V/δܫ���+;,�G���֝��7m����S6-	�����<q6�r��z,8�
U���F$ڠ	c�fa��pɷֳ�w�͞�a䎃�v�o�<���2�+�����p��gT�L�_�;�k�V��,�D.	��-�'�xP�DT�I�`*�m���$6t�̳4���Y�Y�<����E���v�Ir�VC�C��!�����0�����$�pJ
����x4�o���F9�	ɒ�]2,��)��0cRE�3��.Փ�Q�F�D���)*%�5�𘆱�oyc
+��?R�gD�uް̀4���22˦�E���e����DE�1�";|N��+�6I��{��.G@|$�^�9)�1B�F��L�7ӊ
m�Bf4��
���W��pB�Z�H4���{qv/z��ĩÜ?F�B�oA��:���~	i��6�����P�ż�fӋD�|�M8����|��y����׬�a��Vߩߦ��#��+!�ErJ%d�H�[	�W$�VB���}���D�~������s�֐5��a5$4����H��4Q~�q~�D?#���3Zߩq�J\�O;�G�l����κ0B�`�(��yB.���o���H��R;D�`т=U�E�S��6ኰg)��k�ٳt���h�/h��&:�R[��#hZ'�m����@�/�ݢ�k�@$�� ��m��;i�N�RZ4�ֻ��5�v�m
�MY��=�]��8@q	�*AQ�FJ�}�P6�};l���Q{� ��D>�OESb)UA�-�0�2	h�S����KY��w�D�s�?�Q8�'D�߅�.�F	���M#Rv�ߦ��.�ե�86�H��󼛎~��HVs�xҖ�,�j�mH��� �=,
X�I�Onn�j����A_U��h�AN�`�/C�>j�>4܄A��(�9G�Щ�{�0$Z�D%DE){_����O��H$Ԫ�_�`4�
�9Ȣfo���X�o+R}%��]�St�����BᢖzOG�wq����]��	s�����mE5��X��b%Y&-W�szd��*B�Z��4Sj�瀨�V+�������$����3�=�E��Js}L��W9��FY�ꭗE
�*����T5�;Y��o[�L�Oh2c�%� j�Be�*�L3��aZ�@�.~b���ϐ"fYgW�b~Y3E�%Ⱥc�� ��@vœ��$��x�:"u�@dk����f�I�g�b4���p.�Llx�pH|.M��]�!r�<�9���������<eT"����+`�r�MS1�UQ���PKm��☎j/��(1�D+����!F��ɖ\�d���u	2�d�+ �q�2d�%�"� �^Y�/C�Y�d��)�M��!���W��8�RC�X��PϽ���G���OoV��T,KU�?�7+5��ޒ|Px���"������`��J�0"Z]D�B3��?4�1�Q��a�
���#�{?�?"�ӄ�a؟|�W�{���m�/^��5eFIk��%�m,�_*��A|�]����]j�,���_v7�-�ܮ�a��sp¥�����V�������c4㿋2��v[�=0
�Z�Œi����}�`?�>`5�B�A4�� G�N��S��a��Y��x،��&>��:5Z@?��Y-G,��>��G-��z5�~�{�ʧ?�����=D��,�az|ny���˛F�/-�Qz�~%�%�;Sݙ�kW��/�~e�61��x6}�Jm��߱�����q����!��|�]ž�]�V>��[OZ����6�ͭ���c޷�)	K����*���=c,B�cp�ѵRn+��@ /k�b�`3�8;`�e���X�Z��D�
#��Z�7b�ϟ���o�[�>�v��4)ж^��/P7~̟�V@�I������NO���{����64O���)��j�
�k�׍��8>U��/xu?e~�f��X�;�򠍏{���~��}k��b��bCY�����������jz�6��z}��?l�<b�A��e�M�(��*7�(kN�R7l������?f��<n����]�G�0��/G��*7սe:�–��d��5-L��
�0�![*��+����GC�S%e�:�lH��cf�f�<��C�U�{��#Lo����Es��k�m�/v�����sd������j4��77Cw -�So2�'��[
s���<InF	4�Ms0zȢ��l۟+ۖy��:�F��9�~�[â䮆��<1tʉA͚��~��䡙�fX�w�{
�9vƛ��c���9z5�~
<��y
̡�g�Q`.Y
�C C9�M+}V.O���/	�(�]6��n�Ρ���x����ީG��4���%X?X#�@����"���ߠ���������"9�o�H>!C�'� 
�����Ic��f��-ʗ�&p?;LlvY���v��Q1����'�j�O�����4KVIl'ؘ;8��8��W��P��)e ��?���_`�O~�g�A��e���m�4߀�?��l6�(�lm��=�!6<cd��J3׀�m���q�g(��g
e~���9,`~��u�Q(��2@���	n��]e6�n9��es��&����XƸ�GUT
9�I��ð�t?��$�{�������,~��s�S�*#�L��=�R��|��b�н�K��ڪ2�h�6��J���o	�I���)C��/cc���Lc�p���NV>�2����r;��=�����]��T$Q����C���|�N�r�cЪc$�^�c��J�+�~��J�VV_϶:/����/ײ�иq�M�SEp����	�M�r{���_�㸔�\
�^z��M6�"��%����$.�_htj�}Z�	�X�@���q;D]税BQ�p*��ԅF�~l!�e�2~k�>�B����|2��#6x��D�:��*��|1�#��F�6^�ҫ�1ͣL�f�
_�!��N8"L�x�V��;Sn�1�b�<�a�p�<u�u�F����f��
�wF��t���>c~���\�S"�˕h谀��,Ф?��T��
q�
�k�
)��?`^�~,e�t�o�پG�g|�\�X3h/�Z�FۏhZ����Zg�-$+7����z��.�<����x�d?��U�u�7�w�?6����m�����f�F�ц�Q_�|^�Xh�o�Q#jj|�
�׺8	5D���.2�DG=IH.�*ؽ��=�T�
�mL'u��BSK��;oj舦j	�6�J#��T����Q�`L��p��PH�#ÿ�ڥ�'*;�mY��ˈ�U�+:�6X����jVy.�,T
*<����\��'��֘;��h,�`�nR�wa�l���}M�a����E���!I8�������S_I�qP3�PJ�2�x�t#���Џ	�U�?*������锼�I������	���5�וֹ�^���+��e�G5#7]��SE�_�嚂Σ�:�T��AE�h��-�C��?_<a0�лJ�Lܲ8a.��a!�U?��b��R娊��U.��Ժ2IE��j�r�-��!���Ѭ\�7�64.K6��8<�h�@��d�1`ҳ��A�X�{{����X�B�1{`�nP��0L�e���!� �?rR�kO��`*�Xx�`���|�J���Fu�V.L��H�rM�h{.��~�]��>y�'��#��
��:�m�E*�N��_
��s���.�Oq�~۞�_�)z��B!�O
3.�](��B�Ba:x��z+:ͅ�%������ʒ�3��RqI�%J���%bU���Smy��l9m�����q��e^j宓�?*�	"0j�7U��L�&`���U$�C@�=���P���̄+_��Z�MsԐ�	���o�� �j�3D��V��V*�D�������S6�Ű�"��+M�(h������w`*U�:��S^qGU�I�3y�Y�Bhe	e���
�FQ��4��5�wD�Xcx��E6n5!F���>�:�`yY�̴X�"��sG���A��b;p��q��Z:���t}؇�����#d�<ʺľ��?�sx��G��+���H5���|��T�)Nk~��@Fy2�Znn^B}��H6&{����r-M��!����^��R^2�y��U��RXS���O˔����A��?��;�$LC�X2���J@[�
�!�zn Ah�Ѽ��)�FCg��r@t�Y�H��7Q�s֙$����|���K�L���b
U��^\ey��
��hn����A��RG`̟�"��t�T�e���!z�2��Z~Jl�!A˪���Yb��UAFӳ��o){���a��`oY��nl��q��
�Ժڃ
=k��B�e�/��*��9W�eI{�� 
8V�oE�+ͤ�s�l��c��!�lVѫc��Ե��ev���cNo�Ժ�(�y8��n[j�v
�U+����Zӳf�J�Oi��y7zZ�Z�X{��h�rE{�P�8�K���i����M4�7�V=O�\O��\_�Q�9,V�aZ�}/X,��3�G^3r��%�W��6}�v�l�qĐ�i���k�σ�|[��t�҇BH��V�M/��=�p����+�]Ph�՞�i��RR�Nқ���B�ʥ�W�7�%K�A�p�w�Q��QЯ�ch�ۆY��d��VM��:��}Kz��y3[\�T�*�ZG7�Q�<��}57V^N㪴/.[�c�x0��W���!jy�0��J���F�Q�"M�R����鼁��/��C��A�2�襎9X�z�tT�t��0�z˭iH��"�~�d�Y��`ʆE�kF�k4�m3�>>�~��$xC�C �'��m� �����]�S|����j�Zz�O�3�ٴJ�Nr(�����+70�[Wmm1ZV�Z@g���3*�4��ȟ�f�21
Ny�l�!��m�x�wu���nתnb�gX�z�~}Z�y3��ΛY���y����q�;��!�{��T�b_�2��5���lʌ�s��aʌ�@|����P�w@Zr�}U�乮��Pd��h
<Ǖ��T�B?�m�L����X�m�b�j�Mq�n�Z����סc��BXs1����a�H�ޱ�?K$g�x؟-�O�D�Z$��T؟#���L�F$�
�\؟+��w>��Ɍ�.���Hv	�S�]"�-�I���›,��"�@��o��}-�{h.ɅZU-�EZ]-�~��4y_���;K9o���ڈ����5��.�l�W�R��C�w8�k�*b�G�s$�_M�k�Z�����(������u\OIn��ct�j[����y����l��w��Nh~"c;��EjI���؎��U�?$��0�C�
�;����8���Aº)J�۞	�Kb�[gY�4M�-�i���T�f.I��L���H8?HH�8GU*�9K}FC�P�����拓���Ш�]�� U�O_�\DwP�]FU聠=R�m�����Qݶ�<��,�͍�;�u�h^%B�Ԙ�԰I��ǡ��O%FS��yɘ�D�D��^�����K /(�R�S5,���k8�Z"8=xRSPeS5�L������P��G\����Tӫpy/�0��c
�*)�d���*�Qfj��4�`��@SW�F�Xnȫ�� 8?$/[Ȼ�J]���[2?�6�Q�6K]�1��h��(��!�6Q
R��rՋR��R�s��B��Q(��ӅE�/���"uu�i�Щk���[�ֺ���fKu|��i�Л��>�O�Ȋ�=�@�I��R�
_ok�RL�WJ�B�_
�,�{ۂ襂��kg����B!U(L(f���9.p��_�@�]��V�'qu���gj�F�FI/.v��]_���%�a�6�6J��a׵f��5�k�����M�J]ל�D�3ɘ�h��+:/�(}�V'e`�C
�)�4F�$�:",ܛ���D�|���&�k+�:��� �Ď��t����j0���	��'�}W}C���k)�n��&J�[(�!��7�hW��h����uh���0ͅ$���hJ�NU��4�1�x}�f�T�d����W���RS.��k��+H�j�S��!����� J<)� �BxN&�K�1�T�s˥Sz|��35�N��Ѷ����Z��B�H�`F-�\\T|$��)Gbp�7��j�)3e�Y�}@�D`����G�Ҵ�S	O�{�X۪�ʪ*������{4��$To:�=.꽥 |7e�i���m����/�+գ8e���\oG��!Ǡ�ա���f߅�ɺ��y=��H�����NE��H@Pzn��F�q���(�`������S`�wHk[%�/�-�lk8K��	�Ԩ��U�<�۝��+��4�a�S�5��"�N=2�0wLR�i'�ą�mJ�=;"LW8�T�9�c8�9��y"�_��h��I�|aĻK	-"KF�q�"�*�Zx��CjxL�u�<����ߑƊ�d�ߑ�fҊ{}��R���i���z�,�����_���.�_J�5�q5�b��Ԭ�ZEsH��ՅB��`�dk!�1}�!�4���ݺ�p��k{:���&�0�$�~��#��a�PWZ���̓���ms�3�w)��)�[�!���R1��a���������D3�7`�*cE4h�VS
sw�q�l���*$ ٔx,Xok����^�-�g8�`�B솩<�S�Q&���3h�3����>���"���``��Β���@��G�������c)�TdԀR4ž�����23���F��\�(��dHR��A�;%d��H��H�D�NEK���p̚�r�i����$꿢ت�U,����S��gz��N�!�����D;����}z���z �mTb݈Z�5$|@/�\�+T���}�^�}H���n7)L#k�qp�D𰐈�MSDpx!��Z�f3��M�Pwn���[4�?
�T�{3ȦϩNe4\�(�.��1#���2�|�}H(>�\N��i�eF�)��k>�y�0����.>
):*�4'��Q.y~Š������������Qhn���#Ff�:^KU�����ĀsG^�A辤8A�ܗ������g�>6�5
e!�!&a���a"��; 7�íy
���
��S<��y-\��5��@í$�n�p{���f3����S����=��P<('��<L8��[�-���5�1@�o����l����(�"����cp���m�����3���R~�qce�3���*}��JO���g�ƺ�*WE��`��YԑK�q�T����Ӈؤ�f�2%Z���O�-�O�G�l��[퟼bk�0ٱ�Q�f�m��_�ǎ��j�a�м�џ�ͷ��i�=�ܞl1�+.�i����!O����2^�e��j�V�~��w��IC�8�WWr�p8\�PzYu���.�v�(����3p��D��ikT}ސ���Z;LNTss�]�a��SN�ܮ��������w���S{o�8����S{;l��{��QpyV=J���'�"x�?���W�O�E���/����`��[�]���
/k��D�//�C��WH�1pe��F~"q;C5��M��~X���i>�Ց5�@�Q���w��*s"�69�Ič�u9��h�LD���8���#0��7@[�S�i��q�Z��d("���:C�
Q7ꔪ���=�b�R�%�ʲ��8�P�S������R�i�����62Q�óh�l�Y#��t��Fʬ����3��/�s�+�S$�?DŽ�!��HΑ��� ��%avK��G��c)o�����l�᥆�
~H�f�A>�
��,�`e�SSG��)[�����!�#�(�J��T,k_e����)�����L��ƥ��{l��c�TL�/H��NV
�6w�\�X�]��P0�
��T(P_|��bj��F_*�:�0��'h�\9�z$�]�4`�$�UD�
�H>�����5`O�!"c��1cص�R�Q\>��y�(�J�,K�U���R�a�K�g�#"�^�1��1��Z��MQm��4�8�ͷ�׵������#���K�?�
�C9g�5����9?>�� В/Oq"�5�q�Y	����R��3��j��Յ�88lܑ5;M���#�$�t$y_-��c���ٶl`_y��Y�}h���4���s��O"�l�����n���;�0Z�>0~�5>~#v J�"-rʖ�	 ��%•�����q�37f�$G@�Q���Ju��G�կ�
fg�@���y�}�WX�u`s���<npܸ��x��QM{y�'��e�����!���S/�W�~X��5�"�&ߥ�;����~��2�{>D����ID�L��z��8�:l��&�_�{�0ó��O~�:$bN�^��p�qџjf�l\��MO5�ܦ�S.��s	d�T:�����p>N��Z�N�$�9�#ܔ��9�=&�H��;m�@W14�r��u��{N�Y�0�1"9�T6V(��tv£+1�X�b
�_�
��1Y�~�:��W�U�/"���2�KYVUTu�hY'x�2�~���ۼ�:��{|4����;?7i���6��-�}��ȏ��p@?ῆ*�̥wk|�*�F{���t�e�{+�����)�~`x�<؃�YC/�)�<�\�	��"�s8\yL2�����~[�#�
�6<�D�m3��.]Fu��W0������YGT��1h��d|?#\S˹����Kb�P�|z|!�T�A�\�E�p|1NgLO,ȟq���ֲ�y���"O9�#�2SB�8S�f�|�CtKG��#�
��,ZƂ���%��%�p[	_�f��+L�wH�e����釈�R �4�<@���G�k�
��B�
[��=.���	�R�t���)u�P��ʳ�}���5��n�S8��I���2糿�����wX�Tt��{�(`h���3+ �B_J��D���t"��W����9kײ�$����`��cG���P�T��a�gc4+hw*<�ᔃB�F@�#�Z������#_�� ���U]0�'\�S����n�Z�4f�g���e�3ȓ���!/o����B�a�z�Z^ķGỶ����
}(�I���
�X�ɕ�qT�u��紟�J�\M�ƺ���o�i��qtc���qL���q�766$B?���E�9Q�i��a�z�nD���Hڔ'�Z��r�_jZ��`_�+�������B;4���l[!�Ö�!�]�(,�`�,-�N�3%����JZ��0�i�Ȣqv�ϒ�	i�{v�8VK�8XV-�d㘆k%�7>�c�l3�d��{\���Ѷ�8Z}L�uz�
�+qb�]��%����8�-D�ωDt~��N��S�0Aa�-�
�EK
	��u_�N���pa�ƙ�&��ƈV�P��a%2���6�{di��(n�5��4N>�0r��i�G1�?�:6IT/�p1(���zz��i��[dS�!�Zn��y�(��~M��Im8|������k���t�Ձ
|�<��A3�����p}0�\4�f��0���\�����T�-!A��4�+�S϶�x_ZlT��	�iI
z�-���r-��4j�	vl�^q
�cě��ù�t4���ۧF�wj�ix�b�~I7���������!�I�ޗ�-|)3�	���v�K�Ƭ��ļD���uM�x+�6%ɋf���6o�)�	P)�8IWBg�Q�l���E�A�z�Bv�~���>���P��u
���)y����N�+�=z
�:�L��9c�!�!��+�W�#��TY���v>��yT��$��L��a~3����E����mk������6��-���_[�� |���ᓖ��OY�� |���˛��Zނ |��2A���
��-�� ����	��ޢ ���aoI^���ݚ׋0Ώ��i�cp�7<њ�zSr��x؞"���������M�<�F<l7}`kM�ۚ�Rk�Pk�Z���` SyI7�ڿ�>��k�?�C�:b�=�2C[+;i�Z���2��V��
�l&��,^�f#�kz�
�)�#�^��D��R|��K�و�Y�8����֯��c��O��։���Dr��lO�z���پ]Kn�?i� �E�h�(�R�3M�oI\v��Hn�5�Er��"��nn�*����H�J��U���\�6�|M�iM$_�ԯ���x��#�v�|�ob�}��9w��'�+����}�)�����:��,��7)kk}s}���?W��)T��l�:C�3$B=���f�uL�y��ϣ�~���yf�~��?�[��y�B�U����d�3�{L����8,��|��)�ЌzRʻM�"�����t�g>~�(������<ԥ}�>�v�@�L��B�\CG�r�oc�H��j��v 箊TY�v�@]X���t
��*@��[�~!p��
�������Zn������(��#~�3Kp��>�*��D���߀�|����Ah'@V6;n����(�H�FP��e	���h)A7|"5�""���D�
�l��	=p���	�-�|[x+��6�3ޣItVW��R������2O���:.�b��^�H8���6B<7�aˡ~��d����*&����`.Q���2�Mm
_��״��T��:|��'P�p}��v��s[�W�U�_�A:��_�z/����E�b&�~b=�g���G
O&_޷�T�c�0�	
��qRj�\�c���)W��X�.����|
�Џ5W��Ÿ����ZY�L�s��$�%g��K�e��ݓV�~�P�8�{O�Fo�^�J�����MQ�5���=�V��b�C�T��H���*�n�fх�B�.���5�	c�����Ve����,#��R�H���L����j��e�ԩ7��+	|L���Kd�n�3��c�s ����KE6�Z����w�75�#��
o���ɬ�V?��s�r�8S��c
]}��
:�\—#n=���:�\>��f�;�5���%��ך*�bx)�3� ��̎��`�^ϫ�_�2�n6K.6R�l4�n��@w�
+Y�D�қM&�MR����+�6sn�6=�N1Ǡ�ҋo��L���wP��Q����?�F*�ZL�Ѭl�+&�Oe�0
�B�D����eCw���y��ˊ�T�D�j����m9�
�-f��ʢ���2h#���M��|iP�e�)������.�I؊�(\ʱ�rԔ}-��xr�4�G�U���7M8����wӈȷc�u�z�aO�Ig�_�}	��KA#f�k`g�r@�a���[k.m9a�yRBcȋe�!/�A����lc1�qnPc�9�qj�ǔx�j��D|~�p(Ϥ����wkE�}_|����a�<�}�<�͗Fz9a���@���)�E��E>e)��o�3�v&ef�me�7gC#�g�d`����9%�;hc���cH��[�*������!�{���i����=f{���t�{��������ʹ���Sa�vV�V����v��7�SӈT�|�J�3$5�ƥ�0i+?p
N�����+��T��&�f��
�_��P��k8�V���p=�9���S����Rr�;�0~Ϣ����PV��#�\1�X2|WThc�5*�ܩ�n;��ml��:�������
�7��o�|9�a�|�uzo�ش_
��#8�:��j-�Ͷ3��v���$��2�%��,#gT%��#`
eXZ�1��N��N���3v�fݛk�w��yv���2�f��"9��"9���"�K$t�H����D���ӽ�����Gð����a�u}���[��uV��6}���f��2_@�GK�⏕��(���:}�����IN6}�{ԛ���L,Jy� ��!,{�4��Ue����ϡƿ�u�/���ζ>�4?�	��N�!��a'�E�9-�:��̑�:tZw�n��qGk��l���2��p4�IJ���ͧ^��r=�<�T�4ݲS�޽���N�,�Nі�NH�����,!	2��� �T@d.C�U�E�
����i���gwi��o�Ea�D����x�0�������
hK�#-}�x7�_�§M�}�4t��#ғ�9�i>�l���"a���N�m��^�,&���flś%���Ke�'����z��;�V�6:�ih��kZ�h���@�
'��#���N�͋Sh��`��柶�Ε7x�
���R(�3��X“�����m��YN�O�}�
��6�Ǒ��)|�
�@�)D=;��W������
�k�n��hȿH���M�X�6��ȗM��9P<��\�zD�ea�.shr���`eV����x��F�;%��Dyŋ�%��3�K6Xd�
�?<�P���]���&J��M.�@���iٍ�w��R�fJ.�ܗ����x�aR���-�X�Jc/㠵�N�sf��y0\W1�f�մ"�q��w�9-�:�Q�+)���3<�S�2]�+����^�wݿ��|�19o�ƴl㡻����淖�8ͻ�N:W�J�lz�	�{j��Ln@t��-o8�-��;���vӛDgo�Q�v@H�x�~Z�S5�b��w8�q���%�5�8��G��{�Q��z�zo��\���(�{[�2�{w;��=�r���뀽`g��\�������e1�hQ����Fd�;oT.#����T{��Q�{D�=�m�{XÖV���U<�����?	4�2�E�vr�h���}�q��O$��ƫ��"y@4�n������Q�Q�߼^��~V���[��y��?�_��ĒɃ��`{mo��l{�mo��s�D���]����������k{E��l�W�/z��5�nK�ݖ&1��t�^�"�H�]�+1��+�N�������B3�n/�d�E� �����x�M,dg�F��cp����=��q����l���'�;�������d���,C�J�-̴|հ����"e�����J>��v���+;��>�ڣ<Z��Ѳ.��uq�[l)8i�&k; �Z ��AW5t��N����M�n5�`#2�6"�p����x��Dxa��Bs3��U��viuce�H1�V�X��I<�l}$���1�CWT�Xp�J���U��-�]"��tH�ȣ�4�;��+vLO��;���Ҏ�i��FI���Nf���1U���J[��˶LO�L�Nq�ǖ���zH��V.�L����|����	�K��e_ъ�hi�5J]�q�:*�}��T;�"-�r=T.�r�lǵ�=E�V��WyWXT��Wj�⎫�Z�j_��j������q=��s��xި�q=��,d�s��3s����[�›5<��&��{E��/�o�h�@$?��CV��!ڳ"����j����%ڏ���›��,�G���h?*��/+�?�O��퟊�g����?�υ�/�?�/�7(ڿ�/��/Y1�[��+�DŽ��h?&�_	o�h�
���ʅ���s��؀s�W���y�?�r���M�SM�o�����; ��E��
�JXWY�b�
�k�����-%�Zj�9����b�̨�vr�{<������e������-%�k7$����~�_)� �j)~�m,�C��S7�a�����>D�׸
�gq_-2�a+%��d/s[�l����F�{h�4�Ƹ�0���_J���|3�[�);��0���o�/��ؑ7"�g�đ�f>u�%K�9��ϝ�ω���~�m���/��/	z�@�o���׍�i�_q����B'�����r�I�&�	i=�`���,1��|N
�����C�Ү}���eN-t�8�p�zh;7����f�'�Yմ�=n6=ٕ��7}��2Յy��q�|����dZ�@���8w?�+sفR>�)y�~	._�Xd+!��I[r%��e%|D��Kz�'��ODº���h��c��9��q7���"��K�_H�Ta}BwK��,y�tqM�e?���Bx>�ᦟr�7�@�$��{�d�6��m��O)��dͿ��;*fBF�[2��꽫�	Ȩ^V�"E5�2j�dԉ�B�](<t���Ba�Ba��
�­$�
Y^}�L^}�,��)ŗc�V��3]��C�Y�?ۥ��?��{����x��찗��e���:֟V��eT�ml���D�ϸEǨ�u;�“q�����n[M�mZ�<W�1�a�����i�3�J|?].���f��^뿤��e��ٍ�1�Th���E���W�M�]�q�dx��!ؾ���m{�L���e��4�ǜ:D�
m��6`mI�b�Լ��C4�,��'N��.uQ�lz���������8p�dB��nz�[�Һ�m^EL����W���q�OE�y�my����uEz����܏'{uH��ָĘ4��u��Φ��6��F���RR�����K�}Bi���Pry�n��E�o��j�oz�[�]�]/���x.M�yh�Ǿsq��W�{\���'Z�(�*1��t�g���*%ol� s5cJ+	5]\4��>F�x	� +r�r�d9}�V�M8C��bв�C57�眹��@�wānL~k�e}�0���w�#0��(&��"�ܓA��
D���l&��l���)@3�,_B��-^B�	��A.���Un��i��DK�zٝw��7���]�?��
�x�E�j�����s��{�7���e��@�1ەz��WܐR|lt��c���J��I����)>�q��c��[]��8�(��~G)>>��c���n�4-��i�ۭ&<�v�u���gz�6��$��.M>��q��q�=���m���W{�՚^wC�R�^��@3�u�Hb�y�Oݿ���U��T�}T�3"����j��
5�{E��v�
Z�7�;oRZ�o���e.�ؔ�I�C��S؇8%���qZ$ψ��ɳ"a�gE��%Ή�7"m�F$ϋ��~��>;��K����D��G�%�X�O�X>~.Z��®c������6��E\
$�;��$�I�@>_��AH>��������H��.��y�m�oč$o�m+�|�jyX�Kq~ĥռ�.�YS3��.w��
f�����Z/��oH�[�<����s3����w�jm|�S9���p���d��2s�2�2g����(#�Uډ����P�&��T�j�k�`.h�\�L9n%��(��^Q�Z���W.�?`���3�0�Я�X��b[Χ�v�υ�AȾ*H���c��B����8d�Ÿ��5y@�!�ﺲ܇�YVH���rmw�;�OC.����}�+†r_�>�*h,y{q�����o��=��0$��z����l��J!�>4�	}~���8��{�+eƛk�Q���-��
�Ց2�c�[[W�[{�%�Y{k9����lk�����nk?ͯ;ݖ~�~[���h�m��wSh������W�O���XZ* �	�~���m�� 9��C���z�r�������]�����5�7����'���-�����g9?w��n�K�?�ſr����]�����)���2����
�q�⭶���b=Ϻ�?�o�Ϲ�o\��+�A(���^f���B��Θ���y��y
�uw̟����G�9$7׎�)>��~O�L�qM)��`|���|x35vѧ�I�?C>�;6�v_,},���/�	�@,��\�R�Mpo,�j%�X�
.�t���
��?*��}��r��|��¾�?���R�8�_1����I�E�z���u(�3��b�, �>|8��Iy��2F(��������\�
x?-Ɩdh�Ge��1v��Z��KOp��������1�IpA�lu����뉀$N�(��ߖ'c��b�p���钨���o�l�i�=��C�}F��T�\�S����-�6�A�˹�g�J�5V �T�l�7�+�9t�9����f�.��jf,��jD�'��DH�8Ĝ�2;qfvi%:8��Η����(y9�@�g�w<�*ޑKJ?S;g�]�@Ό)�h�@~0�9W1��bE�mN�=s����i�K0���7�^0oy!�-����<�*��]�x�Ϙ�,ٳ��+�g�bw~O�g�c��0=Tj�M�x��~��_����귿��	���7�
]�*�}�� o�controls.fw.png000060400000235561152455615120007546 0ustar00�PNG


IHDR� ����sBIT|d�	pHYs��~�tEXtCreation Time11/13/12��:ytEXtSoftwareAdobe Fireworks CS6輲�wprVWx����Q�0���%�
KС[�s����^�@
!	7�wg‘˓@�����O9�������몪�,�R��$��s�����������������������?�ׅ뵡���|���V�GB��^L�_5�׮^j(�)_����'��Uն���Y?n*�˴����Q:7�Th�T[TM��a�5�#�,Q���6� �c�*[�i4�?����CMa���X��"��k�ǻWnXw�W�.$��[l��o�j������@j�Dx�6�����s�OE^_C)ڌ��H�f����rh/%.M(n�Yc����	7	��{>>>>>>>>>>>>>>>>>>>>�m�$I�$yK)����~�/�*'y�Gy����o�ҹ�k�r}HmkBF���)�3���mkTSx��}is#7� g��v��y1��~�����{���(i��CJv��8x������׌W����	T��P%�R��i���B�Ld&2��w�w��O�W׳��ӫk�M�����gpY9��|��d}�l�����5��������t}�uzy��bM�6㓓w׃1��߻x}��7�-z?��Y�u覆����Gp��?���z����	<}�[m&��9�;#�{�gwm��ko38�ί�BCL���0�Qip".��e�L8QyrA�TM�r&nN���b3�/�h�T���=������vgx���ܥ�nr�pqq�͗9�Lz/{o�޲��-o�!��c(�)�e�{s�ak�5��b��.�dع!��8j�Aw��GG{��W���}�z&q���U��*�`����=��O�i�q4��\���s�q�!O`��6�񏂪�)|Y��ƹ�tzN7���3�������u|Z��Ѫ�b�J>_4@�"�����L�!���}`�����~�=�&�@a�_����Jd29k�k-���O[�b���$���zf=syd�K7��.[6�]���u�B`n�%�©R�����CY[�����!�����୵D�#p�������EQ�JS�1�- *�[�Dm;A'�tN�E%��x�|�]�z;|������b'4X�0:��2����9~�ぐ��AN����������M��7Q�f%�%�_b���9Ky�@�L��]zֺ�����?�DU��c�o��ar�Yh�u�9ў�Dd*�$"�&�>}��A�&̒�bV�%ɗIc�/.���tF�r�ع1~W�2�ʈ�8�6�'�W�Z	��J�gm�b��Jy�����<��@������Z4�������C
���6k3}iFK������#i�Т�[./�V �lb*�_�kc*���5��'��2��G	,��d�)Xtn�EO`Q�X!���#����H7@,��Ĥd�@r^�!S�Q�	Fg3����,�G�Ylŕv�s1[�dFE=ߺ�#Cs8A�D�4B�Գ�&�3���Jyb=����]�Z��ʱ�U!���؛�	^=��+����t�
�'�+�ܭ��A���`��١c�J����"M�G���qj��5_����4g]�;���T	#_`��o$��h���f�z_#K��	M�@�/�4h�	4�
m�.7)�r�����^����w*��z�lL�&��W6��p��x�Ҝ��"a��XC�c�wG�`z&M�HZ�C��ܖ�"j:�!+�M9C�p2/�z�g��;{T%3�$EQ9����EьD�u�����-�I��g�]�y��R%OR�j��O43��vc,C5�`���B<��X"�CE��9�V�n���fm�p5S�&�XZ&K���F�[X2w�%K"�Gb�C+�=Z���X�xx%wb-�Vp�#L����:�VY���:�,P������b&��%R��-��H(�&��@k$�	�."�؅D�"2��e�|�&�x�~IL�\�N&��s�w��"q�����
���.�~eܵ�W�I����pOW���i��BL�G�O�ۢ�a��7�S�d��6�O�N�-�le�_��7$�.YQ�N)S�����	��:��y���K�Y�c��߰���RSҵ��9��\�^��M�i�	_��|�����t!�P���D�fYFD�u�HNV8c@���gW��^�kcIz�����j���5j�8�c�?�0l�w�@����:�k����v�-�,Q�����U�,Z�в��Ĝ5w,400�U��h������<��T\�P����4��
��/���F�f��)��L r&�uiz��fBU~.�Y4+�$4v�#o/]W�9p0�ؐS��L��%1��̳@�*�/�sEm;B�Lj�c�����T8����$f�&q_���kJ�(fD3�l�7Cc�E�ZZ�k�z\�,�h�ܼ���EyŪ\]��63C2��ia��b�KTA/zkL�Bu]�C�{����Y�|XhԈ�o�&�B]`rɆtu�*fo ��=��A���[4i�4�b���[�$o�{�A�t�b�Q���W|�u���5~'8�&K�I"#����I^��0E�{��:�&��J}M8,JF(^�I��E8]D��Xz�b���SD˒$F>Ȗ)I���#1[M�7�qFe5{�mm�E���[�,,X�'��#q?E%i�P*�Pph�Rb�#�4l6ٟ>��������ؒ�3�Pc%]�]�e2z�dEZ1���T� E����,�H"��
[���6�hl�4�n��V)pEع�xT�>:�	�fx�u�!�9���X����z�����ܢP��U�0d;E٣ԂyFI��vX�R�M�mc�>
��UܠyR`b֭���(o:ס��T�>�]M��›��+q�Y�5�0��'��ą̗X4�4X�7`l'�9�C���ۘ����a\�4��TÜ���Mxs��Wx�<�ˤt�0��`׺Pk���E�,�M7N�V����
}���f�y�r~IK�g�x�E��g��W����-r�Q0ΛD`ʸV�7�"��_(�9q���1�1�`�k�G�~)�:>�ke%DN�EX��NI>t#���_�Ҙ�!���b]���:*�UR�{�x-(��5P���q&`����ʖ����؆5E���,id���G�J�:\I�H�m,��93�ZJ�,�#eh�oF'�w�#���5�eJ�+%�tM�8���/D���'�#����
#���q�h2�W&��H\��e3RWq�C��\�]R�\�>i�%.��ôG_Ci<b)���y����@շ��H�~�?������`�#V��Q��<�=�g��ᰖ �GP&�m4�}&I�O�	,`?/ �D"1�Q�v�s�܎|-��$���A��g��_��*z���v��	��:¶ ��t^b�
u��V�ɳˊg��	zo03!ސm�*A�13�߹�x�F"����-(��_3J��"�e �Yr��|A5�#�
�6&ss��8��~��e�vD�Žh7 ڈ�Lђ'�Yr��"A��#Z�}.�v Ϣ����j�|.�T��e��H��I[��I��b_��uz īt�wۑk!ȵ��Ղ\�E!����\�gO�|��閂tˎt7�x?P��*��%��m%���v���8��������>��x֎�kA��ֱG)7�z�ސ(�B{I?��e��v�d�{��!S;r��j%O+]�S��V+nm��O��yC�Y�/��{\��d�[D��Ĕ�;�T�Q)e�u<)���8w��/%�&����$��%¨��-��A��g]�K{_45o��;��׊|���Rn���a���e��٬
���c�f%����c��TR�=9��qwύ���y�=��,ԟz
?��nPU5�����|���|��L�q5<���:�(A\}h��Sp6�@�)��~��-�lIw�����y�+��+KY4���j�:���a6���!��M4���P*�m0[-V6���#+Ƹ�ݿ'��hla)z�L_���Az2S��)�.6
)x[�����^R���޹<���������1,D�
�ܓ�ߔ~����k$T��#eS��)��s��Y��eS|��O!."?��^w���ᡶr�[�%k��nIYb5_��ܓ��O~%{O�/^!Å^�����z���΋ҧ���XP8��z9_,󨽛.��U~�������	��9#6��A`�aA��u� 
��������ߢ�`4|w}0R�+�c�VG{��QA	7��~�c����7��������`����#�|+�뽒~�s����[O�����ă���AoM;�q�w	}q�����X��Fi�K
�1p�Ȭ��gJH��ȕV�3��)�_w��:�ٻ��4�1�8=��/�~�{K:D(�{!<q��ӛ!�e�K���H#��ܓ-���ho>T��6���=��{�����v���J��N��:�8:���`Õ2AJ��9��3Q9�y�T�uZ��j<�c<_��o��:���(�(�ӿ5L\e��*���@o���Y����yJ��o�I�W���Z̨%��is*����'��	�_K��G���O���Y�������.�hVCX+�gṜ�E�Wj5���uI�(���<7�ů���L�ќ�{�#���J�{�%f�����	�sa@T{C�gJ���t~~�l{�o�*�X�惴�9��M�
d�'RF��V�N:w��Φ��s'��t~���;	�I�XB����$�{(���5y�D'�;	�KhS�v����@ߑ����$�+��NBw�=�ЉzB��;G'�?d��wҹ���t�s��!ߧ,Ş���Nfw2�Õټ�ٝ̾w2����E�]֯߇�f���2�˼�d�$��*�Νt�2�:��I�*�|��w���$t�y�I�NB�H�ȼ�$t'��̻NBw�FB�E�]'�;	�e�u���6>�]g�uҹ��]�]'�;�\%��W�]'�;��e�u2���?�Wą
V�3o���~��'�]I뤇���w'�g ���%���"�����!;j����w���t�٠�[�sa�H�2���y/Y�I�����x-0<?�㵨1��5�o�m_HnS��i�~*�
-R��;�GY��sJ?`k�5x��5m���5�q׶h��>ڢ̘��-�DBO��+�n$��Y����FF��f'�;���߳��K
��	�����`J���gj�>~v$��z����l@kꁘ)?A[�h���'�ߤ�C���Җ>"���jP?�͌�GX��s����r��<��/&��k�9�3x�fX�F�H
$W�3��A�$~|;��d��ߴ�G������ߝF���^��F=�ǃ����mNX��%"`M�B�~3��_ ��_���=�h�<�
���;���O�H�/��8��󜍽�Vo��;`m��2-|;:�38�p�t�����J�}�F<w�sz�����p	�7!ƴnA	�.1�2Q*�PB�l\�h_�9�S����X_����޷&���Ni�'���5"�//�ٗ_G,�6��W\�:R{NrH��x�i�/�C��#�
y�'j�+`�H��;刢�u]��(���"?I�����K)��y&�F��o4+M9�$�zc������<�爃_�	�Y�~U�)�}V�~��-����s�*|}�_����^�;�e��2�5���E�Z��6�}�a#ߎ��(�ȼ'~e��w&����y6�[���-=�0a���tF{Ѓ�k��b
à�~�&�[��_��跎�[�"oI���P��RZ��D��3z�F���ô��y>�[���sz7�6|R쭺��2�
�-��D�w������u�"�I�ٻ"��pC;_��~r�����T\6�=��.~��`b�c�0er}�p?K��V���^����*w�ߒ��j��,������,���,�n���n�~�݁�B?ߙ��mk��g�<��@_~��*�췔�J�m�eE��6��KҮ���;�Q�Elx�Q[ϴ\�kSf�*G��+f�R�+�Lv�<��q��+F:vD�~܇�����63Z,��QS��>E3*2dj��B����]�G�m��)��!�	�k�g�L����o/��F���,CO	k��+j�~��5�q/��$녶���{V�
������-��!�{Kޚ+�I>Nyn�^��~��w��ԷK���3�qy�Fv�X铜(����e礖��U�Am'޽��xun�_�5�y83���Pņ���u�s��fJ�@Ɉl�����2^�$X�
�(�ʧ�*���u[Do�
�<'L�lA�]qBUn���Jl_��{�G��Nɿ��o��zϵ�q�6�	�	\�>ږS�qF�}���k�%YDI�5I�E-'<���=�������#�nJ��kn��ܑ��>H=��lܭ7'�R"����֊�V���0)���X{EY�/R�kwwn떷�2�|�5��D�PL�	sz9�a���Ŕ0���f����qpE�9�b}'����w�
��%���O�ق��!����S�/$��D��״�u�"��R���X��i�������'��%Rw�����Ɏ�nY��~��[?A;�[v�Kaͷ�j�/�o���ӡ,�9y�Di���B���O����fԺ+��h����w�g�'g^���|�]�*Գ��Q��S���5����4�݌�u;E\��Y���,���5Q,����H��e��g'��!����}I��Y���Nx��~����c�sZK,a�$��؎�_������ڛ�ʷ���}X�,�3���i��8��h��q��������*��w��2�^COV��q�����U�ZS�>�����;��)*�I��B��c%�K�w�*���)}�LY$��$vK��=�c�=H��S��:;�zϷ|xi�hGr?�vJ�5�h@�F.E�(�uI�L�D�|i�m/�8��I�{�a��/8�	�T��j���%��z�!�(Nt�F��P��UOı���+�
mj��T*}�e��6�v���@����!���o@��OZѤ�g���U�d'���dG�!�|�g��j��3�ϻ�?��I���^](�bs-m�U(_A���$+Z��C����Hh8#K%�9����kbx��n���t
D���^�3Zs�˼��4*��Hď���5[/��յ��A�����Z�ی��8����F�*���=���o&^־1�ϡ+���ht0�����C���M���d"�ѳ���=��'�Vڨ��ש� O־���E�����wף�}���qw��p_A��%�~6��)>sn�U�p�_!���	y�����ݵ@�GI@`���]�0lF��H^/�?���1��xxu���Zm�f<}��v��ߞ�a�����`n?vC(�����L����{��P�wA��F�!\���r~F��S�+�H�aLo�_n�G�s�g�����g� ��/��h���<����a�o�dͣ�>�`����`�>ߜO����wsxzq�G��=�y�Ǯ�x�W�\ϧ������������}�$�����J�4l�VKË=��s&õ�z�-y
x�&�Ki����B�QcY���؃[)�J�!`�����$�O���(���:�gċ��J�ZZ�ZI{����l��J����\k}i%������1̴�f�4�J�Vҡh=�5(�%�zʹ���P/i�Z{�6�@�hc�z��_��/���]_��Ԓ�����FMO닫�����jP\�uWk�k��v�6��δ�3
����i}aLm@:_�
���<4YEs��FF�~$���?�|UJ3�ؙ�'����g+�x6�O:Ӕ��=��L+A{Ji���c��WJK�4����ZPJ�|�G��@-��j�Y����<�.�R�%O�0U(�Z��u�	e���Z)TK~����4�`�Z���}��4RJ�VZi%hA)����O�L)A�Jɟi%_+1����VZI�ǗZI�K�w�ŏ�j%��ܕVZ�%�%h%��Z�@�k��aj�QK�V��*%�=�i�?ikJi�%�B�I�)%���0���x������R+ʹ����V�K�������O"����Ks�$#RK+�o�𓶠�fZ�k%��'-��:�QK���O����RZ�Hn���QZ�'}S)��g���?)��'}S)��g��f���R�g.~�gJ	`r��o*��|���H-ʹR`<#�H�$!b����`Q��Vڳ�V�i%�̢Y4O1���g+���Js��f�V����\�č���O�`Y0>9�^,�:׋3\�O�q]�7>�)�j�����7�.�W���B��m�w�\�x�o�sq#��ѱp�;3�H��t@Kѓ1-E�Лw8%����/Cq9��kz������={:ϨttAN�����3����+�y2��P�O��ґ�_�z���-}N{�ԇ�g�?��x��]Rf2�{���g2�����l�E�-zi�)Op�gZK��.�����-��'�|�cN�ɓ�ٯ'�D�	�0Mޓ!�qFOh��z�ޯ=���р��٩�/{����@��S݂�٩����.kqa�����0ӆ.�Mh�W&�\^]��*N����مm��������=�;$�����������|,�L������B��9=�
	�f|xF�c@���g�z4-��'₯�/
�@�}
"}���
1����3�mE��}��X!�7`.@�7�'b
=��t�����Cr�Mhj�H�Х9�
f�[6''���)�w�O`��S,ퟠk��$�������c���&מ#�#t�Pk�-�m���q�9%��/��M�y�J^�+��}�ݹ��i�s��ι�'�_\(�������b�F�HO�`b���h3�!]�����O.py� �3�wF�tb<C��������0�=x��ǜH�v]��t_���#υ��� d~�7�����3������	�x3��H"e��#1��J,���<�V������x�}��\;�Y;�1F���F���h�����&�M::�Ǣhi���H����ZH��c����}����EF��3�C�;a�G��L?f�Q=4��`���Ʈԃ�M0sB?H�0F��@��YmE^�����X<�i7\L�)���`b�<6%��[uR�Ve%hQ;�ȍB+$W�������*��~q�-���MfqmE�d�,kߍu�#�WMg{�m'W6��%2`���c����*�;<8쬉Y\Z�nMpiM�Ԛ�Қ`�5��5��YrN����4k"ؒ5!��ք�k�	���5mɚ������5�ݾ5����5�i�'hkMx�0�Z�&����D�g-�	_ST��pM0�ڴG�g�Q��=��
x�ؚ�;��&t�Dm�	�HQ[k"��-�	�e��N {���lO"���JgM�KkB�&�B�7=�tL�V~	��˸fK0g��	X%��7�����l��qO0��4ح8(Y[�P���(��|�[qR4�H���b*�
U짰�G̨�x*�V\�f�
��[qV4�H���b*�
U�h*gn���5�yN&�Xn��J��<�'���u�p�_j���#�n�1p�*3>{gWt�b�N��I@��b�pp
�g�X�%���#�(�3|G��3	@�1�	Y��6��np&nNǘ.��gp!�_LE#���`&;h앳�3�\�s3<w�2bh0
G\\\��w����F�;F܆�m��aF̆����YF\Q�q����̝�D`��AQu�N�g��t�z
b?��vNn�)������5?9�V��K�fTՌ����n2�x�j1?��ۘ��.}�g�����n~����ԟ���g��Y�$���V0�O�d#��b�[�Ӧ��n$�7����i��!�y����wji�J
�BRtn�&nP��u�S�/r�~�BTyBRQ�@�GIy$ʶ>�dq,��z�%��bq�ȸ\M�,+2��d�mF��NU�e~D_�l���&/c��E�6����rԠ~�Ӧ�����ڎ7O/���>u̠:u�����qa"������N9#�cO7�}�d8��+:"U��D�P�	3�
5s����ɵϤ\�y�R��+��?V@E�7�^;	�
	�ރ-��77>~B���	�}?v�Wk��r�KM��Q$f[$f[,���dç8��z��(l5
���}�F> 5����q�DY��N�D�(��uc��1�Y?
Č�o�H�kI{���䰌6X��$����4�l`F+�E+e*�����Z�R�HT �Y�y��4&����T�(��8	ƒ�㻵������Y�{�@-��ܰH�+1h��n�����ׅ1J�A�|� Ŋۏ|7fu��iP`���@qc���5 A�ǐN�a�:Pf�t���+2M"�S簦�Т'1L9�n�������&��k1��^QS6	t��9�ϛr��k1��ű�t�D��S��Oc��2�Y[��5:�0l�	^���s��Qe}�}�
.�h����
�e ��,�TL8�T�P��S#�q䱺<��l��^m��ņ.�t�U�X{��
q߀@n��i�.^�l��~�J��FA�u`?�u�kc��Bļ��u�;��a��M��O�74G	�h���_��O��Џ���~<���x��V�ȳ�_���u��ƓgS�ʓ�l�U�<+��7!l۝gJ�9�^�~��RrH'J��Ϣ��GB���P�Qrt+�N0q��4V�n
���V|�J����
�2]
�LJT�F�A���a�=aaQ
 i��)���2��)�AN�p�q態2��E�QSm�"�֮��Mݱԅ�c�T{8���n��Z������dw
�z��ʭ�^�`��p���L�l.���8Nv�;}��2���J�Q��0��+��㑜�^?t�ث
a�;�������`V�F�������s#iW��9���arNB��Lx�C/�N��~9n��yo�X�#l�5F�E�,���f7B#�	�Q���F}�Or"�N�8Cn:�"�L5c��z�-*���}�'<�p#@��hBX$K�1׍º0B"TS�A�\Ǐe����B�6΢(H������:)��(@'L��E��Qج��K�y1�thZ+�(j�1�,
|�0c1���qB~�0�(���uת"*��:��E�N����,�n���t(����X�}��AP�0���x
&��Y�q
0s�_x�{�S�(�3��p7N�G�{���|/�	��F ��L�`t�]S�u�qk��P�ܞ_�;n�NQ������"�.`L:��Jk,[�3X8�(=Q'�b]��l=EM(�fF����"#1UFs\�\P&J�(��5��T�5�Q��}2�x��x����,�-n<��h3�TuCJy:���&=ɒm<�޸�c!O��<���0�1��(O�7�A��b�vz{QlBѭ���(j�k��T)�J>� w؏��QC9��GAvĔ�R�s�KX�PC�9rG�	�5ԗ�A��y7U޾N�b{�Z�$�۬5p�\-d��&�Ic@��֢'4��HB79�R6�k��
��ˌ�t@�ԃ�0��E
���q-���`LA�\��Z(3��sef�v`�Ie^䏩�\(��,N��P��F���’(�.誨'QNv:�:N�
@	�98�	���ud�y=��L����:�ġ��\fn�J���q�37��0DL�0u�Ÿ�e��D-����@Z��!��a7b�*�C�H�
��'ҌD�Ni0ɑC�Dk��uJl�����d4�L�A�I�+T۩G+
Ld+ap_�0`;x�����s3��0�c@CC�;3�����e��� 3��U��)��Af�i<����qf����A3==3��w��@_J�x��[�$��E�n7�slO8߿a��o`��T:������0j����#�~,x���/?�|�֡�G�o u.�X#i�`���M*����)Dh+r5YF�k�3���/ru)���_�m5��T����18`���P�3d�,���.��QR@���3Jt����[u	�LxD�C`�;����n�׉�V1J��2���XLn7HY(-���Ы+ǹY��I�q(~���Z:Oސ&�sQ4#�����Z��4"K����I��:i�ՠ�m4�$t̒V�бA�[���n��魤$�l�L�j���Tc���Bͤ/��df�E���c���e0��n�Z0f0H]��~a�r�M�2��]�va�r̨��v7J-�\���`Fn���&�T,��p��.�V�
�^�ϝj�_�n�X�(��S��Q���dmP��gmP��OimP���k��jm$<����wtJ��>���_(&�l�3`̨B?1�ن���Q�6>tܟ�ʕOz�ޕo)�|fP�@���Y���,���r�V�V%3ا�����c���d��}��>uj�fV$a��0K�(�e��Gz�z%#��,6�##��IB�
�##��	��##˅�셦摑r�(��5����x����<ҳ�\�eba��&�F�Q%FR��(�Fj�e�H-S�L�]j�i"�L�2M���Q���25��D�M�*��ڥF��R�Ԩ���.5*g)�J��J�R�r�R�Ԩ���*5*g'5L�*3���X
���d`�R
�%�N�:!g-Lc��rƒ�����4��d��sƒ>�m-�Rc��]S��P��)h<#ʻ�A�ޠnoP�7��T��T
��T
��T
��T��T
��T
��T��T
��T��T��T��T��T��dB���voP�e ���稔_�\��{ܛ�~����I�|���\8�y�_�x �c�����x�E����7�=�E���������yd�����(<��)9ː�G2��(C�$C�ϩ�A�Y�v��i��cX��9�Тz�!�u���F�������彈��!_�0������_��HɊX�W��?Q��D�6㼌��C���G��t���z%�]ok�]^�uE��0���F��el��]��"��Нi�]�]^�5Hr{a]o[Q]O��k��A]_��kW��1]_8�-�T�tἯ
�T�tI��qUD7a
��yU@�6*bύ�΍��EɌ�ZJWGs��� .�o�Ӫh.cQ������/!�,0\�%U��@�uG���h��Z�:�k�1Ձ\k����Υ�8���Z�]-���Ү:�k+y�c��Z�:�k���C��ڱ2�k����VvC}��o-|�n#z�m%x�w�EԵ*v�׽ň*b��jy�2p�x��¸m�D�
��"�c��ڢ��B��[�ڢ��B��l#j�ܭDm�K-��Q�z�l���Fu��)�Q[kUGm��:jk;�Q[��T����%A�Z�b��q�![;Q[������Z[�S��Յ��ZK�\��2�b��}7?�Q��?���21��3�����g���������~�8�E�
:����~���|�o��(۝���owf��owf������(ʪ�0-�W��Yg���i�z�9�������[?Ӌ��!�]���r߿EM5��8w���z�h��b�sD����$�yK��2�[?E�]��Ɯ��C�x�A��g��f���dž�.V�N
�}:���(ʪCC�V�u�rd���C=ᥳ�KՁ��V�
����X���Bk�Y�j��>,���T}X�����Pk�\�a�����B�ݕՇ�Z;OKNª?���P�n�j����BmITsX�-��j˾5���N���B-gv�Y��LYj)�jN
���5�Z��sB-�P�1��:��PK�\sH���Pv�U#�ecg������m\q�����A=��aazT
�,��8�N��q0�/΀����
�q,h��SA��B�r�����>�:	��HPی��#A�ӳ���N�>�:u���ϡ�;
Զ#5��ڢ��4P["՜j�15��ڲo�i��s��0P�i]sh[sH능��9	�R��j�j��SG5ǀZjƚS@-�t�!��C�1��p���]���4܋�t'�v��muݶ�n[]��n��V�@��B�Օ�����ՕA��B���ՕC���t��r`�mu�`�mu`�mu�P�mu
�n[�V�����ǣw��OE�d���w��������D������N���	�beg������4�Q�g�q�s�������p�;ڎ�a��pG������xy�z�K'-��Z�5�'�q˚�K�2�F��*U��V�<~�V�՜O�)0�\��E����|O
Jj�9)[��[���2����.m�#vl1m��#�h9�;�`�3���Y�Qڙ1�f�?�t��'�,q��5xz;{���i%���"��^�HM��5�"�,�VQ�Z =��"�AīE�"�^3扼w,k����j���i�9w+[��e�K{$�TW�[U�V�ǂ��3$���1B��@�(<nYT^���G,��+|QSqU^����̭�b��[%��@�1jm#���ۜ����N��'�x��J���w��w[���<��:<;ɣ���h�ó�;�t��W�����k�Urr���*9�����{ּ�fɇ�n��b����8b��sovG�$:%q���p.�D,O�p�[^��EK4t
*Z��SP�M�����}�`�����˴��I^�%��%Z���+�D-o���<�ɍ�Մ	5hz�=���D������=R�#�n����c�sv���1���A��?��IG@j�����K��q
zr
z�qo��½%hѥ��J�K->�;���d�*���4�NA���2�]k���\ü���)*t�(ib0��.�g��R��@\]�3qs�+��f l��Ł�L邦���=������vhx���ܥˈ������x���p/�G+�_
��jM-��k�m�$��єW���ܫ�#���d7����[�����h!�Vn�L�b�m���?u������$;����\�݋#앺�7ׅp��Ԇ�Sp��Q=�i��7� bn�+�w}�6��P����e����%�m�%)�;�~\�RP\�td) ��Bђ���3/͍�Q���-�%�/�l<��e����y~��D���lO�P�0fI��wc?,�Df_��t[G0Y�^l@��0I��b�6��� @���[�b@td�ܹ�.��A�5M�qY�> �0��w�l���ܳ�Kc�Q�(�>����2'����1��1������Ht5Q��6�Nr�0%�L	���Fă�'76��|�%�akI����k�L4B��|p��u�Τ��|p����н�52t�3����6���o�|`[1�V���m�|`[1�6���o�|��1���6�Eе5�i>\<�"4��e&#��d�G�ًs�2�\�"���b$5�����6�>}*#S�_����Ik2H�(�h��)��.�x�s5=/ܞ���"_�zW�z�9��}�X�?��t��'.`	-�
���vXT�f���<:?�����#$�'ٝ�i�:?�s�Ss|A��3��<��nr���|G������)*t*F�9R�6%T������"�q��Zt�M'�[���/��tS���ǧY������T\4'��!Y	�9G,�F�u������(��,X�4^8�W�
W��(�š�����S]\��*Sy�@�dy$�#Y�ru{�v���w�K�"oC�ږ'�#OG���j�����;2|ނ!���T���=	)1M��{Rr�p�p�p�p��ǖb�O(��X��w�$uOSQ�q|:�'���s����H{8�V��\E�&��9Ha��\��#.���u�}0���W��:�1�K�w�,�C��XX�C<�G]Ǎx����l�Ү��
��
L�@�8.`���R�H4-��GS�`%���2t�eON�Bh�	k7�4L�|7�!���/P�ō|'Uu�8̭�`�:^z����3�g����%>s�u��`t>����U@(��L��xpK�QP�Dq�n��Xx���u�&c��-󽔱�Ճ��#�	���8�Z(���N�{n6�" U-�f��hF����>N߭%wt��w��o):������:5�{a�G0W+2�ѕ���D�2�	�)�<��i\��6�*�
��]�;Q�6�)lNK݉&ȸ�&�+�S�4=�o��r2=���|�.TNmF}��������?SmƠR"��2X�g�qj��̩͸�a���B��'�rj3�^�n
Lhћ�E��f�
�'��Mh��� p��0Qm�
�he��30��/{$ڛ�1���e��+�cV�6�@iNj�3���r�W{�V����e�%&I���j
9+ �9	�)���'b�
���.�����"���4�p��(�p��jO0Ѧ@P�ua��#��ot�E�M�L��q�X��X�E<qKD�,�n��0re�+>��P�d�&y��@����䬻ĨrQ;۹����Q�ƙc!x��`��%;,����5�m�VpRcFdh+���"��ׯ~����vj��z���I�N��8^��J��@n;`�����#�$�19f$߲���%��V�\��'�lk�iMf�f�۬�Sզ��U0P,
�.��_(w3l��/��
Nj���v�/�`S%h؇��qC����!L���!�'��"tȓ�*V:��F�7����ܝBÝ�v{��;��$�$֙��j筍�$9�����m��n��^�ĩ1�k�75&{����P�I�N򾿒7o�;%�kB��B
��K�5����5�kk�+5�f��	�[ݢz��^3�1�m�W��F_i�[������ښ�~{��0���-|��oA�n�_��:�twꉭ]�J=�t�.}�����n?��	#
�	�I]�R�RM���%�锚�+����
��Y6��j�<]�A���T����E�JAGm�B]���/�U��_��Zr������Ƞ��Y�VГΩ��^wD������9=s.� ���*#/�-5F�Zam�E^��\]4�����n�,�����HU�{��hț�� \]?[U���C��ji�-#�ohe�V&ݳe�9�d
ָ��Tj�	�.=�C���qv�j��& Z��$����g�<�����<;a���2�辶r~tՂ��].G�4�r)^W{^x����ٜ�c��~�닛;~ֽ��y�5ȓW y@�t��V�����>{�~�=�C�q'��|^��R�p��$�n�{���	"}e���N��2E�%����\�����~?�ȯ�v������pjR�YadWTm�"q����~�	����8=�-m�0�Q�r��mt����N�xt]<������1�
�X2�^�f3ɘ4�:ۓ��pZIFeP�$�2�V��]�;��I�߉d�
���$#��G���\@��2ҽ����kz{�vkf���,��eҳo�R@6�' ;�;�Żt�V���7_Y7��"��]Y�|��ʺ�xT�ne���k�ʺ��x�ģ��h��2%Z��`X(�.��
��jG�[ �xN�f�	�����9NȜ���8��T�l%��T�f�hb�����u�o�X˫7�~';����FF������1sM:FI༅|�m�#��t�/���hQ�J6�����:߉�N4�ND�Sd4��OT'.G],��B1q�57��Fc���Fe4��k{�|�`̆�J0��~';�����!
�Q�(��-��4��V<�5���h4fc��pli4f��l��Fcُ�}�ܹ��P,�:��k�HLf/�Db.S�@	xM��k�y؀�N�㹦o6�u.Մ
j¯.l`���cFؠ��w��'�<%��1�XTΉ�b�H����LM��f���E_��`Q�J�����H��zfjT�Z�j���z�n���n�t�6W�m�9�����
��-s9��H�6��w��U��x�z��\��M�I��>�%`�.m�+�
�F�t�sc���Oҭ��m��aw�;����sM�~��f�1�ww�{P��vˍ���N��Ƹɑq���N�)K<W�7�ʲ�̶.��u*�Z����̊��t'n_�p����Z��;�
�wj����s�
�_.;ډ��O
�@�I���N"���3��A����P�ۊ�
��oE�:ߊ���P_���?��hj�-�ý��	�MF}���"�Ar[N�G�
���yq�^��f��ՙ�����g>�n,~o��^���)��'��m���~tz��OO��C���Ë~�&�X�\���s�~�a򣼡�O:�=�;��t��I��>ϓ��{,0{���GA?|7��ؘ��GY��ȏ������'�x=��C���#��\a �)L����ѐL�3�G�?/�+�$�RC�쑣���@�M���Q��v��w�$��lV�I�
�؉�N���@p����Ru�:L�S�h�6������`����s;�~�=@�<���B�c�(}���u�<N3=J�k(���֝a�\�A@�OgnX�妖U�����Qٻ ��C�t��FN���O.Ց������G�J�)
��̉��c��@�N���c.��\�[8��\�&|�!.�Kgތ��g,a�H'l�(+g����g`.�Y�r��:���
ί'��꬈���gՐ�t��9+��SZl���KeZ�z�@ʳ�`۠�0�Y٤ۀR�v7?@�L0�^�����`@%�N����Ww������~�	�(ønm`BL��P��a��d�'�Z���%��40t&����&�5'�>6����/$���o��|���*�I͢Z0��q�!q��1Ob,��"܄�g��+�����F��S�j9O1��z`J�	�9w�ªy���{�`
��q}?�-��W��iD8
�+�N��v�_d�W��~��	�r'fH>�����M�&����Bs��	��u�a
׀A3�L�1\
��bh��p
44���U,1�k���\ԷK����}��5��B�G\f׀C�Ă��\��
^ˬ�8h�)3�k��u\�����q�c�����qQ�J,�hh�w.g�x��2��\j��@C�؂�-��{ys8��>~�C�G;�fɑW�v�<N�Ɛ�̇��G��#|�]��]�tt���'��#��|�1�"���<��C�|�G	��>`2���m���
��r���.+���o��$��������C��)��'�K�>Ȝ��1z�j~Ɯ�ʃެ��w�[H�#��>�#�i/{�w����=賻�������S�
.4���^��hU$�4�q��.�g��&��?����Lܜ����f ���b*9���x{y��r6�s���s3<w�2b�l����x�X���n&����po�[e�+m1��%܃=�ޛ�p[{����;�v�'��
���Q�c=�8��`�lq��3��O%�2Va���'�~�y-~�)������rC��1.0��<�!O`��L�?
�N1���Ís1���n4��g��]�~{KG}W�h�F�F$�%*�|���H����2yl��/$2���S:������[�G0c�_����Jd29k�א,�>��I�u*���L�<@L�g�3�[\�b�p�ec�UO�p)P-�V[2(�*u�[
;;��E��a�^�[�0��bs���E��Ѣj�"[��	DO(MO�T���<o������9M��l�����v������G?�.xS���`1�訲˰��~��B�O9��Y��gd�/�cs7��D�������b|Q�1C��,�e3�3w�Y����L UMsL�I��l>o�ɵg�9׉�D{���l��$�d�xD�Mk��0K�/�Ya�$_&�Q����h�^���	b��]I�+#��`��^�j%pf*�j��1���"�+
�o>�S���u�v�c+kј2_k�{��5�o�K۬��-Z�>l&2���B�Kl��[��V ���, ~�����:fr�����ʬ��I$�,���`ѹ)=�E�b�h�g����#��������y�W�LqGA&�͘�R^�4��V\ig=�%MfT���?R04�DNTM#tO={i2?#�����'֓�Ћp�U����K_biH��9�������O0��`y����:��xov���c��k�H�*��qj�G�ƱD��,$�1��G����/U�������#Z���Y�����hlB�/��4��fM�B���M
�\��)`�W`~=��o���kb:0elp
���\�� ��H�*ƿ�5�;F�qwD�g��􌤕�;��m�+ ����bݔ3d'#�G|v���GU2#OR�3��[�H�Z���l��™tk|���'	-U�$E���D3�_l7�n�2T��i�,ģ���%��1d Q�0]��m��:�j�69W3uhr��e�J\m�й�%�pg�]��$�x$�>��٣1_����Wr'���k�/i�%n�6V�)�s�]D�(EOVEhf1H��n�ז�G$w�
XW�5�x�b�@�B"v��u�2I�h\<J�$��D�Iq��pqN��"R$N����]Z��pѥد����J<i�y�` ���ҕ0-�X�iR�`b�`|[�>L��|*�����I��I���,�kc�����%+��)eʕ#7�!7A[�>B ��)�!�t;����VjJ���3#G@�ӛk��+�	:M9��u�/rpՓ.�j":�H�,ˈh�.��
gL{���z��+@ym,I����>W���:�Fmy�Gf�
�贀+��G����X�	rlg۵����D�gg)����Y���eK��9k�Xh``ګ+D�<E���-hyⓩ�ڡ4Qׇi�8��V҇�fz�l3���o&9��r��4=�l3
�*?���,��M
;�����8blȍ��C&Ӎ’��Lc�Y��|ɗɹ���M&�DZ]ЈGE|*@[�p3r���o���5�[3��]6����ɢ|-�ǵn=�gH�Yn��T̢��bU����`��!��ˉ����%ty�*�Eo�IY���p��E�j��p��A!5"��ƪI�P�\�!]]�����k����D��z��MZ#M�X�8��5��<��^}�<]�As��/��_�}��}�_�	���o��H���i�8�%LF瞶�N����R_�����nNQ�%�޵X&uā�Ѳ$���eJ37���H�V�
h��AY͞~[ۧ�Fk>�� և��G�H�OQI�:��:����H,
�M����j�kh���&����ya0�XIj�2�DY����)Y�V�%{A.U/HQ�%<1�?�Ht{��m��>�%���8:�U
\vn3�����n�����'b��g5�
��֣e����
����!�)���3J�F��*�zo�-hs`�Q�t��͓C�n�w���Gyӹu_�:�9�hf(�ޜ�(�\�3�
��l<��&.d�Ģ�����c;��W�ސën��6&�o�5p�+�$=�0��4}��-)�z�<�ˤt�0��`׺Pk���E�,�M7N�V����
}���f�y�r�����j��^B\���
�ȡD�8o�)�Za�L�:~�`�_��yL���8$�`�ͮ)���t���-�9!aAB:%�Ѝ�K~Kc�(��uiF��WI��)ⵠ���|x.,~�	���Dl��e�Bi�3�aM��-/KY����ҵW�%�<�~K�h�L��*��H�����ݵů���H�3�i�B��,}r�_]�:N;iX}rY��=;>��W�����Ͷ���x�yWk���\�o	
&�&�y�R��#�+��v�kA�/$�&���(?D�"%U�;��#�Lv��a��h਋��<H�]V<kG@O��x��)�l�W	ڌ�Y�Υ�;7��u�mA���Q�M�q-��˒������n@�1���ĩ��$�/K�#Z(�vD��F��e���8�˒��	�E�Z�sI�yͯ$�T��sI��7.k�hG�X�4�Hڂ��H�(�:�Ю�!^�sмێ\A�EG��z�.
q�m��z>{b��'�H��[v������?W9��ݿ,�ߎh+A�UG����Y�,]<L�H��eųv\���=J�i՛��D�g�Kb�	���/k���$��c����ѐk%W+yZ�B���Zqk+<=�xڧ����|���:L%�x�~��F��Q�[7��ҹ�I�s�x�R�iBn)O�P"�:���1���M������hj�V#w���X�=��,Ji��t?����Y	��5<6~�լY��-7t��"��/AO��y\��s#�Wsy�=��,ԟz
?��nPU5�����|���|��L�q5<���:�(A\}h�L�Ud>�@�)��~��-�lIw�����y�+��+KY4���j�:���a6���!��M4���P*�m0[-V6���#+Ƹ�ݿ'��hla)z�L_���Az2S��)�.6
)x[�����^R���޹<���������1,D�
�ܓ�ߔ~����k$T��#eS��)��s��Y��eS|��O!."?��^w���ᡶr�[�%k��nIYb5_��ܓ��O~%{O�/^!Å^�����z���΋ҧ���XP8��z9_,󨽛.��U~�������	��9#6��A`�aA��u� 
��������ߢ�`4|w}0R�+�c�VG{��QAI�r�n����l��w����<��`��V�#�y+�轒�s����[O������}���AoM{�q�w	q���
�z�X��Fi�K
�1�ȩ���IH�+ȕV�3��)�\w��:�ٻ��4�1�8=��/�~�{K:>(�{!<q��ӛ!�e�K���H#��ē-���ho>T������=��{�����v��J�޴N��:,8:��v_Õr@J��9��3Q9�a�T�uZ��j<�<_��o���9�'��(�(�ӿ5L\e��*���@o���Y�P�K��S��}#��"]��bF-��N�M����>�O��Zr���t\�?����2W��w���[�<�YX
a�|L���r.�_�mԜ��%������ܜ�\2eFs�n�y��/�(1����G�[�#��I�Q�
͟)qޛR�:��,�|Uʱf�iMs^ӛ(�H�R:�H3�Gh��NBw���n'�;	�I�y	�㝌�d�,��NFw2�=�щ�cBW:����t�;��I�H:'>�	�逜�I�NB�:�$t'��#	�g)�����t6�>���osv2��������d�{$��Z�ٝ��$�,�MY�I�NB߽�.�;μ�z�ά��@:w�w�t~���]f�u���]�]'�;	]%��6�ѝ��2�:��hǮ3�:��I�.�Νt��q�E�]'�;	�e�u���U�~e�u2���]�]'�;�mcU�E�]'�;	�e�u���?�Wą
V�3o���~��'�]I뤇���w'�g ���%���"�����a�=�j��Y���W3���A}���Š��e���^���㵝�Z`x��kQc^Ck�ߘ۾�ܦJ��T��@z��e-�)=���Q��rk�\վ���9���E�<��e��Pl�&z�^Ѩv#�?�Z�-72ڴ7;���NF���_jx|L�ůP=W�m�]�ɳ�H��w'�9��_�
V-��(�9|�TF�=|��pKDR}M+>�ԛ��40dJ��3�cmeD��z�8����W���;N�
�&�6B�oωM=V~�|=Vv��%͸����{}���z������5�@Ȁ���W$в�'�ߤ�C�iK?=ƿԏz3���9�������<��LyT?C�j-�/��+��=�����7�k���m��8�����G�MK���W�+�$�U�=��/��I*i_�̻Yܺ>�^�s�od�$e�OP��7/�L�:Ϥ��7����TK�Lo,[�\y߾�����5�3�ѯJW"U��jُ�����W�b�^��������K~g��,ÀY��_`���/1a��g6�혫�b��{�W�{g�1�^���`���/
qQ��C
flZ�^J���5y6�1������3�w��Y���K��X_��xi;��5����f}�g缠�O��E���ϲ�ݦ�]�TGj�ɒ�n��4���|qH�#����Y�fw��C�K�?��z��m�r*���>���J^��o^��'�aYᵺ�uΒ��}��u��<����A>�i^Q�0Q�u՘��J�w4�v)�Z�e:Y74�^��h���ah��w�ON��7���&��}_��/�L�|o�L�n�g��*�!�V�DsoU�}�;"~+G�:�%��ѡ.�%���D��g���Z
m�<L��_�ʺ�6}5�ӻ�j��b_��e�}�V��cu�Ǝ�Lo�>�~I��G~�Xڽ�Ӡ��M|7�{�^��|˝W��Jt^��+q߽<�J�7�J|��-�Ry��\�'{K����W���H:��>P5���Up�ȏ�Rŧ(WE�L
Uv_�\ ���+~q��k�<r�k��%Y��!��z�~N�)��	�g���;k�~��5�o/��&+ör���}<%L�*Ӯ��w~Kx��w���z�b��S|����'}���h�Wd��(�6�=�3`�Or�����Z�I���U�Am'����xun�_��$�d���"�
;��K�g4����H���j�#I�&�3���20Wm��ޘ��^�<'L�lA/�]qBUn���Jl_�ӿ�G��Nɿ��o��zϵ��q�6�	�	\���S�qƚ|���k�%YDI�5I�E-'<����������#�nJ��kn��ܑ��>H=��lܭ7'�R"�xԜ�"T�|���0)����zEY�/ҽ����P�l�>��iV\G`n�XU��UEh�����H��s뷼��@	Fypk���tL�!�YCIFi{J|	�yA;@ē�i>�n�(�{q�T�I��?�W�5��߆e]�H��kE�7��x����-��>j��}d��#i�8{�c�[־�g��O�N���RX󭼚��-�"zbF;��y�����'s���¸��b�j��n��L.���O�~�_�H�ޮ"�j���kZ�zR�/��+�w"?��V�Gk�.�Q�93�9�{��T���֚���}��]b�HӢdy|T���}�%ٹ!�]1�B@k�X�9�zc��5���s^�3����7~���1��HQw]�H�ܥ6����+���2��?�Z�E[\��_Q�����H= {��#�q�B���&K�w�|ix/�8��Z�ս�0h��?��d��q
����p���b��>�b�;�O���"!�!$�_H^@��f��B2)��~E9�hO'Y��N�1��ސ|�o���H�?��+��Y�T��왅�1}�v�����h����s��G/Ŋj$4����rd��6nOл��R��I���g�Y\��*�Ow��}���|�b��g��fԨ;����v��v��$�d�)$��SH�}�Ų89-�����6��9l�FU'�;)��I��Z
�I<���Ż���Z�ی��8��(b�̀d��J}k�=Z�f�_־1�ϯ���bp���]��W�JW�l3���D<;�g�'t9L{�5�Oh�$��"	��}��x�����rڑ
����]���c�~8Ɲ���}1�~{�/yc�g��<�W���cU��W)yʄO�w�d��Z��#�7���t�ݻ�ƀ�������G �8�_����[K@���<C�O/p��'D��	��Vx��3���J%G-�\��=[�ZI{�Xi%
�B{s��>�������J�fZ{��V�k%_+�P����X�i��fZI�u����B��@C����Z=_닯A�ZIî���gj��F�ZI�������jcp5(�ֺ���5�s
�\�Zg�ؙ��ZI�´�0
�6 ��ԂOGW����9�Z
#��
?W�z��t�*��V���BQKڳ�c<��'�iJ�מZi���=����t�1~R�+��V�EZI{-(�h���#�k���M��C��z�Z
�j)Ԓ���*�P-��:�����Js��%?VKЂR�i0]�^��>~R)�@+������|��'}���u��ϴ����V��y+����K���%�;��G��SK�J+-�w�����k-h �5�O�0��%_+�P�Ӟi�4�@���5�4�L!�����J�V�Jie<[ѿdtji��fZ��J\+�%~�zJ	ZX�'zj	��9~����V�7g�I[PJ3�ĵԋ��H��%x��'��O�L)��g$�SC�(-𓾩�Vڳ�|s���^
񓾩�Vڳ�|3�O
E)�3?�3�09~�7�R`>c�Ih��fZ)0�K�J��L�TK�(PJ+��R+ʹsf�,����Jڳ�VZj�9WK�@+io�Z��J�V�F�\�'J�,��A/p����.�'�td���LqU���O��!]��tX��CtH	o��߱wp�����e�G�x��ߙ��@/�ߦZ���i)z+�����L/�2��)�����X�`�ٳ�S�JG���B���Cw�?�J�s7OFS���^:�1�U����iO���"��'E��ܷ�K�|E�<&c�x�[�,zo�)NՁ{?�*�[�'�]����o�-�o�-��޵�'��_ON��B?`�d�G�=�e��{���ȇ�����'έx
d�9�-hО�z���H�&.�q���3m����ԁ�zpe���ե�����b��b�^� ��������x�Gw�{T���>]����\��ŗɱ�38�_6�O��7�gнӳ!�܌�^c���3��M�������	Q�<�@zL��Xx�н�9�d2L�ʔ�y�����xs�&����w׃���ˉ�S�Q�#�8ܜ�6N�l;ݧI?<��e��@d�;||p�`7��axߋ�6��>5I_њS���(��ı��t��G�n?Jv�2w����n3�^z~�1v{|!z~����
�L�-n��~�[�O���D���2����)������Azg$��;��x0��OIg�'�P�a�y�89I�9�8I̅ZO����<�\�=��A��o�'�#�g�1L�!T�ǡ��f�#48���`�GbP��X�W�y2��=/��'S��ǹvx�v�c�&�?�&��
k7?M�{9�ttF;�E;��>g�$Q�ᵐl���l�?@��7�K��������2���G��<<��K0��nP�7��	� �X�`L�g�y!R�c��pM0��D�G�g��9�XؔD:n�IQ[���E��w"7
��\���N6ks�D�Q��cb7�ŵ��	���}7r`�	d�^5��Idඝ\�l�g�<��A��blpx�B��T��!Y�ǧ��1��|D'\����!˅�u���t;��6�V`���#3�K3�������&In#�[jt��q_�:������.�����5��[VU��Yq$#Eڌ�꿏� 2�Y͉n#����?�SpS��)��)������.�bWL�_VU���·�)H$�LQ�?F���������H��V��")+Za
�d�h�)�:k�)<Ҁ�ݠ)��>�g
KɌ�A�%�+�J��Q�0%f�j�)�$�V����F�/�nLȌ7P=S��v�����mreS�6�S�,L���5��ԖBRS
i��`�:&H�h[c
��>�5e4"�a��T0��-*v���T�Y��T��&F�s�U��&f�Y���`̢ae�D�-+uk�ƴ;j�
��ĸtγ����ļ��#����Y4������e��y���/>�bc}c�˻���u�W�+��D,�\�w���2��?=|n�f�`���7_ۗkR�..�����k㽼x
Ae��?��.��o���z�..~g_^��@�xo��ŕEMWvR.޸�ߙ���.>8���C^;z���禗oL����[܅b�\����
�	��"�����uQ�Q���yN<X8�_�s�s�pЪ��d;s���eؑk��@�Нw3�Y�ܦ�y}���ȇ�BBB�d�2wnm��`8�M>�`�7�����S���:u]��떍O��%�԰��ͷ�e�����Ư��H��~����c*|y޾��!���h<Ҿ��}}���.����!�����������:���u���	.{�̿ۜ�g����ƈ~�3>S������ט��	N'Q<g�~ƥ��̉T���{�_���v�`����st^.��񤥷/�ʆ�-q�3մ)Zz�헏D�e�kY3�຾y�8:bF�}N���s������_[�������2p�5�fY�Fľ`�^���~���9�	�1=}x�F���Ɔ�K�"É��>,3��ՇY%Y��	_�\��^��y���z�?�o���-��M�Q'������oZK�謬	�IP�iX�ww'�5͢k��nSn�i�6�r��|k�]��w��>)0��y�xG�� ����^W�IAA��w�.tn>�:L��}m�|wJb&yY�ͣ��=>X?���i �a9tݎdX�T�9�E���a���������f��>JkBqI1�P���p�!N�N����|D�tXs�
����LD�J���h�`��\O@EFTLԬ�B;ũ�%PQ��D�@�j��.��q�ӁF����*LjJ�ߊ�r�D�:5.8����KÖ#LR���R�
�1�����&Zk�t�i)��e"b��)�8Y�b���M��h��Q	�eϕ�m��A`��h�	�!��Y��Eg�d�E3cd��\T�/[X%�C9g3��,9�R\��daV��x+o�V��
'�m�{ņ��F,�Vt/��z��q�b���Y�\ؼ\�v��J��Fb���xɵ@�
���3m�.?fc�L�%����؊����q�>����E�3���x����|��I��Z��J$��6�Q��l��Š�d��i�d�$%�U�Bִ_�B����j��i�4�6EN�O���3k���[��[Ņ�8��^��pT��D9iMIVZ㜶[{#�����T�iN����6IA��r]��Km^��BLZz�-;��e�ф��ң�0	��p���T��Ul���1��h[�������}k� �<���+�z�n��lP��4 ���߼�q'�y�0U��AY!"I,B�O�f�p�D�X�9�w1�#.�:���� ������
�TL�>3��^g��T�������'�1_Ƥ.Q��=DtkADd�gTyPh�R�R&�eP�`��,P���
Q8rFc��z���2��������fV��N���h�l��`~B��x�����2�˜4��ߎe����&�ɚQJ��H��0�J��7AD�<��Qĵ�	,��Z�L)�o0�ż��(�%�0֯��sO�J�{�J��wލ�Z�R�8�5�$��wn{�l�0����(]1�s
�ޏ5\V^,+;+-2��D��l�,�xtb1`�B \�ѥ#\Q:����aEz2��*�Є��t��D:�*���Jd���D��^��sF+���L�@�vT�P*a #R2��.�7�:3ݦ@=3݌��̓���t�fI��
Ȥ��^㪑��}��X���Ъ/�%�ے	��yz��VA&�'x�xN�DcI�̨^��i�`��ɤJ���(���,@"+{Ò�F����
���`�AU��)O8�A l�g�ˆ��m�X��
�^�,�o �)�a�rG�x�
R��L�fJ�Tb4UhoDm�dG�R��|<�n�i)Q+�0O�8��PA�R)��t3X%X��P|2�
8��J}ɓ��!Z�U�<��<�-�0h63�S�Z�c�jv�������i�=2�,	#�4TӁ������L����
 �?e2*!�8S#2]\�2ٛ�$�W1���"�cBq2ڙ�p1����=ea�9C��~�J�n��0	G�A�S�U��5�����ֽZ*����DxJnΑ��eD��S���q�@FKn�r��M�+�N��u���
2����- {˜6'[\�J���-Uϰ'��n����	*bv��Lщ��a���"�4@r�BBG����L�x�W._�̴�X��t2��L
�O��[[�SDF�Js��,�L��^ur�L4li
lX)s��<g�_�N��i6:M��:etL���4"4[���4����NO�Y�T
�-%+�3��!w���`Oa��{�{�:oNT��(o��(veK�>�"�#�\?nI�������A=v���@o\�	�U��̡��@Mƈ;�[Ȳ-gj�t�Y�e��)�ϙ�F�)��ZF�Ɵ��X�t� �
�H�1�B2�
���7��P�>p�Fi<���U)Z�h
�5D����;�oJ��d��!v��Ҟ�����I������qz���y��'~(G��PCw�S��%o�!k�O�h��	��1��VM��c�����nvz�k2;����1OI\��$=��8��m��8~J?e�O�S�Q��h'��	e5S|Ȍ	V��	����1�x3J�L��a3J�`sB�a�l�3��6'�z�c0
f�"����`l�(��r #��ęQ�Ǭ��A���l)���}2Ӎ����L7Y*�'3�d7�Of�ъs��t�M�>��F�=����6+<3����Q<Ӎ�G�s6��� �
,�@&�*�؉��Vk �zZl�&1�ɔo�`ٔ_)�8Nf:aJ���x2��U*�'3=^0�*	Ȥξ��U����7�L��c�z��[�<�cN¬�0���Dzm�(�0VI�/��%�(��W�$�����(�r�.za-<JBn�
��aM�4� ;V£8��(�
�&S*�B�f@R[hT��C�R���b��Ш"5�F��14*�H��Q3�64j)��F�H�14j���B�&H�)4j��B�&@�-4j��B�&8ieh�\�;S)�&h)�L����d�*u�-%��NAM�R��+�e
��T��'`)�ݵHb,���H�ims	H��
�Q�~�Ok��3ҍ޽g&s�:ڳ����=�h�:*۳�f��YG�d���Y2{��<�=�h�̞u4Kf�:���g-�ٳ�f��YG2{��<�=�(Cf�:�'�g�T���	���uT_z�q��
�ƅw���_�6���Ɵ>?\��e�v�ʛ��~�� �@ڮ��������w���=����g\s��߇�/��i�f��S�&[��x$i}GL����>Gk}uǡa[qGٷ߬�c�_(�X�|��cI�
;���u$岎�7�7(븋�]?	���Y���j��)������f3Nj����ߗ%���em�Ƥ#�9=�e6�M�#��5�f<�l3�4��KS�$g�����Ni�7uJc�1��a�q�曻�ɬG:���sH�����Y��G�ew4w��y�͝���ʒ3Z8�Cѱ���R��%_�t�
g��+��ϩ�D�M�z?����}q����@f?4�۷
��cǨ�\/���uTf�*8��C[U����#�.�j�,���'i�]�b�]���w�]��=е�z�]�1��?�J�e�s��]�>�j�e�s�FZv>�j�E�s��^v=Wᆲ�l�x�[���&ng����%�3wN��-x��q����Y:OL��ǹ(���9�*��K�f#o7�7�s��f�a7�7�-�͘n�o2��[��7�s������j�,����h��\�`�����w��\����͵;{��\/5��Z��l��˞�Z���i��?ˎ�Z]��g�T�n�*�P�e^m�8����_�D������8|����t��ad�?�0����PQ$^s�Q\h��u��wφ��mB��mBE߾�>��˃>�(ϹT���Ru�)�x�Rm�u�
s�AK+���2�$
��^���􊬦jf+?wNՐG����+v\[up:⭵U�G�j��]���+��5U{����O�f�h�dr�3�^J�xX���J:[��<�R!U�IU�IU�IU�t}Y*��7��*�����X��j�]U�ZK�r�j��r�j#�r�j��r�j�r�js�r�j��Lu�r������(P�eJ��j�
��.�B���[(�Z��
T+w�\�Ԋ�[�S+e\�zj��-O����ک�z�P:�R'*�V��B��J�0W
l`y�A����8ކ�*gĖ�2�Q=�ʥ2eRQ�t�Z*ߢX*wu�*��R�T�E�T�I��V,�C�\'�6�g�Lju�r��ڈ��2���Y�eR��ŖˤV����r]]��ڎ*�ֲ�P!�v�
R+WL�Bj��-TH��K�R+�u�>j+��R)�
�Q+�n�8j�(�F�SG�Ҩ���P�RK
�V"�90��lR����z��������0vƓ���T������=aoO���^�	{#*{�^�ʞ�7KfO�˒����	{Y*{�^�Ȟ�7OeO؛��&d���y2{�^�̞�7KeO�Q����5aoRvZ&����+{{�uebQ�L,j(��<���<�(c��F��8��s|nr�q��>¿���˽���h�қ�1�l�Y�W>4tw�->u�8�x��,s2ȌV7�YF�(���F,)��Y-�FҬ��u9��a�+%�!����0��|�&���I`��$,�[+�� �7H-�ߟ�7�qҎw_j��@��Ӱ!$	i�2�&��ܨ歭<�8�Z���!/Y�#�O▚y�*[���Hj�L�n���ŧV�_����	�5p�V�M빐j�	�Y��B(hÜ��#��
���b{åi�Ѻ(�7��o�j��`�&�gh=��h5�s���4���!��u�S�ሉc����^���i�J����Cѐ�:|��Z��B�t���k�FH����R��f��T���*!M�����fˑ��ҡOHw裾�>z^�]I�J�	)	̸��JB��T?�I/9䌴�J��HK�5
���Z��HK<�QpNKTb�9-Q�g�D��`FK4�~AK�f��оN��j�+�&�MNO�'�DO4en��{��m6oC�Y���Ю���r��q��np�
���q78�ǵ$/-��ÍՑ ���}�5�ύF�=yz���{����h�;��=������|m_�A������vӽ~m0���k�wq�>��}y}e�5
^.l0�����ˋ7��Cﭒ���p/�]o܇��}�p�0�Ň���ھ(a蹗/���1�B�o����[b�\����
�{yE�5/OV}f��V'����Y�y�y�5�3�(Rd,|���>)�u�P����F��1�;�lP�Ky���8������f��)
� ��<	��;@:�'�V!tO+f�]���.�;\�6<7����n����Baڧ?q�y1���TT��xH�'����H�,�%̤
D(��ThB��<�
L�	�+R��
��4f}��RW��'T���!��W
sEB�1.Y_�Fc�a�@E&T��8d��j.D���p���-0QkO'T���
�4+��cB&E�>�L�Uso��KU���6����mBF
Bِ�é&�b�%��*�F��&�X�Ȝ�MM�s�P�0/��*�������Cd-�C�џ���M"kh�%�������
��2��ٰ��`�fA��$�]K`X"i�����t�
��a	r��ga	t�qa��6X�6�%tXB6�%dX�7�%xX�7�%xX�7�%xX�7�%dXB��%tX¶�%#A�
K�:Xl)��uS�n�	LK>�z�\48��ޓ�^]=���o��s�䋷��Õ�l�M�ť�4T����\[��ׇ���Խ:o������!��6�	r��tɦ��
�W�;A� o�[ܴI��ʢ�ϟ�@X�� 3���,��^�u��N���7v��a�_�	xqe&���'�ׇ�kg�ks���`_~����omE��߽cz�w�������el������-+�}�ƍ�½��x���]�Z:Q��x!��M�\�Α�"G&��N���>9`�o�ء����[물˜3�߬>g��S:�~B������v{�KnG#�x0��\��_��/��+��ʿ�s�����Ӷbu��9����/8c1�&7��rrgSp���>��95�⾺~�'�+�7�9���[�Ƹ��'�cÑ���>	rj95���AN� �f�0����U�'!F2�2�C��:Af7cbL:�M=|�2��*��*�r�EG�=����>8�c_\I8�� A�����>� ÈxSA����F\JStɿ��*�#c>q���(Ul�$�KĜ���c���l�I�)��%���T�C�(V$�H3�0��r	@-&#�����#��Ra�B*Tq��R�	�i��dhBF"֗�#�"�X�Ȱ��&���ф(Y������a��Y]��2��<ޙ�9�"\@-e���������;K62 �����_�TBe2,Y}Z1$��!�b�
O�0��a�)���>�CnG�����l��h���/P�ϐl�t��I��jW��U�#��"���*UֲcR������XKS�p
:��	����t�i2%�GӠ��ɔ��0��F�l�ͻ#�Ա�佩ޢ)�+�DY.B�" �9�K�&�Xu�PF2sQ��>֠�	��;��X�t��uǹ��& 7"$/ޯ6�Ǻ�LPN{2FsɊވ��R�8�"C��72!��H� Ȩ�/�D>��iCƵ$�50`�1[�.�)��ޚ`JPk�KV�	���FL�2��QŠ��&�B�:�-�:S4�h"��{vS���c�۽^���D��mX�-�22����5�.|2�!#�h���	�C9ܩ�S��E4گj�S~�4��)�B��la�-)��-B�-qQ�l��5ړ B��Ѻ����ǎ�֨Q�uV��4�%�S�D�"��t����u�i�ē�;�0+�y%|�,�o_���o��	w�D���	m���`�ٜ7�}ퟒhק��D;�f|J
�N��O�\f�Yo����jE|���&jE<���Xն�}K\�̾�CK����>�@�1)��Է�
��9�>�I�}N���?�mX�#m_W�h���q��V�u�b_��;7-	1lx��vΛ���)�T<��lOꮥv-�� ({� ��#�Ǐ!C����i>{����Əy��@�KG����p�(Z�
'����N�Xp����]��%��܁f�4�s�M�܊��r��3o=r`�z�����Qb�GE�G�WW8pԴ_:p���y�r}��X(}��a�>H�W��Z����:�{�7
�YJ��BDw5���O
�{ʗ� ��޵�>;W�z�Jg9�✃Qo�rOzuX
������'�Д��V�ʇ�I��S#F<()�S�#N��t��Y����gub�sJ�q�>�%@�'J���+m�"�dY+�c����P�;-��nF��E,��X�2�r�Rc�f�!Z��Tќ�.VH�l&�y�B��+V����h{FS�\��� h�D�z���|�H��a�Ϯ�v%�c`؝"qB7N2�b;��$~���F�q@>f;��p�Q�NՐ;��	c����rw�k"�:Mu�ox3TD^z�ac@>ݲ��Þ��%���(�����=oo/\�wV,���O��-��~p>��or���bT��,���{�߁�$ȸ-�c���0�p��5��_z���Z��}�{���w��4��-Ew>�K��B,>�E�>��e0�T�g�_��Z�p��w���-�^��B�"1y4Zzt�B
��
���Ѡ��s�`4�b�l����?<����v��:�\h�&���]�,�'tw��r�ӕ�(+w���.�ᝡ�"��4\-r)��\'rã)�N䎆�$rG�j��15�ܶ�?����,r���q���tE���ả\";�lM��%/Y-y��V��&��N��g$��4r�I^V��Eɻ���*y����佹�׻��%�+y�psF�P��|#�j�۟�I���L�vF�F�;T������E#Ï/wGC)��[�Ղ�zք�s/�N��x��e�OT��=����Z��$��%��J"�1���W�0<iIB�/$1��_�Ѻo���\%߇�,�G;̌|�헌ȥ�Bv����u�q�;#�y{Ɲ�;��%�'/q��D�B�̥}`H$uU�i���U�3���^�@iA�V4_��������*rI�Ƚ�l7!�"��(r����X���¶���T�	rã7���4�[Z{QɌ���$pۺ�����{#�ow��K�O^�D�& �}���
 �w3���V��!��r��m�ÀΒ�?>�zR�'�X��g�ո2�8��,���Ŝ?}��'?Ջ8�C	T|�VN&���RN$Y�ȕ�ָ�K�zWn��%�G��ʪ�\Y�kwK����e�L\Y��C�oV��qI�.21oG7����ǵ�`ָS�GofY{�)�T�_�5;��۾S��NUY��W��(����`�X�����5(���^�� �=�,��2:dߨ?�J=�j��c�zu���a�X�I��K㷆��I�؟�qe��s���ys�_�}��{͇'/`O��H�>�>`��Ҙ�g��E(����W��PeF{a�P8�L���M��׶�Ӷh�mU����2<:[��Էϖvq�H [�� �-Y�ā\ɺի��ZD�S��a��1_�Δj�E\��zDs��� O�����~��P{��G�P�\oh�&�j��J}�R�������e���Z�}�]ǰ�J���c_י+B���a�;,�q�C�juFyG(=��0'�jwE0��#�as��;�-�g�!�����[�w�hN������2��������N1)���u��Ɏ�2�c4tHuD"�|���i�ȸGD{$:)8
7�k�?��I��둶��C���=��$��xT,��b�I��F�|�43M�f|�l�X�u��$m%O{���k>̭0c���¨)W�E�e��%�F�T���K��v���"�)/4`�����#uLN�K�N�v�x�%g8��#��%r�؝�B�{�B�/b�`K�1�w�r��*���}��I‚��X<�N�!�JF����b�1�}&����F���b�����5��cc�
���*I�B/��[t\��hXg�¦�C7떝�y�V�Ć�rB��R����RJ�u��ݍ��"9�=JǻB��):�\v1�����qP:쪳�KsZv��`�g�V��67��nKy�HPc)��^� �c2��A�1�p�9+U��F?%d�Z�@FI)u�lddJ&�d�U�a�
�*P�pQ
ұ���eƙ�A_��[?a�ؼ�/�B��0�X0�j;}���bi��H&{��ך��pLTl��13�uԫ���� ���G�1^�j����d0!������{E2Y�PC��p
�ꨔ�x{����urG���OU�!Kc�߰�	3r�ff�j��-�s��T�oY8������ A�2&��̀�5���ԲX�@̀�\�(\�f0r�o3H�@�@�M�p��A�e�
8�@Π��Y�ap����km@�:��́�9������@΀�ay�l���.P3�x�s\�@d\�\��0�����tQ%0�?�������e���s�ڭ��[�����ps�����8�ڮ��]�e��y����������0���ξ�Ɐ���`��f_�������?^B��ᵵmm����⷇����;+<���ÿ�w_�;����K����o�6����2a?3�#�����~�-����δ�^\� �[S<~�fw��zx{m
�o���H���=ڣ���mkBSx�]N��0������Qʫa�johl�U�&f��n�Ãs����fd�,>�Op��3]E�1�T	�яj�V��2ڃ��-����p�
�uy��Gp�odl`�d/�e>�v
9��]����A��ݩ�6�����ٞG�ÃT{1�H	�Q�l�H':�iу����ŏp�a'D�:�_�_�C��EmkBT���~gx���!�0@�u��`0D0��.���V�����dv�23���sݥy�祕(��K��(��C�I+Q��[n�M+Q��S��gѿ?�,�7�D��<�J�o9MӻV���!�q����^�0Q~v���Qe�r�͟�mkBT���~	nx���1
 A����{((~6�9W}FU��)��u��==�~��?�9+�m^[S�mkBT���~�Hx��ѱ	!DA���7h`b`�i �5��̓���o1$~��֖N�a��)�4�`�/�ĐVlb��9�wl�peECs���mkBT���~��x��ѱ	@�쿴��)�CЁz���%ᐾt����]}0MN�/�mkBT���~�	x���ǍA�)�?zr�,��@E�U��?���O�ϖ~���������-�$����������I�������z��#���7x��z�F����o�$���|������I������������>����_u��F����o�$��z�������I����H�����r���������<����_u:�F����o�$��x<������I��p������#���7x����F����o�$��ݎ��Wm6������<��_��#���7x��Z�F����o�$��\���W-������O�ϖ~����~�����b��ymkBT���8�x�횉m�0]HI!)$����FR�?6�c<lHٱd��t���C"��+��RJ)��RJ�������kJ�߃��L��_SU��n7���s����s~�u�U�-U�yy9�c����/Ju�z?��i���>>>~�sm��+�v�u�Ց�νY�u�8����uN�?�WP>�1Js��WiV���_uK�E��ϸ�/r���ˆ_�gK�W]ױ���EY�cl��,[��T�YH�T�����������}x���L#}A� ���G��V�7���^�}>�iҞ��-���i��;}�LJ���X�&�T�P�3�T�#��ߨg���J�l e�'�=��?�͘o��n��a����|7��>��?ǐ�U�%�;�������/�m���N/��I���f�Qփ�z{��<�d��6�d�n�;�����Q��m�{{�5�$���iѦx��g<�$�"�^�%=��RJ)��S����t�e/�֔� ��a};k���_��y�?�9Ԛ�l�z��}m#��G�Kk!����k(�9�G��1�����z��,�Q�&�l�iV濊���#_�<��3�Ξm$�^9g
�{9&�w�&��:˙�u��f֚��R��:ֽL+mW���W^���z%�I���2���lo���Z�f?�k4�W���-�#��	?V/�c^��!�!{u̵ʴU���ٷ�A����Ge>G}�?����v✽��3��X~j����{�zT��A�O^��ʰ�>��?s�y��|����G)�P�</1�1~2�ў׆�R/�7��Ӿsm�sr��"�(����2��c�Ϲ;�~�u-��)}����<�U�1�g��:�a�p�b�5{��3�(���k�!m'mʞ���2��.�~[�)}G�κb��XE�L������p–�aԃ���7���7��Fy�0�@ߋL?󞕹��Khi�@=��RJ)��RJ)��RJ]M;�;����j7�]&SmkBT���U�x����i�`�Qqqqq�����!��	�C�O��Ml�S�$I�$I�$I�$I�$I�$I�q��O�9˵w���O�o]�s�s������,�Խu˲<^�0��t�c�}�av��=��7����_��{V9��z�}��ٿ�^��s��_���y~�?��}e�z���۶����������@��w��E՟�k�$I�$I�$I���@?
���=T�� mkBT���x�x����	�0PG���:��8BGp��ҍ�'���#!9I�?�KpNN)��o������Us�l����{��o��g��p��19S�<��N���ߘ�9������{��<���l���ߘ�|��1�e�o�ٹ���������5�&��mkBT����#x���	� DQ��b+���lHF����c���T2����SY������b*Olb����wl�uB;=f>��'mkBT����'x���!
��ѽ����b�,�˄=�Ȁ��^���g��/��u}2��i�����y���O���?�#�?~l��������`;��mK����)迮k��4�NA�eY��v
����?
�S���t��i�����8���O����ቷw�@�$!�'5�mkBT����xx�흍�)��q ĉ8�D�^��>׻gI@��X�jjg�iЃ����`0��`0���?������ϟ|�:����s��e����Q��3|����ӧO|�:�2|�����.�}��;�7e�GF�����O��6���_�Q�v�������]T��]�^�ˮg�{>pj�z���k�u��o{�y���ye����?��{�-����x���/D:��3D��&򈼹e�^H�y�i#/OG�z��Ϫ��߯_��~�
:�sMe��#M��3Y�#=�2��Q�����Й���[\s=E��8�}E>�Gȩ�T�ڲ��T�g-��}�����Vf�������o�SVw�zV}�.�/�>�~�<Vrv�@>�!?�U���������1���<�#�����}��=�F[ ��~���QڋB�N�.�.+푹^ed��Lo+[\�-��k���
d�W���(}���6�q�$�#�?z�6��Bө�i���?�L���7�!�3�O_Q}Пu���o����[�=��tk�ȋ��M�����!'}/�Ƈd��r2��_�C���ﲨ�:������`0:8�����o�=��+8-�4}�۞�c�ĥX�dq�{bU�����q��©ή��m�!�ƶ�g*Ϊ�U\z��[��GA��=^�+ru�{��LV���	�U�?)�V>�ғ��)��x��|�Y�ҁ��gi��\�yi�^c�U���o��*=�����!����T���Y��?rf�g�����W��s�ʽV�n��*�V��X�#�=��F���ϫ��+[���F�~�yH�\L�~��[���O҇��h�5�ݵ����T����o��w�|Sf���ӟ�+���)���;���F���;:x
������)/�OS�y��U���o��2��e�)Ve3'w���gGg��=�J��^��`0��
ľ����u k�U,�Ks���ؑ5�nY�,��bXw{���w�&����3�Qה��N��Qev�	�]��Ʒ���gcH��˞��i����{���A�3���I�8��h��w��d��u�w���UI��W�q���8�����I�>�+���@��p��Qş���Gc�Z�����\ƪ����U���ߝ�]��/�:����3d�;ɫ:gB9�R�����|GW~����w�2��;�fz<AǏ�ߊg��_��l����y��������=����U��y3=� ��[�6_��3]U�_�����k�]���]�ײ�2��;��j���->��t|�+�i5���n����Οg�Z�Y|<�1NyŬ|E7�k�������?���z/k���>�<��=�Α}N����΅���>�u�Wy�d�ʬ���dz��`0*��\?W8�G������Y����:����Dg��c�g<��2+�������'�W��6��qn؟{�r�u�"w�<�Tk��.��\�r���n�O���>U쏘~c�#T?��+��y��{�Q��,�,^�qF/X�v8�.֩g��3}�ȸ�OP��~n%�hU�G4��(_��sn|W}Tg&x^c��,F�����ѭ���+�<��#+}/�Uw8B�Rh_�����|�33!m�r\7U9�m��({�ѝp���ve��w��[���x��G������]�߱?g;�,�n�ҽ�ow8�]���ו����b�����?��OV�=��Z�_�����#�ve�?��v��N_W�������r�YL���o;�����1�g�9pV^�G�~>�[_��v�NO�S��3��`0������Q����[����	veO\k^8֔��v<�Zbz����\��O�p���b�n$~�}���o�z�3�ј
mK���vU��]^�i�N���WA��#��x�딫���j��t��q��:���E=�
z%օ�q�)Cc��Y�E���q����yRG�-�+u(K\�h�P�'��*^ء��^���q�=m=y|K��vūe���\��rȊ�4���=���{W��1���;=ݷ��x��p�;o@>���Ș�T\Ԏ�+C��=*�ɫ|��G�JO�C��W]��x�1.��ﵠ9_E�б��
��V�q����)v�(��ʑ}��[G��w����Ǻ���{-�o��Sdו_˞��׃��2��;iT&�w*��w�����:�����g׭��S�O��s���j����%Z�[~_˯d�֮���+������w]�7��`0����]��k��I�u��+e�L]���ւ�oA^���;=GR��?��v쯱�;<��y�� o�$N�1紈=:ߥP�V��u��<�� <&����3K�yC��/�4��r�)i=��*/|Ύ^�]�Q�NН1q�G���w>ù{��<F�����V��r�2�n��lo�؍ا�|�m�o��'�qb��Ӌ��r�`e��ef����6
0�lz��sA�_������x7��췣*�U}��R�%�+���C�����_�	�ڟ~I\�Q��~�k�y��#_��jo~DyU���^���`5���p����k��o�?:��ˮ��C����w�������>?�Kv��:A���}E:���_�n+{�u��=����r����q͓�̳]>>��d�}+�����|L�����0���1��`0�l���e���g:��׺񶊝�`W�,3�O�?���]��\9�P����~�[��kO��W�i�Gc~�)��-<�w��.��3q�}��'v�u�w$V���n��v��(�r�����5��2���S;W���k�_�K�ϔ�8B/��h��E�ՠ�'�9�w?K;�x:�x�<��|@��c��Ͻ����V��y���c��@ۖ�Sw�8B��q���]��=��2�l�B�e6V}e��������R�(�������	V��e�ZT��4��ad��e2ޒ�+n�Y����B�����Tq��S����ߔ�<����[&�=�f��[|�����s�z�P�)G�����}{Zׅ�3���n7�j�p�W��wf�t��E�w��[ǽ�;�����`l?��`0��`0��`��{���~��������i`oL�y�>uo���i\q��K�|}����7��Svu9�G���쯿c¾#���>�,�jo��w{�Ն���ݲ�L��=�mW����2u_�����8د���jo�?���k��D���߱��m����w�>���#��}�����E:��OۡO;<���s��y����}�ڛ�k�}~����|�M���'8CT����o+�[W��������U����Q���r'����\��'�t�TY��w��z.D�=��W|��~q=_��y��M�����������Ǐk�t��bS=2�|�ұ�y�N�_}O��e��摽ۏ���tL�S6�q`C���jf��3�#��ܰ�?z�1���H�]�����\"�W���]����O;�2'@���@~tG�:�����{��u���7m1��Q]�PW�V�2�S���z]ϥz��s������3��]v�����xwҞ��:ڗ>�y��`���$j�?tU�@mkBT�����x���!NQPdC��� �e����X,��c(<��t�`z'�zK8?9�﹛�/&���.��b<�Ϳq���3�ÉMg;��z*��2b��C���|fߴ�P������Z���_�y��������Z�����y���5���g��_f��e;���2��Y��?~�Ǽ��J�7������3����i%��mkBT����tx��ػJ�A���$(�XZ��,҈`�؉�L��K�,�o��[���=�|/�"E� �xf�)�9�n����u���^��������pxQҟ�s��zk�\� �>U������8�_�F��r3��g����o���Q��W�g��*���n2�ܗ�_��>��Ѯ��*���������l6{*�3�|�Yw ��ث���L��]��̟���b�H�q�SϺ�����tu��ϝ�s�쫼L�q�SϺS�7F��#���x���o�j[���?|��Q�g�YV-��+���^�����]��iS��mmkBT�����x��ч����˙��MؠY��߯�?�L�{�d��m3`�d��V}>�66HV���66HV�^�66H�l��l3`�d���h3`�d��V��66HV�n�66HV]��66H�l��ri3`�d��V���66HV�N�66HV��66H�l��ph3`�d�~�o3`�d�n�k3`�d��Vm��66HVm6�66HV���66H�l�j�j3`�d�r�l3`�d�b�h3`�d���~���	�R���mkBT�����x��ұ
�0��E���C�q��C/��Rw�Xk��UU�����z�����"���>��>0�l���
�<�y�fK�mkBT����%x����iAPK��-�,��$Kȷ�"��L�$�IK~f!g��~\x,�"���z�o�_ϏY�4��~��0��ݏu�z�z����v����[(��ᄒ�5�1�Ag���k۰����J�d{���t�\rX����u͔lᄡ���s1���Ag�t:��Ag�I��1�M���fJ�w_�SJ9l�2����Yɔlᄡ5�r؆Mx~��]����ݗ���}
yB����E`�i��r��n7�r��2��Π30+�4�S��.p�mkBT����x��ױ��@`1��G��XH�������"������%�[�����v'�I6�߫M)m^�b�zkx<]6�c?����������t��J���n������g�7Ŋ{j��B��^�L�5�����gf������FM6՛Y=z���g�?��i�d�g��>/��ߝN�4�gͨ/�Eo��YL{<�,�)z��s����p8���J���Ѝ���W�X�n���wa��s�y�h��v�}Y�=/�o|4Ӱ�K��mkBT����ax��ѡ� DQ�����R.$p"og��3[�{u�U"��ؿ�s�-����1F<қ8���&��cjk->���w(%2����mkBT����8x���1
�0�@��x�N�x6W���	\=N��ĥ�-��G�fy�'�6�H�R�c��z��m���$�S��%�ao�y����X��V��Hm2>����u��}����c솽��c���wq�s�_����C�����
�mkBT����~x�흍��8FSHI!)$����FRHn��w��H�Y��x3��ꇤ����s�a�a�a�axI�����Ǐ��'U�{������o��_����ھg�W9�����������o'�GW
{>~����J��l�����o߾�����������)*/���N�\��ϱ�o��v�[iZ_ձa�JΝ�/:�����6�O�-���92b?�T����l�k�%?������_2����1�B��s��Y��5�>�:�>�c=1�����O�w��y�^�- �ڶ,��X��z��u��sM�#גU]�>H_���y�Y��v�!ۉ���_m�i�Ru�s�]�X�m�_g�)YY�)�m�]�y,���m� z�1��a�a�axE�ߓG�ק��o/�Y��\�k�6��x����j��gH���������|�y��u��.�������\��a�æ�M&�w����k�#�ϐ�$?�]�M�o��\��Ⱦ,�/��ڥ���Q�@��~6s?)}��,� l�����gX #�v�Q���g���B�����ٙ^��u�の�uh��m?�}{]��.~�}�v_��J;�x�o�gJ���Y]�޳�@��.�)��oqC����?}�>@�X���ߘ�'-����(�W�?���������������	�źv�Ɣ����O�ʙ�R����v�[K?[A}�?-�w����m�Ց�}<G�c�K���1}���u��x�LzަU��0�0�Pc[�<>�g\=��c��}�M�����ggg����	�DŽ���-B^��k_g?��F?���� ����v0||؎��=ǧH�P���g�s��/�hؑ�I
�t��~�{���n^�}���Z��yD������5���X���Wv��O)�"��c0��vY�����Z��|~�_%/�,��p\��ɹyΰ�Z�/���;/x����s��_��9?��P�ܯ5ݻ\�[��y|����č8�����g��ʱL{�?�0�0�_�k3���>��������z���_������\S��|<�)�b|�����7��a�a�axn.��t�a?l�^C��vk��ؽ#���~e���)��3<3^�����k�dl�c�&�jK+���o"e�<.�ʞ`���^(3z����u
���l�+6���v��<���ï�
�k7]�/l�c[`�O���n}���򚄫��G��뎱���zt��^v��2)?;Wm�r�5��o�c����Iz�?�����O�zx��{�&��!��e�z.����������"ѯ���
��1�����Gg��{+ҏ���l�w<�=}Gݽ��Fƨ�^�)�����zIp�G�����K��֜�{�{���e����G��12��ۭ��q���iumf��>�.���}�����~�a�?�0�0��[u���+�7�Svq�����֭�y΅�
�?ނ��}���X��w�Ŷ��v�?��ߩ�D��Zۓ�-q/�?߳�=��<��~����#������>���Fk���"q��z�r��Q�o	9��r�,��n�Y[;�o�:)@�-`ק-�7��({��߯�S����@�µ���K��9��֠�ɸ�>:�n�3��
_[�_*�mt�cm��C>�q��S���L���<�?�<n��ѯn!��>=���<�6�;��ǫ�s����a�a�a�{�xˌ�\�ފ��px�?0׋�#�5���z��я��c�]����x^��l�򼠕��(�f���:~����٣^l�i�n�59����W��~�\;�?v�n����6e�r�����UbS~v����^��UO7O(�|;+�S��G�4|?�f�����*?�r���W~�2�o�N��ٟ���S�9��~d�a�����և���mH�6��m�X�[��J����~�s.��y���m�4ٶO���|B��d���/�����b5��ɿ�y���U�?�0�0�0�0�0�0�0�.�P�~�*��1@G\⟿��K����rKX���s2�(ߥ�纎J���8���'>�X@▼�Q��Q�b���q��wx��b�)����_�K|���v� ��1��M�6ke�e-2Ǜ�5��9��?K^�E��~�9�ϱQﱮY��F�8��N?�~;:=J<�����-�t�ĒyNA���g��C��	\�N��X�K�s)'�^K�g\~��2}�6�}Գ����)��n]O��r�^��j�~�"��{p��29w�6��/�.�z-v�:�+����M{�W����JY��Z���굢`%��
�Ҥl9����ힶ�կ�#O�Uz+�U�?;��s���d�~v��N���D��7*.Y�+v:�ye;�8�}�~��|���+ÑޅN�9���}�{Bƞ#t���x��խs�Xɿk��S�V�/��uJ=o�G���<�ջL'����L��:�D]�6�j�f���gL��z�/�+ؽ[{����r��C�M�Y�q�~��[�{�y������y	c�zA������;��w���9��z�szW���H�����V�ax3���� �ף�OmkBT�����x���
�@PJ�J�K�D�v`�`	t�n̬"N�@�m�.�I>;�6)��/����ެ����R=�K�w̆�g`�ڥ���7e�l�׻���w�=S��>�va��QKe>�g�){���Nf��RW�lײ�|����3�2���g�7�O�����=fs��d�駱�OZ���bu1��Y���Lh�~��y��{�����mkBT����Jx���!
�0����`ę��k����,�_�m�����9g��w��c�|�w���Ky'J��轗w��
'�9OԄ�D�mkBT�����x��ӱ
 1��2��_�H��\��X|�n�3R��l��P��;�}mkBT�����x��ױ	B1P+kGp]��.`#�"6.a%�����u�σCny�I���9����O��!���0�<��cu�K�Vw�l���Ku��I�Wwa�)����0�.Nm~���?|�+5�O�S�mkBT�����x��ѡ
�0��_�7d`b`�R>)�s��6�Z�w��9r�E�3��E��d�e�~��Z������@l>��٤
!mkBT����x��ѱ��@EQJ�\�Kؒ\�B2				$$��r2�o��I'���~J)����ݯ�ګR���q�gid������!��m�Z�=���k+���eie���<ϭ��������C��8����C���a��T�=����[��*��xJ�Rq/q���mkBT�����x��ѱ
�0D��?E&t�ƕI�	�w��tc��U5���̬����ϵV��{8jFD}t��.J�@k7��mkBT�����x��ӡ
BA�@PB�����ڰ�AR�r����;��&yY;��Ҳ��n�0/�)����4��,���na��Y���o��%����2��݉��?d^���nax/`�7~<�$&·�mkBT���ǘx��ѡ
�0��?�W4	qP��^:�쥏�z�9�1j��3�Z��y*3?�n��{�x@��7,*mkBT�����x��}+��(��H,��"�H$��"#�X$������,�Q����ԈZs�>U{�	�.�.T��}6�ڳ�-��F`���p]�k߅~��b�
�
О$�wݓٱ����|s��Co���A+�q3��lO�x�@�(�0�a��+?�	��T,�_��7��s\���Ϙ^Bl1)�C��+�k�(�FyN"8��dPC�_9��>O0&l�4��Im+���n�w��G�rŰ����<Q��q	�	+����H�}����e��q���~~�[).�5c��6,�����m�uO���9p\��<//?����N�:��M›p)� �Ĝ-�2p�'�uKq`���_�����/���6�4<~��77S����N��BQ�����맨�uM�{���5�%.B�NɊk:	k�N��m�9���*�u�U�|2���%;������]F�aג)��RE%HWc0Mg�>��)/tih�f���	ѸX�>����E����)��<,�6�s4���5�z�b�?��J��\<OM%O#(7�6�:�=	���ӋYA��ƒH
���L�s6��M�X��BcX�&ǘJ�te�.����	3.je(��?�<?�-1�$p�O=�x���	]<Jt¡�Vg��`|I,<丕}�F�Qj]�o%[Pa��6�XY��<��?�Yoh�F��067ၭ6JF�G[�wv)��7?,�@w�
�nM�Ǧ�m��k>?���L�j��=���%w�Z�izFTx��$��kP�8�E��m�	jAO����ހ��>~������؆���B9���	�֤8U��KC�v�jb�L���C��y����;�mjP.� ����Dk���w��U�E�€3�ܨ�����8x�U��J��s����\���ɟ�+;}s�F�Q(KI��Xݛ�ƨ
�1��+K����dX�];Jģ��c�x$��D�׷���X`i� ���@l̏�rn�m$���^�9΄�zBGϞ�Q=�nf�k�D�e;
<���a�>,�⢞�j��k�0B�[p(��$���Ǡ���p�4n��q`�XƓ�	�vϵ���.x�Hn���or�J���5���H�u����뇗�f����a����[Z:><�M@J�9����$�q]�}=H�k�3����鲺t�Q�=�,	7���߻����s
�>��3�����6[��g���RL�؍����?�(�&w�.7C#~B{�]��
��U�W�7��1jk~�e�cG��r����D�.=��K�����@�W�DZM�0倐����0�\��x��v�q�NZ�>#�
����BE�	��)���&y�A}t�?B��Y�m(�WIp�ɱ���|�2�+��\2�� ��)�l�8��tl�@Z.B�����e񅋍�RS��ƃm>d�I��l���'N
a�dĢG3�%���#�)?��$s�	_5=��Y�BR#-k"qGP-�e�"�f����%֩-ϓ37�����8�M9��ϊ�,���_*n;H����EBƱ��cl�~����
˝[��/sa�g�IE2�,z�1�t�:�kL�������ș壋G)��{7�o���nd������{@r�P�>�k�w�k׽��#�kXfy��E���A��B�9�uM���4P=�_�l���gW��؇�N��#�_n��G�pp,Z��Uu�6ȓ��V��Ӱ��0EK�7*|��]�{��75F\�Զ��zQ��z!��	uH�>��up����T٣�o3P)���[�^�6�����` -�d&�*=�%��fY�<�^��ط`_6����|h���3ء>��2 P��q��7ώ����,Ns�j�F�=B���`�큳�C��i�U�)R鐏@L��Ү�����ǧmb<2FH�Rq��ùF���X�i�䎲�Om�GA�����}:�*��u�f�:@ʫRH�.��6���6�j���c�GOpO-
��6H����K��J��U���:�Jǃ�����v<gz���� �1F*qm�-;�
I�7
?��O�(Yr
�de�
��F�
�	�ѥ��r��H��a���ۡ�>�,����3��D�Z��E��Ʈ�qq���7p�?��Ȍ�K����%ȧ$�;�?�Q�r�6�pP7`�a����^=����R�_����)m���>�D3#£�_'
�I��ɭu͋C��-R�ne㯄����ss���L��<ȭ/��R)|Lt_1���<u�}E
D�zl��$H�+�N_2�scۯ-�rH�V.��������֏'���(}�o	��:]謧�6�Fhlw���@��z�{6�P_�?�
E����h���߹���v��K�/�B�"M��h;�����б�o��)gRm �$�5�, �E�x�(?�:�g�U뵅F�4��� 	���߹�E4��!��q?l���A����Yv��s:mR�(G��Z�y�Gq�+w0)Nz����u�Y�-�&����"�Y	='I����8��{��m�L/~�����!����.�B�����A=���缱Y��|z��:f�#¬oh�2Xj��ǼI|1��i3A(|��vf1���
NK���L�ͫ�.����?�r�]�qBS�^#o�.l�%z�⁋
��Y��~i�䔃P��q�u&7(��U;B��l zF�x׎����M����,|PfV�֠�k��'�N��b̔/�$EN���
HA�i�Q=�u-/T�QAD9����g��W���%YZ�\���aԥ��5�O�jr����u"9��B�zp�̬�vl��l=��ɸY���y�ܾ5t�����mE��z�+���M���>�L�k�=�rr4����/g��E�r��~P��nB�[��\g[{����g��Y�vR�W'��
{Fe�m1���{�w�L��;�7�&$��x�c���0����n����&��u�@5sC�Cձm��8H��ef���t��<PJZ��@��������4�K|��#`}a�kRN�'�~IU!�k�W��L��Z�D�NK����̡U�������;��g��L~a(]��!Bjv�(�f������\��B�}�AuH�R�����g��M��<7�O��:���[�m6u�v����;3��=��w�w�n��������3pK��M�������{�.t�"��nt�?��di�b�C6��=��E	�����,��ѮO�
���0�h�v��G��;=��MV%����ʪ�r�����4�H
8r���K썀�x��A�:�2
�e�.���ݟ0N<g����'�����6��%��G�1�ַm}�^j�n�ҽ�S�0Cz���LX�3���U���M;^�^~Xc����a�vGHu"��
1��kN�K�T�?,���r�=�܎�X}6CBW6ۻ�F��\�3�m{4!]9�ử��J4n��5J�s�w��^�D��h����z������8���P�]�z���1�x��~��J8#c�%�Ͼ��cF{d�����o��@w�0�QsP���_́� ?3yB2Đ{|��5����}�>x{q(a���тa�?���Q�%��l���4�ςxmWI׆�G�C����1���k�Q��3iJh�,����K��R���������O`���ʲ���<!�[��Nw��a����Z���x�\Rtv��^ZJ��a\(��Z�PE���� 1��ޣ�h���y0�S�L!�y�QP̞�#R@ӱ&4�a�9'2��ċ�I�E�8X�Ir��
4��*y��b��˼�/#�
x����;�2R~������O7��h�՘U��^�k�
����(侠,���2���)�C�:(ِ;�Q3>��4�)�%���b6�B8�\��p�����e<��S������+�js��p����%<&t{3?���|N)p7b�����?�a�i�D�Wl����X���Z�>;u��)�ko)#W���S�n�cR�x�{[�sXv1��95�_��0K�����ՙ7�>�Tp�5���ٴ�l3�S�"؝�LX��睫[�5m�����Q="u}���pϘ*x�b�Չ����#iM+��@�Z!�	��Ϯ~j��Y�ݬ����$?5���mt�u�] �%�@��݅:4h8ۃ����tu�3�;�
ΑO�1A/r����
��R*5�����i�&j#Y2:�$Z(a�d�@�>'z
���L�����뇶��6Z��8|`�6�"�X1�_�z'
�F-���я�?��X^�A:?1�;��h/K�VB'��vOn�FS���Ƥ����Q{=kh7��M�wXQ�p�\v�͓�O/��.���
�N3��HKR��l�K�"�q��^W��h��1wt��h@���3�e6�N|������I;y��?8t[�[�!����$,ήL��e�"�z��%IކA�k��R�l!3u�8�ځy��?_�W��)�AbC��O�!rz��a��5S��n֗���#�<�43y��6"���R����߃C��Q�&>�[��#
BH�ǽ�{v�e��kO��T�lq(�UH�͵h��ݔ8�,@t�����ՂL�{p����/�*�L"�d_y��k,4�G̖��bD>,��.ok"�D;�|7�[.�D�C�A���#�i���l����ϟ�I֬�����D�q�]+�eE	��_�--����ڰc�����^���L��q�1~�C��C�����C�9��gN�����H�8Bkh��J��#Z�-`�V�o��M�a 9r$�պZ-�h�kh�
?C�$�	�^��tď��9d(�8P݅]ڶ���w[�wl��;��d��n�׆�o�K��d�H�ބ(D������In�I� M��_(��������5)6H/���Y�1�� �QR�k,n��XH��ʉ�����?>��df��&6����^EJ�m���t��{�C�����C�c`���0ʅv5��x<��\9Y��c����}1�06"״!֏��9�dl:'��1H"�<HN�&]�5��6�9�!I�1;"����YxA��K-�y�m|h�d
�"]�����U�.ak�gbbw24�������j-� Q���Od�-��:N�	dG��˥M�����I	V�G=�W�!r6�w�H3����p"��ۋ����#g6*x�9��k{H��<W�����BQߍO�MV��{Kh��^<�F�W
<�L���:w$|�oY��-Q]<ʫ��!�!垹��F�q@}3f�R�%���oĿM���r�D���+�N|�Y�Y���6�j�r1�1k4��i'X��f�\:�e�޼� �~�P9���1�ߍ��
��&7�8Q�ape�����5 9os�M�y�	�K-��u��u9��Bdx7H�V����&�_���!C�lgL �04���yS��}|�qٳ�k�����b�s:f�'/���㼳@!�]%���z#�=�J�s�`3�W ez<�PIG�C����0�@�4������5�5g��x�c��T�G��U�#�R�CC�?tdx��L`�Ɓ8����dgsT�?M6},_��� �\�k٬��lt΄l�s��:m"2��5�be\]\�˛��{xa�Lo��Q�lPwK7���?M^a,�_�lb(�1�?�����3��݌^7��:���ރ��^�us�ϚqB�8*���h�Gx��Y�C�m5�M~�{Sg�9n�RX�C}[����hO�tC��1#W3�*��:;�&_�G�ۂ�&�H|�����5�L���<4Ƀ��\b������D?]fM{V6*�S�<����e��0,�!��
A��ؾ����K��m��m���ߍ�r���O�oC������2�
���#��p'$�F�˿@!�{0�V��YW���oe�,��'��H'���`�r�1�����#�ͿMRS��Y����ZB�h�|�x��H�@
6�YziWl�wQ��}�yqs��!`��~y#�-O�Ց����I�X���m������y����|�*0o@��]ۓ�^(`P�q�ƒv��ef���v�'�OA=B����݂p��C�J#
��֞����q��5�
R������wV&�)ԩ��n@po��]��{3�v�:������Y���f*aW��_�&'
Jk0n����D�x��\/H����D�u�qZ�\ڌG+啵X�Z�T>z'7�Q��q������Ɍ�#K�R.�/C��V��g�Q�Ȭ�����\��`��?d��1y���uM�6Ƶ8ZX]8�^p��wQ�E��
&�1frR��Ki����$G�����ݜ����Е���h3'��������{���;;�~F��K�37�k���u<p��dʎ��+C�����R���Mz�Ə�7)nҀ���� lEGy�l��:̑�I���o�B�<A\���\6�d��F��q�ϡɅQ�[�1<k���N�>��S%|��Е�sTu�le���b�A}A�����ʹ�1�0�A{�K��ʘӺ�tj����dLI=r�	�PRg���_Lb�R���
Ş�l?�␔�)!��[��F��o��wi&k^�CV(t@p�W2���{h�x�H�GRn�͉�eCb�xԉ����6G�������Q��d27\�ثd�S��=\�F�f*�0�ۣ�OP���5(r�ZߙxQ�Z>�~G�AeN-��jY��7�Ҿn;�n?ӹ"P��x�}���/�N��W:݊&��׾��:x"ꭥу;��R�펔���c䛅љ�������ElmG§a=�h�¨BG_�u���YnZ쫭FYs �U�"zM&�:��Gn��u�.�DX���5Xn�����;�}�ԫ%XO?�~2&����Frjj���8��yA���*�W	������I�����9/��u�b)��Z�l:�s�� 8�5��J��>~�i�������I<�k��¶
�٤�^�S�x�[����s��GD����(�+��"E���HnֆA_��\F�Z���%������?�4`���w��_{�7��"��0�Y��@�f}������PEj�m��v:�Q������rN��[w��z�*���5�c?�j������f�7���?K_�P��', sZ(oT
|��Ó\-%�蔒�h���y������\	cK/	˧YGԻڐ����z&c"*�(,����y�E�q(�y�[���q`�a�7Xļ��~�����R���/��{h�h���"�g��=w���ݠ�՗���?���̶�uNh{�g�?tq���m�,�u�[�Y���ot��+�!�hf��.2]�ݹ?�&��wA�R���F�ľ붾Ue���%��d��l�i����q��Ms&�6�X�w-&�Y�3(���G9��{cׁ�֬ǿM��;����v��n�"���b��)�<�׾���e_�1���p���}��11��F#��YX��p�q]��s��,[�%*&��@�D�f��ҹA�ٙfs���,���>��3Y�ԕ;�:#hEL�ם[ROd��^G�A�˩f�~Y!����E���n��0�~��/�A��
�K�m���>^��WY�q�"���<цF����*c��:x�w�|�͞w��%�ehRg������d�9�̕���v�3�v
Dg��h�>>?��3�h�YDk�gC�(ʹƒ�ԕ���S����Ԝ|�
2Q��94�(�?OG�Q34�
f�cc��PopT�Ya��W(�>�@�t�X4�`�LG�ٞp��Ʉ�a��Űl\�[9�c�26��UM6f,����'����C���4�i<D�n��#�x��г
Hz5�[�
�_�����Qt��m�vN�C_��`��x���~
Mb
s�PEx���؇;�cW��*n\��?���׿v�:O��3@f����R�&�e�����m�[mٜC���5f(�M����Ni��YX�xШ���=�4
y�HO�<�0|���3���[��B	:d1�"Z�O$+Kx�i̒=�s��J����g���~�i[Rz'����G�#�v��}�>�?W~p�sϠ?��k��A��K�rŵ���k@�I�|>^x�s�?�\��`,D��̒�����5��W���^���w�D��M���Xf_8<%|8_왉pP�1����W��lm߃���f?4����:��́�_�Ԕv ���M�;k�:p�����_��sj؎qw]$F��}���y�
��,b'��N��=�o�����0,
������~��M���
Y�R���4�6+!��}@~u�j�ct�C��P.�Y(�x�׎����z�?70�WXFܣ�o�����3z����0���c8�R��G��g�0��T�U��򄽻��w�"/4��֏�����C�Q`[{O���c�n�]��+�{�{�����N!�3��<���V��yx�,!C
�b�.��lf���'��\ ן�����gu,μ���w-/��3ۥ����N���X(�c
����o�MD�s��a�#�#0{c
���%�uDWCB�Z�A��Z6�,؏�x�(Z%�����w���HbhTb2��<$��*c���nk���_�א����#{D+B<�!��S/�g�Ï`�9��.^]��ß��C��+>��3�+��5��]�q����p�j'
r�9��FDȬ)~:�����9Gm��x2���-?s�raG"yvU��pa;R���ă� �A�\&���
�?�#��n	��0�ee����d~o�q嶭�!!DzP^H)>�o��ȑ.�ļ�Զ=Hy�7�S�-M�
�?��8y�c���ߧq�|�#�5"�2Б�l�m#��U�����e�Τ�V���bM���͘�jA�c7�Z
�]>4�gb�
���s	2WRsKg�6���
's8qz�TT[�R�[w��)I��9�5x���Wj��
#�!nN+zP��ڔ�	�Kg��TE�,�����?��{�^R�Dݥ=�R�u^zîc������&D��'i74�S�J�ߔ��&H��U�G�[���cr�ͦ��<����׿~��4}څ��h���;���lpAZ�%�X�Z;t�Q?������y��k1+Ƴu6�[������D��c4�Ɯ����*d��B#!}�e>�samh����G3c^��8u9󼵕⸈߂�U�y��B;f"Y�i=�D�=����4��&�����|�C���3���g]�~���WgjhSIXU��"1A5Fr4�{����A��lj�w�T����t6<�/N�� �\����R�t��a|�i���>�T.�Wo>>�x��ϯ�Y���{緷m,J�{gg}�v~)�]��s!?w��X�����G�F��l!7��U��|Cn�fﳅ:.@mq%��臔���Ru?.��:��aB�ֺ��E#G�g'yX�D�u�SW��NJD)��21�ѵ�V��agW��P���q����Ȓ��s�?¶�@�g")���s\�T���{��f3g��o��^w:^�"��{��d#�!φt�}�,n�yWFKv�„X�4��|<��B+���8�i=�-;��X	5l=/xl��w���n�]� 
�+S�Ӽ,{՞�/Д�V���+<<
�����o �����ԇeNp�^O�����OvqR� �wHF3�݁�=o��;�`~k�R�wC���u¦�k�jE�|��qϩ���KV,���*?��xk��}Q�x�U���/M�����=��հp����=犐�^x�Bˏ���Kx���@�[���I���YB]T��➐����Kq�.ὀP��w����AG\�W�ϋ���9���2S���A\�Y\��y=Ǩ�Gj�����բ�M�@�tԂ��vD���z�+���Bĺ\������լ����6��k�6L��ʦ�R�_r�n�l|UAϯ<
���|��!��;��8�_1�g�sލ��C����� >�VB�~�,����˘_�&f���jp�/W�ԍ�wa�O ���H3����I`���u����1�ͤ������+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W��|�+_��W����ݚ�w)��2iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>Adobe Fireworks CS6 (Macintosh)</xmp:CreatorTool>
         <xmp:CreateDate>2012-11-13T14:35:45Z</xmp:CreateDate>
         <xmp:ModifyDate>2012-12-31T15:05:33Z</xmp:ModifyDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>image/png</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                            
<?xpacket end="w"?>�Э	�IDATx��Ml��O�G%�"#)�k$S�$4���Qsӡ�r)�C��&��=�D��}h�Y�R=D���R��ٕ#���JNE�i*ؖ@RiqW�vWz\-���$v�HΛ�7o߼y;T"B��:�9�
�ೇR��FMǹ8��PX�(&�bjuf@}�l�r�@��(��ؗc�?Xa(����h4n�����}��h�
����@F)e1��*�+�����8���i�>X��+���>}&��h�N˲���7�$"X�%������h�N����.\X����J�rA)�TJ}I)��R�g�6D�?"�&"���b�n�R� �m���F��$�*{{{��������S�<�M�
� ���k�YѪϵZ��������j�����V���]g�V����c9P�V]�m�I`y?�h4�tZ���Pf�����}�J%������bWW׈R*(��E��"Rj4"��X,�0��>x�&��I��	�w����@=�X,܁�ժ_��4�z�~9�n�`

��J�"@6�G��:X.�M ��T*�ǽ�
1�Կ4;�h"B�R]��
O�<Y������K�8�4����5�����J��X,��v�D)����7E�X,Vn�\�����H488�4�r�n�M�����٭S-��3��J��I$f�6���~D;a�vvdd�h��Ǎ��M�,"b�DD��_��T?-�w�F�1�~};��777�z}___�V��
�g)ӑE��7o�����REd���E���$5Z o��EB"�0?~<��E
@����8FFFL�v�ax�ѣG ��ϛar'q���a�Ճ	���E��!�u�Ԇ��h�6�H``` �����j�
Ggj�R�/�{MPJ��K��~h��?�u�z�O����Qccc�(s������K�^�t���:��1�O>�ĸr��l+9o�i��&���Rj@)���4p2 Ej+���1L��]�h���g��ғF�v�az��@���ؘ&w*���/�lx�[�����d2y�kYJ��E�_D��oA����@�R��

-�X�T�ݾ��.u�8a��D�MFUz����nڶ�/a���ul��h�t�X�{�Q�����0�*�,�J���r��5#�ouuմ,+���i��?oA�y'|gJ�R>�H��R��h4����"rE)ŝ;wB���k"��Ӣ��|
��G��ښa۶_7��������������@frr�3`||��	ܻwϤyC�^YYajj��YYY��]�����M�KXgs<
䷶�2���[[[�n�4N���CCC�������}����%��%�԰R�"�X"�-"["�oy/�m�l:����F��W��h�����err��1��=2�����	055e
�<�8jm���6ʅB��<a���.�'�<��{��1�Q����h�?�/^����]�ј���20!"e�h]D
�F�����n���O'�6��.��w�@�ƍ�i����6����i~%�����{�.�������yt٥���3��ݻ��������D�y����le^xᅢ_Ns&��[��Vׯ_?���,�,x��}^�%΁�t�	V�������۷�0�.���N:���I���T�n�rfx�"�R���~6�w }T�1=��	�r N��0�ʌ�"�c�oA2�����J)C�	3����M|��TjN�x���\�L~�Ѵ�Y�uP��B�^��,kٲ�ip^#(�~������ޞY�׏��,�J�o���Ԝ��U��`˹���y��4�Ɂl�>(~��Q�Voٶ��m�q��uI�)�$�~hggǴ,+�n�i7'�̑�-&������؜ww�E�j�*z�,�-�¹����T�7t[[[f�^O��UM_��	:kdp��J�p���.��&Z��ѳ�
4�¢KX]�t�-x^D~	��p6�x����{%)�8�J����b��Rs�\n�U>���"������I�낊�/8���8@*5�w?
?�WG�̽g��B��w�2�G3���3>�4�'��z�=9=���b�;��3�e~�9��8u�$"��J8�?/�u���5���իM��>���o?���FK�N��|�\n1�J�5��r�	7ρ	gQ�%��1~||\�Ŷ������=�����׮]3t9?������0N�����D�i���A$r��i��A���6�
��E��ԔaY�w,�*��(�~��*�~����!�@���I#bߎ��>ˡ���-J.�(8��9�l�6��r�N>�m۳�m<���x�~��a�v�O�,+��+��?!R��e�}Z��}N٥͸<����9�\��RJ���2��@'��S�\�*��
IEND�B`�controls.svg000060400000024150152455615120007134 0ustar00<?xml version="1.0" standalone="no"?>
<!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#ffffff00" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="144px" height="32px"
>
	<defs>
		<radialGradient id="gradient1" cx="50%" cy="50%" r="50%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/>
		</radialGradient>
		<linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#ffffff" stop-opacity="1" offset="0%"/>
			<stop stop-color="#c8c8c8" stop-opacity="1" offset="99.4444%"/>
		</linearGradient>
	</defs>
	<g id="BG">
	</g>
	<g id="controls">
		<path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#ffffff" stroke-width="1" fill="none"/>
		<path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#ffffff" stroke-width="1" fill="none"/>
		<path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#ffffff" stroke-width="1" fill="none"/>
		<path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#ffffff"/>
		<path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#ffffff"/>
		<path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#ffffff"/>
	</g>
	<g id="backlight">
		<g id="off">
			<rect x="83" y="21" width="10" height="6" stroke="#ffffff" stroke-width="1" fill="#333333"/>
		</g>
		<g id="on">
			<path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/>
			<rect x="83" y="5" width="10" height="6" stroke="#ffffff" stroke-width="1" fill="#333333"/>
		</g>
	</g>
	<g id="loop">
		<g id="on2">
			<path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/>
			<path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/>
		</g>
		<g id="off2">
			<path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/>
			<path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/>
		</g>
	</g>
	<g id="cc">
		<rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/>
		<text visibility="hidden" x="49" y="17" width="14" fill="#ffffff" style="font-size: 10px; color: #ffffff; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text>
		<path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#ffffff" stroke-width="1" fill="none"/>
		<path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#ffffff" stroke-width="1" fill="none"/>
		<path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/>
		<rect x="49" y="2" width="14" height="12" fill="none"/>
	</g>
	<g id="volume">
		<g id="no%20sound">
			<rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/>
			<path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/>
		</g>
		<g id="sound%20bars">
			<rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/>
			<path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/>
			<path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#ffffff" stroke-width="1" fill="none"/>
			<path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#ffffff" stroke-width="1" fill="none"/>
		</g>
	</g>
	<g id="play/pause">
		<g id="play">
			<path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/>
		</g>
		<g id="pause">
			<rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/>
			<rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/>
		</g>
	</g>
	<g id="fullscreen">
		<g id="enter%201">
			<path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/>
			<path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/>
			<path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/>
			<path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/>
		</g>
		<g id="exit">
			<path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/>
			<path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/>
			<path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/>
			<path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/>
		</g>
	</g>
	<g id="stop">
		<rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/>
	</g>
	<g id="chooser">
		<path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/>
	</g>
</svg>controls-wmp-bg.png000060400000003650152455615120010312 0ustar00�PNG


IHDR�0g���PLTE��������þ����������̶��������������������������������̎�������̯���������������̩��xxx��̸����̪�������̿����������̾�������̥����̸����������µ����̿���������������������´�������̿����̾����������ì�������̳�������̺����¢�������������̵�������̣�������Ĺ�������̭�������������������������������̾�������̨�������������������������������������������̸���������������������̶�����������xxx�����̮��������{{{jjj���������������sss�����������̌�������������̺����������̲����������������������������©�������́�����yyy���wwwkkk������iii���������ttt��������ª����̆����������������̝�����uuummmggg������ooo���������ppp���vvv���nnn�����̵��~~~www������lllqqq���������nnn������hhhooo���������rrr|||���zzz������jjj��̙����̖��fff���tRNSW&�_��0�tĖa�����2ˁ�W��R)��8���B��-=PZC����>��#7�I[��:�*M�����O�1XB��]�
5u�G|[ ������(,�7O�9�ǐ���Ι�������V�JT��G���k��A�v���Ǚ/�.����˔TW.Y�a!�������l}���"������a��������;�ę�����������������������˙�����������������L�I����!�IDATh�cse	�3�m��ضm�m۶۶m=��o�0Ae&ՕλU9�K��aC`��Wy�^��[����cG��9�kr�̙n�����
���z�#�¸<�DzxKL��0��$���/������0���W~�,��]VvIL!0Ck��,�e��3��<���_����r�>,��ٱ3�T�A����Y�Ρ�|�����
�9�s�
lKo�{۪L��^�c �:~u[9(g̫Ta	�w��%��ؤ@��L�a��*)
Lڀ�n�pQKaM��_SI-��@7A��w�T��gp
Tc�;]�u�uTS��._%�ԍ��o��vaq����k����e?
)���o���꧞�_riH�0�q�t��S��4�bu>��r*ڽ����\;!�	��RL��l����jY�5��Ѡ8/5�|�|�IM�N�襦��el:5MXL��>jZw��KM�i��KM����Njz�C��Դ�,��ej�^H��m���J�3*����n*�'��⡢k�4�bվ�
�Tti~
��Q�� 8�6*��GC��AE��^�QQC��D�Ϧ������Oy���w

�uROɮ��u���gP����pA���TS�ɠƷTRM�iϣ���KG�PMʔ9����fɨ��M��7ҝԲ�����&m��Ҭ����W��S7{,T1wfAaM��K�1�x2z	�|�Ͷ'�n�(�]�n�a5��((p�|u�EW�����5�q��u<�i���j�q��#���H�Z�����6fkL!0�꫒J,<T��0��,��M�)�g��,�tL�(��6�S��o��n�_����j�I�U>���U�G,��Æ`���kd��עIEND�B`�controls-green.svg000060400000024150152455615120010232 0ustar00<?xml version="1.0" standalone="no"?>
<!-- Generator: Adobe Fireworks CS6, Export SVG Extension by Aaron Beall (http://fireworks.abeall.com) . Version: 0.6.1  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="controls.fw-Page%201" viewBox="0 0 144 32" style="background-color:#00990000" version="1.1"
	xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
	x="0px" y="0px" width="144px" height="32px"
>
	<defs>
		<radialGradient id="gradient1" cx="50%" cy="50%" r="50%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#f2f2f2" stop-opacity="0.2" offset="100%"/>
		</radialGradient>
		<linearGradient id="gradient2" x1="50%" y1="-7.8652%" x2="50%" y2="249.6629%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient3" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient4" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient5" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient6" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient7" x1="50%" y1="-33.3333%" x2="50%" y2="152.0833%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient8" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient9" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient10" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient11" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient12" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient13" x1="40%" y1="-140%" x2="40%" y2="98.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient14" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient15" x1="60%" y1="-140%" x2="60%" y2="98.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient16" x1="50%" y1="0%" x2="50%" y2="298.4375%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient17" x1="50%" y1="0%" x2="50%" y2="238.75%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient18" x1="50%" y1="-200%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient19" x1="50%" y1="-200%" x2="50%" y2="110.9375%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient20" x1="55%" y1="0%" x2="55%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="100%"/>
		</linearGradient>
		<linearGradient id="gradient21" x1="50%" y1="0%" x2="50%" y2="100%">
			<stop stop-color="#009900" stop-opacity="1" offset="0%"/>
			<stop stop-color="#006600" stop-opacity="1" offset="99.4444%"/>
		</linearGradient>
	</defs>
	<g id="BG">
	</g>
	<g id="controls">
		<path id="Line" d="M 98.5 7.5 L 109.5 7.5 " stroke="#009900" stroke-width="1" fill="none"/>
		<path id="Line2" d="M 98.5 3.5 L 109.5 3.5 " stroke="#009900" stroke-width="1" fill="none"/>
		<path id="Line3" d="M 98.5 11.5 L 109.5 11.5 " stroke="#009900" stroke-width="1" fill="none"/>
		<path id="Ellipse" d="M 108 11.5 C 108 10.6716 108.4477 10 109 10 C 109.5523 10 110 10.6716 110 11.5 C 110 12.3284 109.5523 13 109 13 C 108.4477 13 108 12.3284 108 11.5 Z" fill="#009900"/>
		<path id="Ellipse2" d="M 104 7.5 C 104 6.6716 104.4477 6 105 6 C 105.5523 6 106 6.6716 106 7.5 C 106 8.3284 105.5523 9 105 9 C 104.4477 9 104 8.3284 104 7.5 Z" fill="#009900"/>
		<path id="Ellipse3" d="M 108 3.5 C 108 2.6716 108.4477 2 109 2 C 109.5523 2 110 2.6716 110 3.5 C 110 4.3284 109.5523 5 109 5 C 108.4477 5 108 4.3284 108 3.5 Z" fill="#009900"/>
	</g>
	<g id="backlight">
		<g id="off">
			<rect x="83" y="21" width="10" height="6" stroke="#009900" stroke-width="1" fill="#333333"/>
		</g>
		<g id="on">
			<path id="Ellipse4" d="M 81 8 C 81 5.2385 84.134 3 88 3 C 91.866 3 95 5.2385 95 8 C 95 10.7615 91.866 13 88 13 C 84.134 13 81 10.7615 81 8 Z" fill="url(#gradient1)"/>
			<rect x="83" y="5" width="10" height="6" stroke="#009900" stroke-width="1" fill="#333333"/>
		</g>
	</g>
	<g id="loop">
		<g id="on2">
			<path d="M 73.795 4.205 C 75.2155 4.8785 76.2 6.3234 76.2 8 C 76.2 10.3196 74.3196 12.2 72 12.2 C 69.6804 12.2 67.8 10.3196 67.8 8 C 67.8 6.3234 68.7845 4.8785 70.205 4.205 L 68.875 2.875 C 67.1501 3.9289 66 5.8306 66 8 C 66 11.3138 68.6862 14 72 14 C 75.3138 14 78 11.3138 78 8 C 78 5.8306 76.8499 3.9289 75.125 2.875 L 73.795 4.205 Z" fill="url(#gradient2)"/>
			<path d="M 71 2 L 66 2 L 71 7 L 71 2 Z" fill="url(#gradient3)"/>
		</g>
		<g id="off2">
			<path d="M 73.795 20.205 C 75.2155 20.8785 76.2 22.3234 76.2 24 C 76.2 26.3196 74.3196 28.2 72 28.2 C 69.6804 28.2 67.8 26.3196 67.8 24 C 67.8 22.3234 68.7845 20.8785 70.205 20.205 L 68.875 18.875 C 67.1501 19.9289 66 21.8306 66 24 C 66 27.3138 68.6862 30 72 30 C 75.3138 30 78 27.3138 78 24 C 78 21.8306 76.8499 19.9289 75.125 18.875 L 73.795 20.205 Z" fill="#a8a8b7"/>
			<path d="M 71 18 L 66 18 L 71 23 L 71 18 Z" fill="#a8a8b7"/>
		</g>
	</g>
	<g id="cc">
		<rect visibility="hidden" x="49" y="2" width="14" height="12" stroke="#b0b0b0" stroke-width="1" fill="none"/>
		<text visibility="hidden" x="49" y="17" width="14" fill="#009900" style="font-size: 10px; color: #009900; font-family: Arial; text-align: center; "><tspan><![CDATA[cc]]></tspan></text>
		<path d="M 55 7 C 50.2813 3.7813 50.063 12.9405 55 10 " stroke="#009900" stroke-width="1" fill="none"/>
		<path d="M 60 7 C 55.2813 3.7813 55.063 12.9405 60 10 " stroke="#009900" stroke-width="1" fill="none"/>
		<path d="M 50 3 L 62 3 L 62 13 L 50 13 L 50 3 ZM 49 2 L 49 14 L 63 14 L 63 2 L 49 2 Z" fill="url(#gradient4)"/>
		<rect x="49" y="2" width="14" height="12" fill="none"/>
	</g>
	<g id="volume">
		<g id="no%20sound">
			<rect x="17" y="5" width="5" height="6" fill="url(#gradient5)"/>
			<path d="M 21 5 L 25 2 L 25 14 L 21 11.0625 L 21 5 Z" fill="url(#gradient6)"/>
		</g>
		<g id="sound%20bars">
			<rect x="17" y="21" width="5" height="6" fill="url(#gradient7)"/>
			<path d="M 21 21 L 25 18 L 25 30 L 21 27.0625 L 21 21 Z" fill="url(#gradient8)"/>
			<path d="M 27 18 C 27 18 30.0625 17.375 30 24 C 29.9375 30.625 27 30 27 30 " stroke="#009900" stroke-width="1" fill="none"/>
			<path d="M 26 21.0079 C 26 21.0079 28.041 20.6962 27.9994 24 C 27.9577 27.3038 26 26.9921 26 26.9921 " stroke="#009900" stroke-width="1" fill="none"/>
		</g>
	</g>
	<g id="play/pause">
		<g id="play">
			<path id="Polygon" d="M 14 8.5 L 3 14 L 3 3 L 14 8.5 Z" fill="url(#gradient9)"/>
		</g>
		<g id="pause">
			<rect x="3" y="18" width="3" height="12" fill="url(#gradient10)"/>
			<rect x="10" y="18" width="3" height="12" fill="url(#gradient11)"/>
		</g>
	</g>
	<g id="fullscreen">
		<g id="enter%201">
			<path d="M 34 2 L 39 2 L 34 7 L 34 2 Z" fill="url(#gradient12)"/>
			<path d="M 34 14 L 39 14 L 34 9 L 34 14 Z" fill="url(#gradient13)"/>
			<path d="M 46 2 L 41 2 L 46 7 L 46 2 Z" fill="url(#gradient14)"/>
			<path d="M 46 14 L 41 14 L 46 9 L 46 14 Z" fill="url(#gradient15)"/>
		</g>
		<g id="exit">
			<path d="M 42 22 L 46 22 L 42 18 L 42 22 Z" fill="url(#gradient16)"/>
			<path d="M 38 22 L 38 18 L 34 22 L 38 22 Z" fill="url(#gradient17)"/>
			<path d="M 38 26 L 34 26 L 38 30 L 38 26 Z" fill="url(#gradient18)"/>
			<path d="M 42 26 L 42 30 L 46 26 L 42 26 Z" fill="url(#gradient19)"/>
		</g>
	</g>
	<g id="stop">
		<rect x="115" y="3" width="10" height="10" fill="url(#gradient20)"/>
	</g>
	<g id="chooser">
		<path d="M 135.2346 6.1522 C 136.2551 5.7295 137.4251 6.2141 137.8478 7.2346 C 138.2704 8.2551 137.7859 9.425 136.7654 9.8478 C 135.7449 10.2705 134.5749 9.7859 134.1522 8.7654 C 133.7295 7.7449 134.2141 6.5749 135.2346 6.1522 ZM 133.2735 1.4176 L 136 4.0054 L 138.7265 1.4176 L 138.8246 5.1754 L 142.5824 5.2735 L 139.9946 8 L 142.5824 10.7265 L 138.8246 10.8246 L 138.7265 14.5824 L 136 11.9946 L 133.2735 14.5824 L 133.1754 10.8246 L 129.4176 10.7265 L 132.0054 8 L 129.4176 5.2735 L 133.1754 5.1754 L 133.2735 1.4176 Z" fill="url(#gradient21)"/>
	</g>
</svg>index.html000060400000000000152455615120006531 0ustar00codemirror.min.css000060400000013562152455704320010217 0ustar00.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:0}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}codemirror.js000060400001411726152455704320007266 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

// This is CodeMirror (https://codemirror.net), a code editor
// implemented in JavaScript on top of the browser's DOM.
//
// You can find some technical background for some of the code below
// at http://marijnhaverbeke.nl/blog/#cm-internals .

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = global || self, global.CodeMirror = factory());
}(this, (function () { 'use strict';

  // Kludges for bugs and behavior differences that can't be feature
  // detected are enabled based on userAgent etc sniffing.
  var userAgent = navigator.userAgent;
  var platform = navigator.platform;

  var gecko = /gecko\/\d/i.test(userAgent);
  var ie_upto10 = /MSIE \d/.test(userAgent);
  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
  var edge = /Edge\/(\d+)/.exec(userAgent);
  var ie = ie_upto10 || ie_11up || edge;
  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
  var webkit = !edge && /WebKit\//.test(userAgent);
  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
  var chrome = !edge && /Chrome\//.test(userAgent);
  var presto = /Opera\//.test(userAgent);
  var safari = /Apple Computer/.test(navigator.vendor);
  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
  var phantom = /PhantomJS/.test(userAgent);

  var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2);
  var android = /Android/.test(userAgent);
  // This is woefully incomplete. Suggestions for alternative methods welcome.
  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
  var mac = ios || /Mac/.test(platform);
  var chromeOS = /\bCrOS\b/.test(userAgent);
  var windows = /win/i.test(platform);

  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
  if (presto_version) { presto_version = Number(presto_version[1]); }
  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
  var captureRightClick = gecko || (ie && ie_version >= 9);

  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }

  var rmClass = function(node, cls) {
    var current = node.className;
    var match = classTest(cls).exec(current);
    if (match) {
      var after = current.slice(match.index + match[0].length);
      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
    }
  };

  function removeChildren(e) {
    for (var count = e.childNodes.length; count > 0; --count)
      { e.removeChild(e.firstChild); }
    return e
  }

  function removeChildrenAndAdd(parent, e) {
    return removeChildren(parent).appendChild(e)
  }

  function elt(tag, content, className, style) {
    var e = document.createElement(tag);
    if (className) { e.className = className; }
    if (style) { e.style.cssText = style; }
    if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
    return e
  }
  // wrapper for elt, which removes the elt from the accessibility tree
  function eltP(tag, content, className, style) {
    var e = elt(tag, content, className, style);
    e.setAttribute("role", "presentation");
    return e
  }

  var range;
  if (document.createRange) { range = function(node, start, end, endNode) {
    var r = document.createRange();
    r.setEnd(endNode || node, end);
    r.setStart(node, start);
    return r
  }; }
  else { range = function(node, start, end) {
    var r = document.body.createTextRange();
    try { r.moveToElementText(node.parentNode); }
    catch(e) { return r }
    r.collapse(true);
    r.moveEnd("character", end);
    r.moveStart("character", start);
    return r
  }; }

  function contains(parent, child) {
    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
      { child = child.parentNode; }
    if (parent.contains)
      { return parent.contains(child) }
    do {
      if (child.nodeType == 11) { child = child.host; }
      if (child == parent) { return true }
    } while (child = child.parentNode)
  }

  function activeElt() {
    // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
    // IE < 10 will throw when accessed while the page is loading or in an iframe.
    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
    var activeElement;
    try {
      activeElement = document.activeElement;
    } catch(e) {
      activeElement = document.body || null;
    }
    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
      { activeElement = activeElement.shadowRoot.activeElement; }
    return activeElement
  }

  function addClass(node, cls) {
    var current = node.className;
    if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
  }
  function joinClasses(a, b) {
    var as = a.split(" ");
    for (var i = 0; i < as.length; i++)
      { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
    return b
  }

  var selectInput = function(node) { node.select(); };
  if (ios) // Mobile Safari apparently has a bug where select() is broken.
    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
  else if (ie) // Suppress mysterious IE10 errors
    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }

  function bind(f) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function(){return f.apply(null, args)}
  }

  function copyObj(obj, target, overwrite) {
    if (!target) { target = {}; }
    for (var prop in obj)
      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
        { target[prop] = obj[prop]; } }
    return target
  }

  // Counts the column offset in a string, taking tabs into account.
  // Used mostly to find indentation.
  function countColumn(string, end, tabSize, startIndex, startValue) {
    if (end == null) {
      end = string.search(/[^\s\u00a0]/);
      if (end == -1) { end = string.length; }
    }
    for (var i = startIndex || 0, n = startValue || 0;;) {
      var nextTab = string.indexOf("\t", i);
      if (nextTab < 0 || nextTab >= end)
        { return n + (end - i) }
      n += nextTab - i;
      n += tabSize - (n % tabSize);
      i = nextTab + 1;
    }
  }

  var Delayed = function() {
    this.id = null;
    this.f = null;
    this.time = 0;
    this.handler = bind(this.onTimeout, this);
  };
  Delayed.prototype.onTimeout = function (self) {
    self.id = 0;
    if (self.time <= +new Date) {
      self.f();
    } else {
      setTimeout(self.handler, self.time - +new Date);
    }
  };
  Delayed.prototype.set = function (ms, f) {
    this.f = f;
    var time = +new Date + ms;
    if (!this.id || time < this.time) {
      clearTimeout(this.id);
      this.id = setTimeout(this.handler, ms);
      this.time = time;
    }
  };

  function indexOf(array, elt) {
    for (var i = 0; i < array.length; ++i)
      { if (array[i] == elt) { return i } }
    return -1
  }

  // Number of pixels added to scroller and sizer to hide scrollbar
  var scrollerGap = 50;

  // Returned or thrown by various protocols to signal 'I'm not
  // handling this'.
  var Pass = {toString: function(){return "CodeMirror.Pass"}};

  // Reused option objects for setSelection & friends
  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};

  // The inverse of countColumn -- find the offset that corresponds to
  // a particular column.
  function findColumn(string, goal, tabSize) {
    for (var pos = 0, col = 0;;) {
      var nextTab = string.indexOf("\t", pos);
      if (nextTab == -1) { nextTab = string.length; }
      var skipped = nextTab - pos;
      if (nextTab == string.length || col + skipped >= goal)
        { return pos + Math.min(skipped, goal - col) }
      col += nextTab - pos;
      col += tabSize - (col % tabSize);
      pos = nextTab + 1;
      if (col >= goal) { return pos }
    }
  }

  var spaceStrs = [""];
  function spaceStr(n) {
    while (spaceStrs.length <= n)
      { spaceStrs.push(lst(spaceStrs) + " "); }
    return spaceStrs[n]
  }

  function lst(arr) { return arr[arr.length-1] }

  function map(array, f) {
    var out = [];
    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
    return out
  }

  function insertSorted(array, value, score) {
    var pos = 0, priority = score(value);
    while (pos < array.length && score(array[pos]) <= priority) { pos++; }
    array.splice(pos, 0, value);
  }

  function nothing() {}

  function createObj(base, props) {
    var inst;
    if (Object.create) {
      inst = Object.create(base);
    } else {
      nothing.prototype = base;
      inst = new nothing();
    }
    if (props) { copyObj(props, inst); }
    return inst
  }

  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
  function isWordCharBasic(ch) {
    return /\w/.test(ch) || ch > "\x80" &&
      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
  }
  function isWordChar(ch, helper) {
    if (!helper) { return isWordCharBasic(ch) }
    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
    return helper.test(ch)
  }

  function isEmpty(obj) {
    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
    return true
  }

  // Extending unicode characters. A series of a non-extending char +
  // any number of extending chars is treated as a single unit as far
  // as editing and measuring is concerned. This is not fully correct,
  // since some scripts/fonts/browsers also treat other configurations
  // of code points as a group.
  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }

  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
  function skipExtendingChars(str, pos, dir) {
    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
    return pos
  }

  // Returns the value from the range [`from`; `to`] that satisfies
  // `pred` and is closest to `from`. Assumes that at least `to`
  // satisfies `pred`. Supports `from` being greater than `to`.
  function findFirst(pred, from, to) {
    // At any point we are certain `to` satisfies `pred`, don't know
    // whether `from` does.
    var dir = from > to ? -1 : 1;
    for (;;) {
      if (from == to) { return from }
      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);
      if (mid == from) { return pred(mid) ? from : to }
      if (pred(mid)) { to = mid; }
      else { from = mid + dir; }
    }
  }

  // BIDI HELPERS

  function iterateBidiSections(order, from, to, f) {
    if (!order) { return f(from, to, "ltr", 0) }
    var found = false;
    for (var i = 0; i < order.length; ++i) {
      var part = order[i];
      if (part.from < to && part.to > from || from == to && part.to == from) {
        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i);
        found = true;
      }
    }
    if (!found) { f(from, to, "ltr"); }
  }

  var bidiOther = null;
  function getBidiPartAt(order, ch, sticky) {
    var found;
    bidiOther = null;
    for (var i = 0; i < order.length; ++i) {
      var cur = order[i];
      if (cur.from < ch && cur.to > ch) { return i }
      if (cur.to == ch) {
        if (cur.from != cur.to && sticky == "before") { found = i; }
        else { bidiOther = i; }
      }
      if (cur.from == ch) {
        if (cur.from != cur.to && sticky != "before") { found = i; }
        else { bidiOther = i; }
      }
    }
    return found != null ? found : bidiOther
  }

  // Bidirectional ordering algorithm
  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
  // that this (partially) implements.

  // One-char codes used for character types:
  // L (L):   Left-to-Right
  // R (R):   Right-to-Left
  // r (AL):  Right-to-Left Arabic
  // 1 (EN):  European Number
  // + (ES):  European Number Separator
  // % (ET):  European Number Terminator
  // n (AN):  Arabic Number
  // , (CS):  Common Number Separator
  // m (NSM): Non-Spacing Mark
  // b (BN):  Boundary Neutral
  // s (B):   Paragraph Separator
  // t (S):   Segment Separator
  // w (WS):  Whitespace
  // N (ON):  Other Neutrals

  // Returns null if characters are ordered as they appear
  // (left-to-right), or an array of sections ({from, to, level}
  // objects) in the order in which they occur visually.
  var bidiOrdering = (function() {
    // Character types for codepoints 0 to 0xff
    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
    // Character types for codepoints 0x600 to 0x6f9
    var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
    function charType(code) {
      if (code <= 0xf7) { return lowTypes.charAt(code) }
      else if (0x590 <= code && code <= 0x5f4) { return "R" }
      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
      else if (0x6ee <= code && code <= 0x8ac) { return "r" }
      else if (0x2000 <= code && code <= 0x200b) { return "w" }
      else if (code == 0x200c) { return "b" }
      else { return "L" }
    }

    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;

    function BidiSpan(level, from, to) {
      this.level = level;
      this.from = from; this.to = to;
    }

    return function(str, direction) {
      var outerType = direction == "ltr" ? "L" : "R";

      if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
      var len = str.length, types = [];
      for (var i = 0; i < len; ++i)
        { types.push(charType(str.charCodeAt(i))); }

      // W1. Examine each non-spacing mark (NSM) in the level run, and
      // change the type of the NSM to the type of the previous
      // character. If the NSM is at the start of the level run, it will
      // get the type of sor.
      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
        var type = types[i$1];
        if (type == "m") { types[i$1] = prev; }
        else { prev = type; }
      }

      // W2. Search backwards from each instance of a European number
      // until the first strong type (R, L, AL, or sor) is found. If an
      // AL is found, change the type of the European number to Arabic
      // number.
      // W3. Change all ALs to R.
      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
        var type$1 = types[i$2];
        if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
      }

      // W4. A single European separator between two European numbers
      // changes to a European number. A single common separator between
      // two numbers of the same type changes to that type.
      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
        var type$2 = types[i$3];
        if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
        else if (type$2 == "," && prev$1 == types[i$3+1] &&
                 (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
        prev$1 = type$2;
      }

      // W5. A sequence of European terminators adjacent to European
      // numbers changes to all European numbers.
      // W6. Otherwise, separators and terminators change to Other
      // Neutral.
      for (var i$4 = 0; i$4 < len; ++i$4) {
        var type$3 = types[i$4];
        if (type$3 == ",") { types[i$4] = "N"; }
        else if (type$3 == "%") {
          var end = (void 0);
          for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
          var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
          for (var j = i$4; j < end; ++j) { types[j] = replace; }
          i$4 = end - 1;
        }
      }

      // W7. Search backwards from each instance of a European number
      // until the first strong type (R, L, or sor) is found. If an L is
      // found, then change the type of the European number to L.
      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
        var type$4 = types[i$5];
        if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
        else if (isStrong.test(type$4)) { cur$1 = type$4; }
      }

      // N1. A sequence of neutrals takes the direction of the
      // surrounding strong text if the text on both sides has the same
      // direction. European and Arabic numbers act as if they were R in
      // terms of their influence on neutrals. Start-of-level-run (sor)
      // and end-of-level-run (eor) are used at level run boundaries.
      // N2. Any remaining neutrals take the embedding direction.
      for (var i$6 = 0; i$6 < len; ++i$6) {
        if (isNeutral.test(types[i$6])) {
          var end$1 = (void 0);
          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
          var before = (i$6 ? types[i$6-1] : outerType) == "L";
          var after = (end$1 < len ? types[end$1] : outerType) == "L";
          var replace$1 = before == after ? (before ? "L" : "R") : outerType;
          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
          i$6 = end$1 - 1;
        }
      }

      // Here we depart from the documented algorithm, in order to avoid
      // building up an actual levels array. Since there are only three
      // levels (0, 1, 2) in an implementation that doesn't take
      // explicit embedding into account, we can build up the order on
      // the fly, without following the level-based algorithm.
      var order = [], m;
      for (var i$7 = 0; i$7 < len;) {
        if (countsAsLeft.test(types[i$7])) {
          var start = i$7;
          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
          order.push(new BidiSpan(0, start, i$7));
        } else {
          var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0;
          for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
          for (var j$2 = pos; j$2 < i$7;) {
            if (countsAsNum.test(types[j$2])) {
              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }
              var nstart = j$2;
              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
              order.splice(at, 0, new BidiSpan(2, nstart, j$2));
              at += isRTL;
              pos = j$2;
            } else { ++j$2; }
          }
          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
        }
      }
      if (direction == "ltr") {
        if (order[0].level == 1 && (m = str.match(/^\s+/))) {
          order[0].from = m[0].length;
          order.unshift(new BidiSpan(0, 0, m[0].length));
        }
        if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
          lst(order).to -= m[0].length;
          order.push(new BidiSpan(0, len - m[0].length, len));
        }
      }

      return direction == "rtl" ? order.reverse() : order
    }
  })();

  // Get the bidi ordering for the given line (and cache it). Returns
  // false for lines that are fully left-to-right, and an array of
  // BidiSpan objects otherwise.
  function getOrder(line, direction) {
    var order = line.order;
    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
    return order
  }

  // EVENT HANDLING

  // Lightweight event framework. on/off also work on DOM nodes,
  // registering native DOM handlers.

  var noHandlers = [];

  var on = function(emitter, type, f) {
    if (emitter.addEventListener) {
      emitter.addEventListener(type, f, false);
    } else if (emitter.attachEvent) {
      emitter.attachEvent("on" + type, f);
    } else {
      var map = emitter._handlers || (emitter._handlers = {});
      map[type] = (map[type] || noHandlers).concat(f);
    }
  };

  function getHandlers(emitter, type) {
    return emitter._handlers && emitter._handlers[type] || noHandlers
  }

  function off(emitter, type, f) {
    if (emitter.removeEventListener) {
      emitter.removeEventListener(type, f, false);
    } else if (emitter.detachEvent) {
      emitter.detachEvent("on" + type, f);
    } else {
      var map = emitter._handlers, arr = map && map[type];
      if (arr) {
        var index = indexOf(arr, f);
        if (index > -1)
          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
      }
    }
  }

  function signal(emitter, type /*, values...*/) {
    var handlers = getHandlers(emitter, type);
    if (!handlers.length) { return }
    var args = Array.prototype.slice.call(arguments, 2);
    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
  }

  // The DOM events that CodeMirror handles can be overridden by
  // registering a (non-DOM) handler on the editor for the event name,
  // and preventDefault-ing the event in that handler.
  function signalDOMEvent(cm, e, override) {
    if (typeof e == "string")
      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
    signal(cm, override || e.type, cm, e);
    return e_defaultPrevented(e) || e.codemirrorIgnore
  }

  function signalCursorActivity(cm) {
    var arr = cm._handlers && cm._handlers.cursorActivity;
    if (!arr) { return }
    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
      { set.push(arr[i]); } }
  }

  function hasHandler(emitter, type) {
    return getHandlers(emitter, type).length > 0
  }

  // Add on and off methods to a constructor's prototype, to make
  // registering events on such objects more convenient.
  function eventMixin(ctor) {
    ctor.prototype.on = function(type, f) {on(this, type, f);};
    ctor.prototype.off = function(type, f) {off(this, type, f);};
  }

  // Due to the fact that we still support jurassic IE versions, some
  // compatibility wrappers are needed.

  function e_preventDefault(e) {
    if (e.preventDefault) { e.preventDefault(); }
    else { e.returnValue = false; }
  }
  function e_stopPropagation(e) {
    if (e.stopPropagation) { e.stopPropagation(); }
    else { e.cancelBubble = true; }
  }
  function e_defaultPrevented(e) {
    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
  }
  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}

  function e_target(e) {return e.target || e.srcElement}
  function e_button(e) {
    var b = e.which;
    if (b == null) {
      if (e.button & 1) { b = 1; }
      else if (e.button & 2) { b = 3; }
      else if (e.button & 4) { b = 2; }
    }
    if (mac && e.ctrlKey && b == 1) { b = 3; }
    return b
  }

  // Detect drag-and-drop
  var dragAndDrop = function() {
    // There is *some* kind of drag-and-drop support in IE6-8, but I
    // couldn't get it to work yet.
    if (ie && ie_version < 9) { return false }
    var div = elt('div');
    return "draggable" in div || "dragDrop" in div
  }();

  var zwspSupported;
  function zeroWidthElement(measure) {
    if (zwspSupported == null) {
      var test = elt("span", "\u200b");
      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
      if (measure.firstChild.offsetHeight != 0)
        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
    }
    var node = zwspSupported ? elt("span", "\u200b") :
      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
    node.setAttribute("cm-text", "");
    return node
  }

  // Feature-detect IE's crummy client rect reporting for bidi text
  var badBidiRects;
  function hasBadBidiRects(measure) {
    if (badBidiRects != null) { return badBidiRects }
    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
    var r0 = range(txt, 0, 1).getBoundingClientRect();
    var r1 = range(txt, 1, 2).getBoundingClientRect();
    removeChildren(measure);
    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
    return badBidiRects = (r1.right - r0.right < 3)
  }

  // See if "".split is the broken IE version, if so, provide an
  // alternative way to split lines.
  var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
    var pos = 0, result = [], l = string.length;
    while (pos <= l) {
      var nl = string.indexOf("\n", pos);
      if (nl == -1) { nl = string.length; }
      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
      var rt = line.indexOf("\r");
      if (rt != -1) {
        result.push(line.slice(0, rt));
        pos += rt + 1;
      } else {
        result.push(line);
        pos = nl + 1;
      }
    }
    return result
  } : function (string) { return string.split(/\r\n?|\n/); };

  var hasSelection = window.getSelection ? function (te) {
    try { return te.selectionStart != te.selectionEnd }
    catch(e) { return false }
  } : function (te) {
    var range;
    try {range = te.ownerDocument.selection.createRange();}
    catch(e) {}
    if (!range || range.parentElement() != te) { return false }
    return range.compareEndPoints("StartToEnd", range) != 0
  };

  var hasCopyEvent = (function () {
    var e = elt("div");
    if ("oncopy" in e) { return true }
    e.setAttribute("oncopy", "return;");
    return typeof e.oncopy == "function"
  })();

  var badZoomedRects = null;
  function hasBadZoomedRects(measure) {
    if (badZoomedRects != null) { return badZoomedRects }
    var node = removeChildrenAndAdd(measure, elt("span", "x"));
    var normal = node.getBoundingClientRect();
    var fromRange = range(node, 0, 1).getBoundingClientRect();
    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
  }

  // Known modes, by name and by MIME
  var modes = {}, mimeModes = {};

  // Extra arguments are stored as the mode's dependencies, which is
  // used by (legacy) mechanisms like loadmode.js to automatically
  // load a mode. (Preferred mechanism is the require/define calls.)
  function defineMode(name, mode) {
    if (arguments.length > 2)
      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
    modes[name] = mode;
  }

  function defineMIME(mime, spec) {
    mimeModes[mime] = spec;
  }

  // Given a MIME type, a {name, ...options} config object, or a name
  // string, return a mode config object.
  function resolveMode(spec) {
    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
      spec = mimeModes[spec];
    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
      var found = mimeModes[spec.name];
      if (typeof found == "string") { found = {name: found}; }
      spec = createObj(found, spec);
      spec.name = found.name;
    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
      return resolveMode("application/xml")
    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
      return resolveMode("application/json")
    }
    if (typeof spec == "string") { return {name: spec} }
    else { return spec || {name: "null"} }
  }

  // Given a mode spec (anything that resolveMode accepts), find and
  // initialize an actual mode object.
  function getMode(options, spec) {
    spec = resolveMode(spec);
    var mfactory = modes[spec.name];
    if (!mfactory) { return getMode(options, "text/plain") }
    var modeObj = mfactory(options, spec);
    if (modeExtensions.hasOwnProperty(spec.name)) {
      var exts = modeExtensions[spec.name];
      for (var prop in exts) {
        if (!exts.hasOwnProperty(prop)) { continue }
        if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
        modeObj[prop] = exts[prop];
      }
    }
    modeObj.name = spec.name;
    if (spec.helperType) { modeObj.helperType = spec.helperType; }
    if (spec.modeProps) { for (var prop$1 in spec.modeProps)
      { modeObj[prop$1] = spec.modeProps[prop$1]; } }

    return modeObj
  }

  // This can be used to attach properties to mode objects from
  // outside the actual mode definition.
  var modeExtensions = {};
  function extendMode(mode, properties) {
    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
    copyObj(properties, exts);
  }

  function copyState(mode, state) {
    if (state === true) { return state }
    if (mode.copyState) { return mode.copyState(state) }
    var nstate = {};
    for (var n in state) {
      var val = state[n];
      if (val instanceof Array) { val = val.concat([]); }
      nstate[n] = val;
    }
    return nstate
  }

  // Given a mode and a state (for that mode), find the inner mode and
  // state at the position that the state refers to.
  function innerMode(mode, state) {
    var info;
    while (mode.innerMode) {
      info = mode.innerMode(state);
      if (!info || info.mode == mode) { break }
      state = info.state;
      mode = info.mode;
    }
    return info || {mode: mode, state: state}
  }

  function startState(mode, a1, a2) {
    return mode.startState ? mode.startState(a1, a2) : true
  }

  // STRING STREAM

  // Fed to the mode parsers, provides helper functions to make
  // parsers more succinct.

  var StringStream = function(string, tabSize, lineOracle) {
    this.pos = this.start = 0;
    this.string = string;
    this.tabSize = tabSize || 8;
    this.lastColumnPos = this.lastColumnValue = 0;
    this.lineStart = 0;
    this.lineOracle = lineOracle;
  };

  StringStream.prototype.eol = function () {return this.pos >= this.string.length};
  StringStream.prototype.sol = function () {return this.pos == this.lineStart};
  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
  StringStream.prototype.next = function () {
    if (this.pos < this.string.length)
      { return this.string.charAt(this.pos++) }
  };
  StringStream.prototype.eat = function (match) {
    var ch = this.string.charAt(this.pos);
    var ok;
    if (typeof match == "string") { ok = ch == match; }
    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
    if (ok) {++this.pos; return ch}
  };
  StringStream.prototype.eatWhile = function (match) {
    var start = this.pos;
    while (this.eat(match)){}
    return this.pos > start
  };
  StringStream.prototype.eatSpace = function () {
    var start = this.pos;
    while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }
    return this.pos > start
  };
  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
  StringStream.prototype.skipTo = function (ch) {
    var found = this.string.indexOf(ch, this.pos);
    if (found > -1) {this.pos = found; return true}
  };
  StringStream.prototype.backUp = function (n) {this.pos -= n;};
  StringStream.prototype.column = function () {
    if (this.lastColumnPos < this.start) {
      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
      this.lastColumnPos = this.start;
    }
    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
  };
  StringStream.prototype.indentation = function () {
    return countColumn(this.string, null, this.tabSize) -
      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
  };
  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
    if (typeof pattern == "string") {
      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
      var substr = this.string.substr(this.pos, pattern.length);
      if (cased(substr) == cased(pattern)) {
        if (consume !== false) { this.pos += pattern.length; }
        return true
      }
    } else {
      var match = this.string.slice(this.pos).match(pattern);
      if (match && match.index > 0) { return null }
      if (match && consume !== false) { this.pos += match[0].length; }
      return match
    }
  };
  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
  StringStream.prototype.hideFirstChars = function (n, inner) {
    this.lineStart += n;
    try { return inner() }
    finally { this.lineStart -= n; }
  };
  StringStream.prototype.lookAhead = function (n) {
    var oracle = this.lineOracle;
    return oracle && oracle.lookAhead(n)
  };
  StringStream.prototype.baseToken = function () {
    var oracle = this.lineOracle;
    return oracle && oracle.baseToken(this.pos)
  };

  // Find the line object corresponding to the given line number.
  function getLine(doc, n) {
    n -= doc.first;
    if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
    var chunk = doc;
    while (!chunk.lines) {
      for (var i = 0;; ++i) {
        var child = chunk.children[i], sz = child.chunkSize();
        if (n < sz) { chunk = child; break }
        n -= sz;
      }
    }
    return chunk.lines[n]
  }

  // Get the part of a document between two positions, as an array of
  // strings.
  function getBetween(doc, start, end) {
    var out = [], n = start.line;
    doc.iter(start.line, end.line + 1, function (line) {
      var text = line.text;
      if (n == end.line) { text = text.slice(0, end.ch); }
      if (n == start.line) { text = text.slice(start.ch); }
      out.push(text);
      ++n;
    });
    return out
  }
  // Get the lines between from and to, as array of strings.
  function getLines(doc, from, to) {
    var out = [];
    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
    return out
  }

  // Update the height of a line, propagating the height change
  // upwards to parent nodes.
  function updateLineHeight(line, height) {
    var diff = height - line.height;
    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
  }

  // Given a line object, find its line number by walking up through
  // its parent links.
  function lineNo(line) {
    if (line.parent == null) { return null }
    var cur = line.parent, no = indexOf(cur.lines, line);
    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
      for (var i = 0;; ++i) {
        if (chunk.children[i] == cur) { break }
        no += chunk.children[i].chunkSize();
      }
    }
    return no + cur.first
  }

  // Find the line at the given vertical position, using the height
  // information in the document tree.
  function lineAtHeight(chunk, h) {
    var n = chunk.first;
    outer: do {
      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
        var child = chunk.children[i$1], ch = child.height;
        if (h < ch) { chunk = child; continue outer }
        h -= ch;
        n += child.chunkSize();
      }
      return n
    } while (!chunk.lines)
    var i = 0;
    for (; i < chunk.lines.length; ++i) {
      var line = chunk.lines[i], lh = line.height;
      if (h < lh) { break }
      h -= lh;
    }
    return n + i
  }

  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}

  function lineNumberFor(options, i) {
    return String(options.lineNumberFormatter(i + options.firstLineNumber))
  }

  // A Pos instance represents a position within the text.
  function Pos(line, ch, sticky) {
    if ( sticky === void 0 ) sticky = null;

    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
    this.line = line;
    this.ch = ch;
    this.sticky = sticky;
  }

  // Compare two positions, return 0 if they are the same, a negative
  // number when a is less, and a positive number otherwise.
  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }

  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }

  function copyPos(x) {return Pos(x.line, x.ch)}
  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }

  // Most of the external API clips given positions to make sure they
  // actually exist within the document.
  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
  function clipPos(doc, pos) {
    if (pos.line < doc.first) { return Pos(doc.first, 0) }
    var last = doc.first + doc.size - 1;
    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
    return clipToLen(pos, getLine(doc, pos.line).text.length)
  }
  function clipToLen(pos, linelen) {
    var ch = pos.ch;
    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
    else if (ch < 0) { return Pos(pos.line, 0) }
    else { return pos }
  }
  function clipPosArray(doc, array) {
    var out = [];
    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
    return out
  }

  var SavedContext = function(state, lookAhead) {
    this.state = state;
    this.lookAhead = lookAhead;
  };

  var Context = function(doc, state, line, lookAhead) {
    this.state = state;
    this.doc = doc;
    this.line = line;
    this.maxLookAhead = lookAhead || 0;
    this.baseTokens = null;
    this.baseTokenPos = 1;
  };

  Context.prototype.lookAhead = function (n) {
    var line = this.doc.getLine(this.line + n);
    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
    return line
  };

  Context.prototype.baseToken = function (n) {
    if (!this.baseTokens) { return null }
    while (this.baseTokens[this.baseTokenPos] <= n)
      { this.baseTokenPos += 2; }
    var type = this.baseTokens[this.baseTokenPos + 1];
    return {type: type && type.replace(/( |^)overlay .*/, ""),
            size: this.baseTokens[this.baseTokenPos] - n}
  };

  Context.prototype.nextLine = function () {
    this.line++;
    if (this.maxLookAhead > 0) { this.maxLookAhead--; }
  };

  Context.fromSaved = function (doc, saved, line) {
    if (saved instanceof SavedContext)
      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
    else
      { return new Context(doc, copyState(doc.mode, saved), line) }
  };

  Context.prototype.save = function (copy) {
    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
  };


  // Compute a style array (an array starting with a mode generation
  // -- for invalidation -- followed by pairs of end positions and
  // style strings), which is used to highlight the tokens on the
  // line.
  function highlightLine(cm, line, context, forceToEnd) {
    // A styles array always starts with a number identifying the
    // mode/overlays that it is based on (for easy invalidation).
    var st = [cm.state.modeGen], lineClasses = {};
    // Compute the base array of styles
    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
            lineClasses, forceToEnd);
    var state = context.state;

    // Run overlays, adjust style array.
    var loop = function ( o ) {
      context.baseTokens = st;
      var overlay = cm.state.overlays[o], i = 1, at = 0;
      context.state = true;
      runMode(cm, line.text, overlay.mode, context, function (end, style) {
        var start = i;
        // Ensure there's a token end at the current position, and that i points at it
        while (at < end) {
          var i_end = st[i];
          if (i_end > end)
            { st.splice(i, 1, end, st[i+1], i_end); }
          i += 2;
          at = Math.min(end, i_end);
        }
        if (!style) { return }
        if (overlay.opaque) {
          st.splice(start, i - start, end, "overlay " + style);
          i = start + 2;
        } else {
          for (; start < i; start += 2) {
            var cur = st[start+1];
            st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
          }
        }
      }, lineClasses);
      context.state = state;
      context.baseTokens = null;
      context.baseTokenPos = 1;
    };

    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );

    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
  }

  function getLineStyles(cm, line, updateFrontier) {
    if (!line.styles || line.styles[0] != cm.state.modeGen) {
      var context = getContextBefore(cm, lineNo(line));
      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
      var result = highlightLine(cm, line, context);
      if (resetState) { context.state = resetState; }
      line.stateAfter = context.save(!resetState);
      line.styles = result.styles;
      if (result.classes) { line.styleClasses = result.classes; }
      else if (line.styleClasses) { line.styleClasses = null; }
      if (updateFrontier === cm.doc.highlightFrontier)
        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
    }
    return line.styles
  }

  function getContextBefore(cm, n, precise) {
    var doc = cm.doc, display = cm.display;
    if (!doc.mode.startState) { return new Context(doc, true, n) }
    var start = findStartLine(cm, n, precise);
    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);

    doc.iter(start, n, function (line) {
      processLine(cm, line.text, context);
      var pos = context.line;
      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
      context.nextLine();
    });
    if (precise) { doc.modeFrontier = context.line; }
    return context
  }

  // Lightweight form of highlight -- proceed over this line and
  // update state, but don't save a style array. Used for lines that
  // aren't currently visible.
  function processLine(cm, text, context, startAt) {
    var mode = cm.doc.mode;
    var stream = new StringStream(text, cm.options.tabSize, context);
    stream.start = stream.pos = startAt || 0;
    if (text == "") { callBlankLine(mode, context.state); }
    while (!stream.eol()) {
      readToken(mode, stream, context.state);
      stream.start = stream.pos;
    }
  }

  function callBlankLine(mode, state) {
    if (mode.blankLine) { return mode.blankLine(state) }
    if (!mode.innerMode) { return }
    var inner = innerMode(mode, state);
    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
  }

  function readToken(mode, stream, state, inner) {
    for (var i = 0; i < 10; i++) {
      if (inner) { inner[0] = innerMode(mode, state).mode; }
      var style = mode.token(stream, state);
      if (stream.pos > stream.start) { return style }
    }
    throw new Error("Mode " + mode.name + " failed to advance stream.")
  }

  var Token = function(stream, type, state) {
    this.start = stream.start; this.end = stream.pos;
    this.string = stream.current();
    this.type = type || null;
    this.state = state;
  };

  // Utility for getTokenAt and getLineTokens
  function takeToken(cm, pos, precise, asArray) {
    var doc = cm.doc, mode = doc.mode, style;
    pos = clipPos(doc, pos);
    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
    if (asArray) { tokens = []; }
    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
      stream.start = stream.pos;
      style = readToken(mode, stream, context.state);
      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
    }
    return asArray ? tokens : new Token(stream, style, context.state)
  }

  function extractLineClasses(type, output) {
    if (type) { for (;;) {
      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
      if (!lineClass) { break }
      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
      var prop = lineClass[1] ? "bgClass" : "textClass";
      if (output[prop] == null)
        { output[prop] = lineClass[2]; }
      else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop]))
        { output[prop] += " " + lineClass[2]; }
    } }
    return type
  }

  // Run the given mode's parser over a line, calling f for each token.
  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
    var flattenSpans = mode.flattenSpans;
    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
    var curStart = 0, curStyle = null;
    var stream = new StringStream(text, cm.options.tabSize, context), style;
    var inner = cm.options.addModeClass && [null];
    if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
    while (!stream.eol()) {
      if (stream.pos > cm.options.maxHighlightLength) {
        flattenSpans = false;
        if (forceToEnd) { processLine(cm, text, context, stream.pos); }
        stream.pos = text.length;
        style = null;
      } else {
        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
      }
      if (inner) {
        var mName = inner[0].name;
        if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
      }
      if (!flattenSpans || curStyle != style) {
        while (curStart < stream.start) {
          curStart = Math.min(stream.start, curStart + 5000);
          f(curStart, curStyle);
        }
        curStyle = style;
      }
      stream.start = stream.pos;
    }
    while (curStart < stream.pos) {
      // Webkit seems to refuse to render text nodes longer than 57444
      // characters, and returns inaccurate measurements in nodes
      // starting around 5000 chars.
      var pos = Math.min(stream.pos, curStart + 5000);
      f(pos, curStyle);
      curStart = pos;
    }
  }

  // Finds the line to start with when starting a parse. Tries to
  // find a line with a stateAfter, so that it can start with a
  // valid state. If that fails, it returns the line with the
  // smallest indentation, which tends to need the least context to
  // parse correctly.
  function findStartLine(cm, n, precise) {
    var minindent, minline, doc = cm.doc;
    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
    for (var search = n; search > lim; --search) {
      if (search <= doc.first) { return doc.first }
      var line = getLine(doc, search - 1), after = line.stateAfter;
      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
        { return search }
      var indented = countColumn(line.text, null, cm.options.tabSize);
      if (minline == null || minindent > indented) {
        minline = search - 1;
        minindent = indented;
      }
    }
    return minline
  }

  function retreatFrontier(doc, n) {
    doc.modeFrontier = Math.min(doc.modeFrontier, n);
    if (doc.highlightFrontier < n - 10) { return }
    var start = doc.first;
    for (var line = n - 1; line > start; line--) {
      var saved = getLine(doc, line).stateAfter;
      // change is on 3
      // state on line 1 looked ahead 2 -- so saw 3
      // test 1 + 2 < 3 should cover this
      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
        start = line + 1;
        break
      }
    }
    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
  }

  // Optimize some code when these features are not used.
  var sawReadOnlySpans = false, sawCollapsedSpans = false;

  function seeReadOnlySpans() {
    sawReadOnlySpans = true;
  }

  function seeCollapsedSpans() {
    sawCollapsedSpans = true;
  }

  // TEXTMARKER SPANS

  function MarkedSpan(marker, from, to) {
    this.marker = marker;
    this.from = from; this.to = to;
  }

  // Search an array of spans for a span matching the given marker.
  function getMarkedSpanFor(spans, marker) {
    if (spans) { for (var i = 0; i < spans.length; ++i) {
      var span = spans[i];
      if (span.marker == marker) { return span }
    } }
  }
  // Remove a span from an array, returning undefined if no spans are
  // left (we don't store arrays for lines without spans).
  function removeMarkedSpan(spans, span) {
    var r;
    for (var i = 0; i < spans.length; ++i)
      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
    return r
  }
  // Add a span to a line.
  function addMarkedSpan(line, span) {
    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
    span.marker.attachLine(line);
  }

  // Used for the algorithm that adjusts markers for a change in the
  // document. These functions cut an array of spans at a given
  // character position, returning an array of remaining chunks (or
  // undefined if nothing remains).
  function markedSpansBefore(old, startCh, isInsert) {
    var nw;
    if (old) { for (var i = 0; i < old.length; ++i) {
      var span = old[i], marker = span.marker;
      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
      }
    } }
    return nw
  }
  function markedSpansAfter(old, endCh, isInsert) {
    var nw;
    if (old) { for (var i = 0; i < old.length; ++i) {
      var span = old[i], marker = span.marker;
      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
                                              span.to == null ? null : span.to - endCh));
      }
    } }
    return nw
  }

  // Given a change object, compute the new set of marker spans that
  // cover the line in which the change took place. Removes spans
  // entirely within the change, reconnects spans belonging to the
  // same marker that appear on both sides of the change, and cuts off
  // spans partially within the change. Returns an array of span
  // arrays with one element for each line in (after) the change.
  function stretchSpansOverChange(doc, change) {
    if (change.full) { return null }
    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
    if (!oldFirst && !oldLast) { return null }

    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
    // Get the spans that 'stick out' on both sides
    var first = markedSpansBefore(oldFirst, startCh, isInsert);
    var last = markedSpansAfter(oldLast, endCh, isInsert);

    // Next, merge those two ends
    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
    if (first) {
      // Fix up .to properties of first
      for (var i = 0; i < first.length; ++i) {
        var span = first[i];
        if (span.to == null) {
          var found = getMarkedSpanFor(last, span.marker);
          if (!found) { span.to = startCh; }
          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
        }
      }
    }
    if (last) {
      // Fix up .from in last (or move them into first in case of sameLine)
      for (var i$1 = 0; i$1 < last.length; ++i$1) {
        var span$1 = last[i$1];
        if (span$1.to != null) { span$1.to += offset; }
        if (span$1.from == null) {
          var found$1 = getMarkedSpanFor(first, span$1.marker);
          if (!found$1) {
            span$1.from = offset;
            if (sameLine) { (first || (first = [])).push(span$1); }
          }
        } else {
          span$1.from += offset;
          if (sameLine) { (first || (first = [])).push(span$1); }
        }
      }
    }
    // Make sure we didn't create any zero-length spans
    if (first) { first = clearEmptySpans(first); }
    if (last && last != first) { last = clearEmptySpans(last); }

    var newMarkers = [first];
    if (!sameLine) {
      // Fill gap with whole-line-spans
      var gap = change.text.length - 2, gapMarkers;
      if (gap > 0 && first)
        { for (var i$2 = 0; i$2 < first.length; ++i$2)
          { if (first[i$2].to == null)
            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
      for (var i$3 = 0; i$3 < gap; ++i$3)
        { newMarkers.push(gapMarkers); }
      newMarkers.push(last);
    }
    return newMarkers
  }

  // Remove spans that are empty and don't have a clearWhenEmpty
  // option of false.
  function clearEmptySpans(spans) {
    for (var i = 0; i < spans.length; ++i) {
      var span = spans[i];
      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
        { spans.splice(i--, 1); }
    }
    if (!spans.length) { return null }
    return spans
  }

  // Used to 'clip' out readOnly ranges when making a change.
  function removeReadOnlyRanges(doc, from, to) {
    var markers = null;
    doc.iter(from.line, to.line + 1, function (line) {
      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
        var mark = line.markedSpans[i].marker;
        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
          { (markers || (markers = [])).push(mark); }
      } }
    });
    if (!markers) { return null }
    var parts = [{from: from, to: to}];
    for (var i = 0; i < markers.length; ++i) {
      var mk = markers[i], m = mk.find(0);
      for (var j = 0; j < parts.length; ++j) {
        var p = parts[j];
        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
          { newParts.push({from: p.from, to: m.from}); }
        if (dto > 0 || !mk.inclusiveRight && !dto)
          { newParts.push({from: m.to, to: p.to}); }
        parts.splice.apply(parts, newParts);
        j += newParts.length - 3;
      }
    }
    return parts
  }

  // Connect or disconnect spans from a line.
  function detachMarkedSpans(line) {
    var spans = line.markedSpans;
    if (!spans) { return }
    for (var i = 0; i < spans.length; ++i)
      { spans[i].marker.detachLine(line); }
    line.markedSpans = null;
  }
  function attachMarkedSpans(line, spans) {
    if (!spans) { return }
    for (var i = 0; i < spans.length; ++i)
      { spans[i].marker.attachLine(line); }
    line.markedSpans = spans;
  }

  // Helpers used when computing which overlapping collapsed span
  // counts as the larger one.
  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }

  // Returns a number indicating which of two overlapping collapsed
  // spans is larger (and thus includes the other). Falls back to
  // comparing ids when the spans cover exactly the same range.
  function compareCollapsedMarkers(a, b) {
    var lenDiff = a.lines.length - b.lines.length;
    if (lenDiff != 0) { return lenDiff }
    var aPos = a.find(), bPos = b.find();
    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
    if (fromCmp) { return -fromCmp }
    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
    if (toCmp) { return toCmp }
    return b.id - a.id
  }

  // Find out whether a line ends or starts in a collapsed span. If
  // so, return the marker for that span.
  function collapsedSpanAtSide(line, start) {
    var sps = sawCollapsedSpans && line.markedSpans, found;
    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
      sp = sps[i];
      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
        { found = sp.marker; }
    } }
    return found
  }
  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }

  function collapsedSpanAround(line, ch) {
    var sps = sawCollapsedSpans && line.markedSpans, found;
    if (sps) { for (var i = 0; i < sps.length; ++i) {
      var sp = sps[i];
      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
    } }
    return found
  }

  // Test whether there exists a collapsed span that partially
  // overlaps (covers the start or end, but not both) of a new span.
  // Such overlap is not allowed.
  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
    var line = getLine(doc, lineNo);
    var sps = sawCollapsedSpans && line.markedSpans;
    if (sps) { for (var i = 0; i < sps.length; ++i) {
      var sp = sps[i];
      if (!sp.marker.collapsed) { continue }
      var found = sp.marker.find(0);
      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
        { return true }
    } }
  }

  // A visual line is a line as drawn on the screen. Folding, for
  // example, can cause multiple logical lines to appear on the same
  // visual line. This finds the start of the visual line that the
  // given line is part of (usually that is the line itself).
  function visualLine(line) {
    var merged;
    while (merged = collapsedSpanAtStart(line))
      { line = merged.find(-1, true).line; }
    return line
  }

  function visualLineEnd(line) {
    var merged;
    while (merged = collapsedSpanAtEnd(line))
      { line = merged.find(1, true).line; }
    return line
  }

  // Returns an array of logical lines that continue the visual line
  // started by the argument, or undefined if there are no such lines.
  function visualLineContinued(line) {
    var merged, lines;
    while (merged = collapsedSpanAtEnd(line)) {
      line = merged.find(1, true).line
      ;(lines || (lines = [])).push(line);
    }
    return lines
  }

  // Get the line number of the start of the visual line that the
  // given line number is part of.
  function visualLineNo(doc, lineN) {
    var line = getLine(doc, lineN), vis = visualLine(line);
    if (line == vis) { return lineN }
    return lineNo(vis)
  }

  // Get the line number of the start of the next visual line after
  // the given line.
  function visualLineEndNo(doc, lineN) {
    if (lineN > doc.lastLine()) { return lineN }
    var line = getLine(doc, lineN), merged;
    if (!lineIsHidden(doc, line)) { return lineN }
    while (merged = collapsedSpanAtEnd(line))
      { line = merged.find(1, true).line; }
    return lineNo(line) + 1
  }

  // Compute whether a line is hidden. Lines count as hidden when they
  // are part of a visual line that starts with another line, or when
  // they are entirely covered by collapsed, non-widget span.
  function lineIsHidden(doc, line) {
    var sps = sawCollapsedSpans && line.markedSpans;
    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
      sp = sps[i];
      if (!sp.marker.collapsed) { continue }
      if (sp.from == null) { return true }
      if (sp.marker.widgetNode) { continue }
      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
        { return true }
    } }
  }
  function lineIsHiddenInner(doc, line, span) {
    if (span.to == null) {
      var end = span.marker.find(1, true);
      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
    }
    if (span.marker.inclusiveRight && span.to == line.text.length)
      { return true }
    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
      sp = line.markedSpans[i];
      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
          (sp.to == null || sp.to != span.from) &&
          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
          lineIsHiddenInner(doc, line, sp)) { return true }
    }
  }

  // Find the height above the given line.
  function heightAtLine(lineObj) {
    lineObj = visualLine(lineObj);

    var h = 0, chunk = lineObj.parent;
    for (var i = 0; i < chunk.lines.length; ++i) {
      var line = chunk.lines[i];
      if (line == lineObj) { break }
      else { h += line.height; }
    }
    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
        var cur = p.children[i$1];
        if (cur == chunk) { break }
        else { h += cur.height; }
      }
    }
    return h
  }

  // Compute the character length of a line, taking into account
  // collapsed ranges (see markText) that might hide parts, and join
  // other lines onto it.
  function lineLength(line) {
    if (line.height == 0) { return 0 }
    var len = line.text.length, merged, cur = line;
    while (merged = collapsedSpanAtStart(cur)) {
      var found = merged.find(0, true);
      cur = found.from.line;
      len += found.from.ch - found.to.ch;
    }
    cur = line;
    while (merged = collapsedSpanAtEnd(cur)) {
      var found$1 = merged.find(0, true);
      len -= cur.text.length - found$1.from.ch;
      cur = found$1.to.line;
      len += cur.text.length - found$1.to.ch;
    }
    return len
  }

  // Find the longest line in the document.
  function findMaxLine(cm) {
    var d = cm.display, doc = cm.doc;
    d.maxLine = getLine(doc, doc.first);
    d.maxLineLength = lineLength(d.maxLine);
    d.maxLineChanged = true;
    doc.iter(function (line) {
      var len = lineLength(line);
      if (len > d.maxLineLength) {
        d.maxLineLength = len;
        d.maxLine = line;
      }
    });
  }

  // LINE DATA STRUCTURE

  // Line objects. These hold state related to a line, including
  // highlighting info (the styles array).
  var Line = function(text, markedSpans, estimateHeight) {
    this.text = text;
    attachMarkedSpans(this, markedSpans);
    this.height = estimateHeight ? estimateHeight(this) : 1;
  };

  Line.prototype.lineNo = function () { return lineNo(this) };
  eventMixin(Line);

  // Change the content (text, markers) of a line. Automatically
  // invalidates cached information and tries to re-estimate the
  // line's height.
  function updateLine(line, text, markedSpans, estimateHeight) {
    line.text = text;
    if (line.stateAfter) { line.stateAfter = null; }
    if (line.styles) { line.styles = null; }
    if (line.order != null) { line.order = null; }
    detachMarkedSpans(line);
    attachMarkedSpans(line, markedSpans);
    var estHeight = estimateHeight ? estimateHeight(line) : 1;
    if (estHeight != line.height) { updateLineHeight(line, estHeight); }
  }

  // Detach a line from the document tree and its markers.
  function cleanUpLine(line) {
    line.parent = null;
    detachMarkedSpans(line);
  }

  // Convert a style as returned by a mode (either null, or a string
  // containing one or more styles) to a CSS style. This is cached,
  // and also looks for line-wide styles.
  var styleToClassCache = {}, styleToClassCacheWithMode = {};
  function interpretTokenStyle(style, options) {
    if (!style || /^\s*$/.test(style)) { return null }
    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
    return cache[style] ||
      (cache[style] = style.replace(/\S+/g, "cm-$&"))
  }

  // Render the DOM representation of the text of a line. Also builds
  // up a 'line map', which points at the DOM nodes that represent
  // specific stretches of text, and is used by the measuring code.
  // The returned object contains the DOM node, this map, and
  // information about line-wide styles that were set by the mode.
  function buildLineContent(cm, lineView) {
    // The padding-right forces the element to have a 'border', which
    // is needed on Webkit to be able to get line-level bounding
    // rectangles for it (in measureChar).
    var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
    var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
                   col: 0, pos: 0, cm: cm,
                   trailingSpace: false,
                   splitSpaces: cm.getOption("lineWrapping")};
    lineView.measure = {};

    // Iterate over the logical lines that make up this visual line.
    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
      builder.pos = 0;
      builder.addToken = buildToken;
      // Optionally wire in some hacks into the token-rendering
      // algorithm, to deal with browser quirks.
      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
      builder.map = [];
      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
      if (line.styleClasses) {
        if (line.styleClasses.bgClass)
          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
        if (line.styleClasses.textClass)
          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
      }

      // Ensure at least a single node is present, for measuring.
      if (builder.map.length == 0)
        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }

      // Store the map and a cache object for the current logical line
      if (i == 0) {
        lineView.measure.map = builder.map;
        lineView.measure.cache = {};
      } else {
  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
      }
    }

    // See issue #2901
    if (webkit) {
      var last = builder.content.lastChild;
      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
        { builder.content.className = "cm-tab-wrap-hack"; }
    }

    signal(cm, "renderLine", cm, lineView.line, builder.pre);
    if (builder.pre.className)
      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }

    return builder
  }

  function defaultSpecialCharPlaceholder(ch) {
    var token = elt("span", "\u2022", "cm-invalidchar");
    token.title = "\\u" + ch.charCodeAt(0).toString(16);
    token.setAttribute("aria-label", token.title);
    return token
  }

  // Build up the DOM representation for a single token, and add it to
  // the line map. Takes care to render special characters separately.
  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {
    if (!text) { return }
    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
    var special = builder.cm.state.specialChars, mustWrap = false;
    var content;
    if (!special.test(text)) {
      builder.col += text.length;
      content = document.createTextNode(displayText);
      builder.map.push(builder.pos, builder.pos + text.length, content);
      if (ie && ie_version < 9) { mustWrap = true; }
      builder.pos += text.length;
    } else {
      content = document.createDocumentFragment();
      var pos = 0;
      while (true) {
        special.lastIndex = pos;
        var m = special.exec(text);
        var skipped = m ? m.index - pos : text.length - pos;
        if (skipped) {
          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
          else { content.appendChild(txt); }
          builder.map.push(builder.pos, builder.pos + skipped, txt);
          builder.col += skipped;
          builder.pos += skipped;
        }
        if (!m) { break }
        pos += skipped + 1;
        var txt$1 = (void 0);
        if (m[0] == "\t") {
          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
          txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
          txt$1.setAttribute("role", "presentation");
          txt$1.setAttribute("cm-text", "\t");
          builder.col += tabWidth;
        } else if (m[0] == "\r" || m[0] == "\n") {
          txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
          txt$1.setAttribute("cm-text", m[0]);
          builder.col += 1;
        } else {
          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
          txt$1.setAttribute("cm-text", m[0]);
          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
          else { content.appendChild(txt$1); }
          builder.col += 1;
        }
        builder.map.push(builder.pos, builder.pos + 1, txt$1);
        builder.pos++;
      }
    }
    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
    if (style || startStyle || endStyle || mustWrap || css || attributes) {
      var fullStyle = style || "";
      if (startStyle) { fullStyle += startStyle; }
      if (endStyle) { fullStyle += endStyle; }
      var token = elt("span", [content], fullStyle, css);
      if (attributes) {
        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class")
          { token.setAttribute(attr, attributes[attr]); } }
      }
      return builder.content.appendChild(token)
    }
    builder.content.appendChild(content);
  }

  // Change some spaces to NBSP to prevent the browser from collapsing
  // trailing spaces at the end of a line when rendering text (issue #1362).
  function splitSpaces(text, trailingBefore) {
    if (text.length > 1 && !/  /.test(text)) { return text }
    var spaceBefore = trailingBefore, result = "";
    for (var i = 0; i < text.length; i++) {
      var ch = text.charAt(i);
      if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
        { ch = "\u00a0"; }
      result += ch;
      spaceBefore = ch == " ";
    }
    return result
  }

  // Work around nonsense dimensions being reported for stretches of
  // right-to-left text.
  function buildTokenBadBidi(inner, order) {
    return function (builder, text, style, startStyle, endStyle, css, attributes) {
      style = style ? style + " cm-force-border" : "cm-force-border";
      var start = builder.pos, end = start + text.length;
      for (;;) {
        // Find the part that overlaps with the start of this text
        var part = (void 0);
        for (var i = 0; i < order.length; i++) {
          part = order[i];
          if (part.to > start && part.from <= start) { break }
        }
        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }
        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);
        startStyle = null;
        text = text.slice(part.to - start);
        start = part.to;
      }
    }
  }

  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
    var widget = !ignoreWidget && marker.widgetNode;
    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
      if (!widget)
        { widget = builder.content.appendChild(document.createElement("span")); }
      widget.setAttribute("cm-marker", marker.id);
    }
    if (widget) {
      builder.cm.display.input.setUneditable(widget);
      builder.content.appendChild(widget);
    }
    builder.pos += size;
    builder.trailingSpace = false;
  }

  // Outputs a number of spans to make up a line, taking highlighting
  // and marked text into account.
  function insertLineContent(line, builder, styles) {
    var spans = line.markedSpans, allText = line.text, at = 0;
    if (!spans) {
      for (var i$1 = 1; i$1 < styles.length; i$1+=2)
        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
      return
    }

    var len = allText.length, pos = 0, i = 1, text = "", style, css;
    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;
    for (;;) {
      if (nextChange == pos) { // Update current marker set
        spanStyle = spanEndStyle = spanStartStyle = css = "";
        attributes = null;
        collapsed = null; nextChange = Infinity;
        var foundBookmarks = [], endStyles = (void 0);
        for (var j = 0; j < spans.length; ++j) {
          var sp = spans[j], m = sp.marker;
          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
            foundBookmarks.push(m);
          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
              nextChange = sp.to;
              spanEndStyle = "";
            }
            if (m.className) { spanStyle += " " + m.className; }
            if (m.css) { css = (css ? css + ";" : "") + m.css; }
            if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
            // support for the old title property
            // https://github.com/codemirror/CodeMirror/pull/5673
            if (m.title) { (attributes || (attributes = {})).title = m.title; }
            if (m.attributes) {
              for (var attr in m.attributes)
                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }
            }
            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
              { collapsed = sp; }
          } else if (sp.from > pos && nextChange > sp.from) {
            nextChange = sp.from;
          }
        }
        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }

        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
        if (collapsed && (collapsed.from || 0) == pos) {
          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
                             collapsed.marker, collapsed.from == null);
          if (collapsed.to == null) { return }
          if (collapsed.to == pos) { collapsed = false; }
        }
      }
      if (pos >= len) { break }

      var upto = Math.min(len, nextChange);
      while (true) {
        if (text) {
          var end = pos + text.length;
          if (!collapsed) {
            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes);
          }
          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
          pos = end;
          spanStartStyle = "";
        }
        text = allText.slice(at, at = styles[i++]);
        style = interpretTokenStyle(styles[i++], builder.cm.options);
      }
    }
  }


  // These objects are used to represent the visible (currently drawn)
  // part of the document. A LineView may correspond to multiple
  // logical lines, if those are connected by collapsed ranges.
  function LineView(doc, line, lineN) {
    // The starting line
    this.line = line;
    // Continuing lines, if any
    this.rest = visualLineContinued(line);
    // Number of logical lines in this visual line
    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
    this.node = this.text = null;
    this.hidden = lineIsHidden(doc, line);
  }

  // Create a range of LineView objects for the given lines.
  function buildViewArray(cm, from, to) {
    var array = [], nextPos;
    for (var pos = from; pos < to; pos = nextPos) {
      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
      nextPos = pos + view.size;
      array.push(view);
    }
    return array
  }

  var operationGroup = null;

  function pushOperation(op) {
    if (operationGroup) {
      operationGroup.ops.push(op);
    } else {
      op.ownsGroup = operationGroup = {
        ops: [op],
        delayedCallbacks: []
      };
    }
  }

  function fireCallbacksForOps(group) {
    // Calls delayed callbacks and cursorActivity handlers until no
    // new ones appear
    var callbacks = group.delayedCallbacks, i = 0;
    do {
      for (; i < callbacks.length; i++)
        { callbacks[i].call(null); }
      for (var j = 0; j < group.ops.length; j++) {
        var op = group.ops[j];
        if (op.cursorActivityHandlers)
          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
      }
    } while (i < callbacks.length)
  }

  function finishOperation(op, endCb) {
    var group = op.ownsGroup;
    if (!group) { return }

    try { fireCallbacksForOps(group); }
    finally {
      operationGroup = null;
      endCb(group);
    }
  }

  var orphanDelayedCallbacks = null;

  // Often, we want to signal events at a point where we are in the
  // middle of some work, but don't want the handler to start calling
  // other methods on the editor, which might be in an inconsistent
  // state or simply not expect any other events to happen.
  // signalLater looks whether there are any handlers, and schedules
  // them to be executed when the last operation ends, or, if no
  // operation is active, when a timeout fires.
  function signalLater(emitter, type /*, values...*/) {
    var arr = getHandlers(emitter, type);
    if (!arr.length) { return }
    var args = Array.prototype.slice.call(arguments, 2), list;
    if (operationGroup) {
      list = operationGroup.delayedCallbacks;
    } else if (orphanDelayedCallbacks) {
      list = orphanDelayedCallbacks;
    } else {
      list = orphanDelayedCallbacks = [];
      setTimeout(fireOrphanDelayed, 0);
    }
    var loop = function ( i ) {
      list.push(function () { return arr[i].apply(null, args); });
    };

    for (var i = 0; i < arr.length; ++i)
      loop( i );
  }

  function fireOrphanDelayed() {
    var delayed = orphanDelayedCallbacks;
    orphanDelayedCallbacks = null;
    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
  }

  // When an aspect of a line changes, a string is added to
  // lineView.changes. This updates the relevant part of the line's
  // DOM structure.
  function updateLineForChanges(cm, lineView, lineN, dims) {
    for (var j = 0; j < lineView.changes.length; j++) {
      var type = lineView.changes[j];
      if (type == "text") { updateLineText(cm, lineView); }
      else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
      else if (type == "class") { updateLineClasses(cm, lineView); }
      else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
    }
    lineView.changes = null;
  }

  // Lines with gutter elements, widgets or a background class need to
  // be wrapped, and have the extra elements added to the wrapper div
  function ensureLineWrapped(lineView) {
    if (lineView.node == lineView.text) {
      lineView.node = elt("div", null, null, "position: relative");
      if (lineView.text.parentNode)
        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
      lineView.node.appendChild(lineView.text);
      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
    }
    return lineView.node
  }

  function updateLineBackground(cm, lineView) {
    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
    if (cls) { cls += " CodeMirror-linebackground"; }
    if (lineView.background) {
      if (cls) { lineView.background.className = cls; }
      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
    } else if (cls) {
      var wrap = ensureLineWrapped(lineView);
      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
      cm.display.input.setUneditable(lineView.background);
    }
  }

  // Wrapper around buildLineContent which will reuse the structure
  // in display.externalMeasured when possible.
  function getLineContent(cm, lineView) {
    var ext = cm.display.externalMeasured;
    if (ext && ext.line == lineView.line) {
      cm.display.externalMeasured = null;
      lineView.measure = ext.measure;
      return ext.built
    }
    return buildLineContent(cm, lineView)
  }

  // Redraw the line's text. Interacts with the background and text
  // classes because the mode may output tokens that influence these
  // classes.
  function updateLineText(cm, lineView) {
    var cls = lineView.text.className;
    var built = getLineContent(cm, lineView);
    if (lineView.text == lineView.node) { lineView.node = built.pre; }
    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
    lineView.text = built.pre;
    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
      lineView.bgClass = built.bgClass;
      lineView.textClass = built.textClass;
      updateLineClasses(cm, lineView);
    } else if (cls) {
      lineView.text.className = cls;
    }
  }

  function updateLineClasses(cm, lineView) {
    updateLineBackground(cm, lineView);
    if (lineView.line.wrapClass)
      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
    else if (lineView.node != lineView.text)
      { lineView.node.className = ""; }
    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
    lineView.text.className = textClass || "";
  }

  function updateLineGutter(cm, lineView, lineN, dims) {
    if (lineView.gutter) {
      lineView.node.removeChild(lineView.gutter);
      lineView.gutter = null;
    }
    if (lineView.gutterBackground) {
      lineView.node.removeChild(lineView.gutterBackground);
      lineView.gutterBackground = null;
    }
    if (lineView.line.gutterClass) {
      var wrap = ensureLineWrapped(lineView);
      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
                                      ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
      cm.display.input.setUneditable(lineView.gutterBackground);
      wrap.insertBefore(lineView.gutterBackground, lineView.text);
    }
    var markers = lineView.line.gutterMarkers;
    if (cm.options.lineNumbers || markers) {
      var wrap$1 = ensureLineWrapped(lineView);
      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
      cm.display.input.setUneditable(gutterWrap);
      wrap$1.insertBefore(gutterWrap, lineView.text);
      if (lineView.line.gutterClass)
        { gutterWrap.className += " " + lineView.line.gutterClass; }
      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
        { lineView.lineNumber = gutterWrap.appendChild(
          elt("div", lineNumberFor(cm.options, lineN),
              "CodeMirror-linenumber CodeMirror-gutter-elt",
              ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {
        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];
        if (found)
          { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
                                     ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
      } }
    }
  }

  function updateLineWidgets(cm, lineView, dims) {
    if (lineView.alignable) { lineView.alignable = null; }
    var isWidget = classTest("CodeMirror-linewidget");
    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
      next = node.nextSibling;
      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }
    }
    insertLineWidgets(cm, lineView, dims);
  }

  // Build a line's DOM representation from scratch
  function buildLineElement(cm, lineView, lineN, dims) {
    var built = getLineContent(cm, lineView);
    lineView.text = lineView.node = built.pre;
    if (built.bgClass) { lineView.bgClass = built.bgClass; }
    if (built.textClass) { lineView.textClass = built.textClass; }

    updateLineClasses(cm, lineView);
    updateLineGutter(cm, lineView, lineN, dims);
    insertLineWidgets(cm, lineView, dims);
    return lineView.node
  }

  // A lineView may contain multiple logical lines (when merged by
  // collapsed spans). The widgets for all of them need to be drawn.
  function insertLineWidgets(cm, lineView, dims) {
    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
  }

  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
    if (!line.widgets) { return }
    var wrap = ensureLineWrapped(lineView);
    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : ""));
      if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
      positionLineWidget(widget, node, lineView, dims);
      cm.display.input.setUneditable(node);
      if (allowAbove && widget.above)
        { wrap.insertBefore(node, lineView.gutter || lineView.text); }
      else
        { wrap.appendChild(node); }
      signalLater(widget, "redraw");
    }
  }

  function positionLineWidget(widget, node, lineView, dims) {
    if (widget.noHScroll) {
  (lineView.alignable || (lineView.alignable = [])).push(node);
      var width = dims.wrapperWidth;
      node.style.left = dims.fixedPos + "px";
      if (!widget.coverGutter) {
        width -= dims.gutterTotalWidth;
        node.style.paddingLeft = dims.gutterTotalWidth + "px";
      }
      node.style.width = width + "px";
    }
    if (widget.coverGutter) {
      node.style.zIndex = 5;
      node.style.position = "relative";
      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
    }
  }

  function widgetHeight(widget) {
    if (widget.height != null) { return widget.height }
    var cm = widget.doc.cm;
    if (!cm) { return 0 }
    if (!contains(document.body, widget.node)) {
      var parentStyle = "position: relative;";
      if (widget.coverGutter)
        { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
      if (widget.noHScroll)
        { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
    }
    return widget.height = widget.node.parentNode.offsetHeight
  }

  // Return true when the given mouse event happened in a widget
  function eventInWidget(display, e) {
    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
          (n.parentNode == display.sizer && n != display.mover))
        { return true }
    }
  }

  // POSITION MEASUREMENT

  function paddingTop(display) {return display.lineSpace.offsetTop}
  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
  function paddingH(display) {
    if (display.cachedPaddingH) { return display.cachedPaddingH }
    var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"));
    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
    return data
  }

  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
  function displayWidth(cm) {
    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
  }
  function displayHeight(cm) {
    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
  }

  // Ensure the lineView.wrapping.heights array is populated. This is
  // an array of bottom offsets for the lines that make up a drawn
  // line. When lineWrapping is on, there might be more than one
  // height.
  function ensureLineHeights(cm, lineView, rect) {
    var wrapping = cm.options.lineWrapping;
    var curWidth = wrapping && displayWidth(cm);
    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
      var heights = lineView.measure.heights = [];
      if (wrapping) {
        lineView.measure.width = curWidth;
        var rects = lineView.text.firstChild.getClientRects();
        for (var i = 0; i < rects.length - 1; i++) {
          var cur = rects[i], next = rects[i + 1];
          if (Math.abs(cur.bottom - next.bottom) > 2)
            { heights.push((cur.bottom + next.top) / 2 - rect.top); }
        }
      }
      heights.push(rect.bottom - rect.top);
    }
  }

  // Find a line map (mapping character offsets to text nodes) and a
  // measurement cache for the given line number. (A line view might
  // contain multiple lines when collapsed ranges are present.)
  function mapFromLineView(lineView, line, lineN) {
    if (lineView.line == line)
      { return {map: lineView.measure.map, cache: lineView.measure.cache} }
    for (var i = 0; i < lineView.rest.length; i++)
      { if (lineView.rest[i] == line)
        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
      { if (lineNo(lineView.rest[i$1]) > lineN)
        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
  }

  // Render a line into the hidden node display.externalMeasured. Used
  // when measurement is needed for a line that's not in the viewport.
  function updateExternalMeasurement(cm, line) {
    line = visualLine(line);
    var lineN = lineNo(line);
    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
    view.lineN = lineN;
    var built = view.built = buildLineContent(cm, view);
    view.text = built.pre;
    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
    return view
  }

  // Get a {top, bottom, left, right} box (in line-local coordinates)
  // for a given character.
  function measureChar(cm, line, ch, bias) {
    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
  }

  // Find a line view that corresponds to the given line number.
  function findViewForLine(cm, lineN) {
    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
      { return cm.display.view[findViewIndex(cm, lineN)] }
    var ext = cm.display.externalMeasured;
    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
      { return ext }
  }

  // Measurement can be split in two steps, the set-up work that
  // applies to the whole line, and the measurement of the actual
  // character. Functions like coordsChar, that need to do a lot of
  // measurements in a row, can thus ensure that the set-up work is
  // only done once.
  function prepareMeasureForLine(cm, line) {
    var lineN = lineNo(line);
    var view = findViewForLine(cm, lineN);
    if (view && !view.text) {
      view = null;
    } else if (view && view.changes) {
      updateLineForChanges(cm, view, lineN, getDimensions(cm));
      cm.curOp.forceUpdate = true;
    }
    if (!view)
      { view = updateExternalMeasurement(cm, line); }

    var info = mapFromLineView(view, line, lineN);
    return {
      line: line, view: view, rect: null,
      map: info.map, cache: info.cache, before: info.before,
      hasHeights: false
    }
  }

  // Given a prepared measurement object, measures the position of an
  // actual character (or fetches it from the cache).
  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
    if (prepared.before) { ch = -1; }
    var key = ch + (bias || ""), found;
    if (prepared.cache.hasOwnProperty(key)) {
      found = prepared.cache[key];
    } else {
      if (!prepared.rect)
        { prepared.rect = prepared.view.text.getBoundingClientRect(); }
      if (!prepared.hasHeights) {
        ensureLineHeights(cm, prepared.view, prepared.rect);
        prepared.hasHeights = true;
      }
      found = measureCharInner(cm, prepared, ch, bias);
      if (!found.bogus) { prepared.cache[key] = found; }
    }
    return {left: found.left, right: found.right,
            top: varHeight ? found.rtop : found.top,
            bottom: varHeight ? found.rbottom : found.bottom}
  }

  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};

  function nodeAndOffsetInLineMap(map, ch, bias) {
    var node, start, end, collapse, mStart, mEnd;
    // First, search the line map for the text node corresponding to,
    // or closest to, the target character.
    for (var i = 0; i < map.length; i += 3) {
      mStart = map[i];
      mEnd = map[i + 1];
      if (ch < mStart) {
        start = 0; end = 1;
        collapse = "left";
      } else if (ch < mEnd) {
        start = ch - mStart;
        end = start + 1;
      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
        end = mEnd - mStart;
        start = end - 1;
        if (ch >= mEnd) { collapse = "right"; }
      }
      if (start != null) {
        node = map[i + 2];
        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
          { collapse = bias; }
        if (bias == "left" && start == 0)
          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
            node = map[(i -= 3) + 2];
            collapse = "left";
          } }
        if (bias == "right" && start == mEnd - mStart)
          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
            node = map[(i += 3) + 2];
            collapse = "right";
          } }
        break
      }
    }
    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
  }

  function getUsefulRect(rects, bias) {
    var rect = nullRect;
    if (bias == "left") { for (var i = 0; i < rects.length; i++) {
      if ((rect = rects[i]).left != rect.right) { break }
    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
      if ((rect = rects[i$1]).left != rect.right) { break }
    } }
    return rect
  }

  function measureCharInner(cm, prepared, ch, bias) {
    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;

    var rect;
    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
          { rect = node.parentNode.getBoundingClientRect(); }
        else
          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
        if (rect.left || rect.right || start == 0) { break }
        end = start;
        start = start - 1;
        collapse = "right";
      }
      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
    } else { // If it is a widget, simply get the box for the whole widget.
      if (start > 0) { collapse = bias = "right"; }
      var rects;
      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
        { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
      else
        { rect = node.getBoundingClientRect(); }
    }
    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
      var rSpan = node.parentNode.getClientRects()[0];
      if (rSpan)
        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
      else
        { rect = nullRect; }
    }

    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
    var mid = (rtop + rbot) / 2;
    var heights = prepared.view.measure.heights;
    var i = 0;
    for (; i < heights.length - 1; i++)
      { if (mid < heights[i]) { break } }
    var top = i ? heights[i - 1] : 0, bot = heights[i];
    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
                  top: top, bottom: bot};
    if (!rect.left && !rect.right) { result.bogus = true; }
    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }

    return result
  }

  // Work around problem with bounding client rects on ranges being
  // returned incorrectly when zoomed on IE10 and below.
  function maybeUpdateRectForZooming(measure, rect) {
    if (!window.screen || screen.logicalXDPI == null ||
        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
      { return rect }
    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
    return {left: rect.left * scaleX, right: rect.right * scaleX,
            top: rect.top * scaleY, bottom: rect.bottom * scaleY}
  }

  function clearLineMeasurementCacheFor(lineView) {
    if (lineView.measure) {
      lineView.measure.cache = {};
      lineView.measure.heights = null;
      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
        { lineView.measure.caches[i] = {}; } }
    }
  }

  function clearLineMeasurementCache(cm) {
    cm.display.externalMeasure = null;
    removeChildren(cm.display.lineMeasure);
    for (var i = 0; i < cm.display.view.length; i++)
      { clearLineMeasurementCacheFor(cm.display.view[i]); }
  }

  function clearCaches(cm) {
    clearLineMeasurementCache(cm);
    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
    cm.display.lineNumChars = null;
  }

  function pageScrollX() {
    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
    // which causes page_Offset and bounding client rects to use
    // different reference viewports and invalidate our calculations.
    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
    return window.pageXOffset || (document.documentElement || document.body).scrollLeft
  }
  function pageScrollY() {
    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
    return window.pageYOffset || (document.documentElement || document.body).scrollTop
  }

  function widgetTopHeight(lineObj) {
    var height = 0;
    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)
      { height += widgetHeight(lineObj.widgets[i]); } } }
    return height
  }

  // Converts a {top, bottom, left, right} box from line-local
  // coordinates into another coordinate system. Context may be one of
  // "line", "div" (display.lineDiv), "local"./null (editor), "window",
  // or "page".
  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
    if (!includeWidgets) {
      var height = widgetTopHeight(lineObj);
      rect.top += height; rect.bottom += height;
    }
    if (context == "line") { return rect }
    if (!context) { context = "local"; }
    var yOff = heightAtLine(lineObj);
    if (context == "local") { yOff += paddingTop(cm.display); }
    else { yOff -= cm.display.viewOffset; }
    if (context == "page" || context == "window") {
      var lOff = cm.display.lineSpace.getBoundingClientRect();
      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
      rect.left += xOff; rect.right += xOff;
    }
    rect.top += yOff; rect.bottom += yOff;
    return rect
  }

  // Coverts a box from "div" coords to another coordinate system.
  // Context may be "window", "page", "div", or "local"./null.
  function fromCoordSystem(cm, coords, context) {
    if (context == "div") { return coords }
    var left = coords.left, top = coords.top;
    // First move into "page" coordinate system
    if (context == "page") {
      left -= pageScrollX();
      top -= pageScrollY();
    } else if (context == "local" || !context) {
      var localBox = cm.display.sizer.getBoundingClientRect();
      left += localBox.left;
      top += localBox.top;
    }

    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
  }

  function charCoords(cm, pos, context, lineObj, bias) {
    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
  }

  // Returns a box for a given cursor position, which may have an
  // 'other' property containing the position of the secondary cursor
  // on a bidi boundary.
  // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
  // and after `char - 1` in writing order of `char - 1`
  // A cursor Pos(line, char, "after") is on the same visual line as `char`
  // and before `char` in writing order of `char`
  // Examples (upper-case letters are RTL, lower-case are LTR):
  //     Pos(0, 1, ...)
  //     before   after
  // ab     a|b     a|b
  // aB     a|B     aB|
  // Ab     |Ab     A|b
  // AB     B|A     B|A
  // Every position after the last character on a line is considered to stick
  // to the last character on the line.
  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
    lineObj = lineObj || getLine(cm.doc, pos.line);
    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
    function get(ch, right) {
      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
      if (right) { m.left = m.right; } else { m.right = m.left; }
      return intoCoordSystem(cm, lineObj, m, context)
    }
    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
    if (ch >= lineObj.text.length) {
      ch = lineObj.text.length;
      sticky = "before";
    } else if (ch <= 0) {
      ch = 0;
      sticky = "after";
    }
    if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }

    function getBidi(ch, partPos, invert) {
      var part = order[partPos], right = part.level == 1;
      return get(invert ? ch - 1 : ch, right != invert)
    }
    var partPos = getBidiPartAt(order, ch, sticky);
    var other = bidiOther;
    var val = getBidi(ch, partPos, sticky == "before");
    if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
    return val
  }

  // Used to cheaply estimate the coordinates for a position. Used for
  // intermediate scroll updates.
  function estimateCoords(cm, pos) {
    var left = 0;
    pos = clipPos(cm.doc, pos);
    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
    var lineObj = getLine(cm.doc, pos.line);
    var top = heightAtLine(lineObj) + paddingTop(cm.display);
    return {left: left, right: left, top: top, bottom: top + lineObj.height}
  }

  // Positions returned by coordsChar contain some extra information.
  // xRel is the relative x position of the input coordinates compared
  // to the found position (so xRel > 0 means the coordinates are to
  // the right of the character position, for example). When outside
  // is true, that means the coordinates lie outside the line's
  // vertical range.
  function PosWithInfo(line, ch, sticky, outside, xRel) {
    var pos = Pos(line, ch, sticky);
    pos.xRel = xRel;
    if (outside) { pos.outside = outside; }
    return pos
  }

  // Compute the character position closest to the given coordinates.
  // Input must be lineSpace-local ("div" coordinate system).
  function coordsChar(cm, x, y) {
    var doc = cm.doc;
    y += cm.display.viewOffset;
    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }
    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
    if (lineN > last)
      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }
    if (x < 0) { x = 0; }

    var lineObj = getLine(doc, lineN);
    for (;;) {
      var found = coordsCharInner(cm, lineObj, lineN, x, y);
      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));
      if (!collapsed) { return found }
      var rangeEnd = collapsed.find(1);
      if (rangeEnd.line == lineN) { return rangeEnd }
      lineObj = getLine(doc, lineN = rangeEnd.line);
    }
  }

  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
    y -= widgetTopHeight(lineObj);
    var end = lineObj.text.length;
    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);
    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);
    return {begin: begin, end: end}
  }

  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
  }

  // Returns true if the given side of a box is after the given
  // coordinates, in top-to-bottom, left-to-right order.
  function boxIsAfter(box, x, y, left) {
    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
  }

  function coordsCharInner(cm, lineObj, lineNo, x, y) {
    // Move y into line-local coordinate space
    y -= heightAtLine(lineObj);
    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
    // When directly calling `measureCharPrepared`, we have to adjust
    // for the widgets at this line.
    var widgetHeight = widgetTopHeight(lineObj);
    var begin = 0, end = lineObj.text.length, ltr = true;

    var order = getOrder(lineObj, cm.doc.direction);
    // If the line isn't plain left-to-right text, first figure out
    // which bidi section the coordinates fall into.
    if (order) {
      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);
      ltr = part.level != 1;
      // The awkward -1 offsets are needed because findFirst (called
      // on these below) will treat its first bound as inclusive,
      // second as exclusive, but we want to actually address the
      // characters in the part's range
      begin = ltr ? part.from : part.to - 1;
      end = ltr ? part.to : part.from - 1;
    }

    // A binary search to find the first character whose bounding box
    // starts after the coordinates. If we run across any whose box wrap
    // the coordinates, store that.
    var chAround = null, boxAround = null;
    var ch = findFirst(function (ch) {
      var box = measureCharPrepared(cm, preparedMeasure, ch);
      box.top += widgetHeight; box.bottom += widgetHeight;
      if (!boxIsAfter(box, x, y, false)) { return false }
      if (box.top <= y && box.left <= x) {
        chAround = ch;
        boxAround = box;
      }
      return true
    }, begin, end);

    var baseX, sticky, outside = false;
    // If a box around the coordinates was found, use that
    if (boxAround) {
      // Distinguish coordinates nearer to the left or right side of the box
      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;
      ch = chAround + (atStart ? 0 : 1);
      sticky = atStart ? "after" : "before";
      baseX = atLeft ? boxAround.left : boxAround.right;
    } else {
      // (Adjust for extended bound, if necessary.)
      if (!ltr && (ch == end || ch == begin)) { ch++; }
      // To determine which side to associate with, get the box to the
      // left of the character and compare it's vertical position to the
      // coordinates
      sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" :
        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?
        "after" : "before";
      // Now get accurate coordinates for this place, in order to get a
      // base X position
      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure);
      baseX = coords.left;
      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;
    }

    ch = skipExtendingChars(lineObj.text, ch, 1);
    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)
  }

  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {
    // Bidi parts are sorted left-to-right, and in a non-line-wrapping
    // situation, we can take this ordering to correspond to the visual
    // ordering. This finds the first part whose end is after the given
    // coordinates.
    var index = findFirst(function (i) {
      var part = order[i], ltr = part.level != 1;
      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"),
                                     "line", lineObj, preparedMeasure), x, y, true)
    }, 0, order.length - 1);
    var part = order[index];
    // If this isn't the first part, the part's start is also after
    // the coordinates, and the coordinates aren't on the same line as
    // that start, move one part back.
    if (index > 0) {
      var ltr = part.level != 1;
      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"),
                               "line", lineObj, preparedMeasure);
      if (boxIsAfter(start, x, y, true) && start.top > y)
        { part = order[index - 1]; }
    }
    return part
  }

  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {
    // In a wrapped line, rtl text on wrapping boundaries can do things
    // that don't correspond to the ordering in our `order` array at
    // all, so a binary search doesn't work, and we want to return a
    // part that only spans one line so that the binary search in
    // coordsCharInner is safe. As such, we first find the extent of the
    // wrapped line, and then do a flat search in which we discard any
    // spans that aren't on the line.
    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);
    var begin = ref.begin;
    var end = ref.end;
    if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; }
    var part = null, closestDist = null;
    for (var i = 0; i < order.length; i++) {
      var p = order[i];
      if (p.from >= end || p.to <= begin) { continue }
      var ltr = p.level != 1;
      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;
      // Weigh against spans ending before this, so that they are only
      // picked if nothing ends after
      var dist = endX < x ? x - endX + 1e9 : endX - x;
      if (!part || closestDist > dist) {
        part = p;
        closestDist = dist;
      }
    }
    if (!part) { part = order[order.length - 1]; }
    // Clip the part to the wrapped line.
    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }
    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }
    return part
  }

  var measureText;
  // Compute the default text height.
  function textHeight(display) {
    if (display.cachedTextHeight != null) { return display.cachedTextHeight }
    if (measureText == null) {
      measureText = elt("pre", null, "CodeMirror-line-like");
      // Measure a bunch of lines, for browsers that compute
      // fractional heights.
      for (var i = 0; i < 49; ++i) {
        measureText.appendChild(document.createTextNode("x"));
        measureText.appendChild(elt("br"));
      }
      measureText.appendChild(document.createTextNode("x"));
    }
    removeChildrenAndAdd(display.measure, measureText);
    var height = measureText.offsetHeight / 50;
    if (height > 3) { display.cachedTextHeight = height; }
    removeChildren(display.measure);
    return height || 1
  }

  // Compute the default character width.
  function charWidth(display) {
    if (display.cachedCharWidth != null) { return display.cachedCharWidth }
    var anchor = elt("span", "xxxxxxxxxx");
    var pre = elt("pre", [anchor], "CodeMirror-line-like");
    removeChildrenAndAdd(display.measure, pre);
    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
    if (width > 2) { display.cachedCharWidth = width; }
    return width || 10
  }

  // Do a bulk-read of the DOM positions and sizes needed to draw the
  // view, so that we don't interleave reading and writing to the DOM.
  function getDimensions(cm) {
    var d = cm.display, left = {}, width = {};
    var gutterLeft = d.gutters.clientLeft;
    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
      var id = cm.display.gutterSpecs[i].className;
      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;
      width[id] = n.clientWidth;
    }
    return {fixedPos: compensateForHScroll(d),
            gutterTotalWidth: d.gutters.offsetWidth,
            gutterLeft: left,
            gutterWidth: width,
            wrapperWidth: d.wrapper.clientWidth}
  }

  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
  // but using getBoundingClientRect to get a sub-pixel-accurate
  // result.
  function compensateForHScroll(display) {
    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left
  }

  // Returns a function that estimates the height of a line, to use as
  // first approximation until the line becomes visible (and is thus
  // properly measurable).
  function estimateHeight(cm) {
    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
    return function (line) {
      if (lineIsHidden(cm.doc, line)) { return 0 }

      var widgetsHeight = 0;
      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {
        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }
      } }

      if (wrapping)
        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }
      else
        { return widgetsHeight + th }
    }
  }

  function estimateLineHeights(cm) {
    var doc = cm.doc, est = estimateHeight(cm);
    doc.iter(function (line) {
      var estHeight = est(line);
      if (estHeight != line.height) { updateLineHeight(line, estHeight); }
    });
  }

  // Given a mouse event, find the corresponding position. If liberal
  // is false, it checks whether a gutter or scrollbar was clicked,
  // and returns null if it was. forRect is used by rectangular
  // selections, and tries to estimate a character position even for
  // coordinates beyond the right of the text.
  function posFromMouse(cm, e, liberal, forRect) {
    var display = cm.display;
    if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null }

    var x, y, space = display.lineSpace.getBoundingClientRect();
    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
    try { x = e.clientX - space.left; y = e.clientY - space.top; }
    catch (e$1) { return null }
    var coords = coordsChar(cm, x, y), line;
    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
    }
    return coords
  }

  // Find the view element corresponding to a given line. Return null
  // when the line isn't visible.
  function findViewIndex(cm, n) {
    if (n >= cm.display.viewTo) { return null }
    n -= cm.display.viewFrom;
    if (n < 0) { return null }
    var view = cm.display.view;
    for (var i = 0; i < view.length; i++) {
      n -= view[i].size;
      if (n < 0) { return i }
    }
  }

  // Updates the display.view data structure for a given change to the
  // document. From and to are in pre-change coordinates. Lendiff is
  // the amount of lines added or subtracted by the change. This is
  // used for changes that span multiple lines, or change the way
  // lines are divided into visual lines. regLineChange (below)
  // registers single-line changes.
  function regChange(cm, from, to, lendiff) {
    if (from == null) { from = cm.doc.first; }
    if (to == null) { to = cm.doc.first + cm.doc.size; }
    if (!lendiff) { lendiff = 0; }

    var display = cm.display;
    if (lendiff && to < display.viewTo &&
        (display.updateLineNumbers == null || display.updateLineNumbers > from))
      { display.updateLineNumbers = from; }

    cm.curOp.viewChanged = true;

    if (from >= display.viewTo) { // Change after
      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
        { resetView(cm); }
    } else if (to <= display.viewFrom) { // Change before
      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
        resetView(cm);
      } else {
        display.viewFrom += lendiff;
        display.viewTo += lendiff;
      }
    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
      resetView(cm);
    } else if (from <= display.viewFrom) { // Top overlap
      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
      if (cut) {
        display.view = display.view.slice(cut.index);
        display.viewFrom = cut.lineN;
        display.viewTo += lendiff;
      } else {
        resetView(cm);
      }
    } else if (to >= display.viewTo) { // Bottom overlap
      var cut$1 = viewCuttingPoint(cm, from, from, -1);
      if (cut$1) {
        display.view = display.view.slice(0, cut$1.index);
        display.viewTo = cut$1.lineN;
      } else {
        resetView(cm);
      }
    } else { // Gap in the middle
      var cutTop = viewCuttingPoint(cm, from, from, -1);
      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
      if (cutTop && cutBot) {
        display.view = display.view.slice(0, cutTop.index)
          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
          .concat(display.view.slice(cutBot.index));
        display.viewTo += lendiff;
      } else {
        resetView(cm);
      }
    }

    var ext = display.externalMeasured;
    if (ext) {
      if (to < ext.lineN)
        { ext.lineN += lendiff; }
      else if (from < ext.lineN + ext.size)
        { display.externalMeasured = null; }
    }
  }

  // Register a change to a single line. Type must be one of "text",
  // "gutter", "class", "widget"
  function regLineChange(cm, line, type) {
    cm.curOp.viewChanged = true;
    var display = cm.display, ext = cm.display.externalMeasured;
    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
      { display.externalMeasured = null; }

    if (line < display.viewFrom || line >= display.viewTo) { return }
    var lineView = display.view[findViewIndex(cm, line)];
    if (lineView.node == null) { return }
    var arr = lineView.changes || (lineView.changes = []);
    if (indexOf(arr, type) == -1) { arr.push(type); }
  }

  // Clear the view.
  function resetView(cm) {
    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
    cm.display.view = [];
    cm.display.viewOffset = 0;
  }

  function viewCuttingPoint(cm, oldN, newN, dir) {
    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
      { return {index: index, lineN: newN} }
    var n = cm.display.viewFrom;
    for (var i = 0; i < index; i++)
      { n += view[i].size; }
    if (n != oldN) {
      if (dir > 0) {
        if (index == view.length - 1) { return null }
        diff = (n + view[index].size) - oldN;
        index++;
      } else {
        diff = n - oldN;
      }
      oldN += diff; newN += diff;
    }
    while (visualLineNo(cm.doc, newN) != newN) {
      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }
      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
      index += dir;
    }
    return {index: index, lineN: newN}
  }

  // Force the view to cover a given range, adding empty view element
  // or clipping off existing ones as needed.
  function adjustView(cm, from, to) {
    var display = cm.display, view = display.view;
    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
      display.view = buildViewArray(cm, from, to);
      display.viewFrom = from;
    } else {
      if (display.viewFrom > from)
        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }
      else if (display.viewFrom < from)
        { display.view = display.view.slice(findViewIndex(cm, from)); }
      display.viewFrom = from;
      if (display.viewTo < to)
        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }
      else if (display.viewTo > to)
        { display.view = display.view.slice(0, findViewIndex(cm, to)); }
    }
    display.viewTo = to;
  }

  // Count the number of lines in the view whose DOM representation is
  // out of date (or nonexistent).
  function countDirtyView(cm) {
    var view = cm.display.view, dirty = 0;
    for (var i = 0; i < view.length; i++) {
      var lineView = view[i];
      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }
    }
    return dirty
  }

  function updateSelection(cm) {
    cm.display.input.showSelection(cm.display.input.prepareSelection());
  }

  function prepareSelection(cm, primary) {
    if ( primary === void 0 ) primary = true;

    var doc = cm.doc, result = {};
    var curFragment = result.cursors = document.createDocumentFragment();
    var selFragment = result.selection = document.createDocumentFragment();

    for (var i = 0; i < doc.sel.ranges.length; i++) {
      if (!primary && i == doc.sel.primIndex) { continue }
      var range = doc.sel.ranges[i];
      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }
      var collapsed = range.empty();
      if (collapsed || cm.options.showCursorWhenSelecting)
        { drawSelectionCursor(cm, range.head, curFragment); }
      if (!collapsed)
        { drawSelectionRange(cm, range, selFragment); }
    }
    return result
  }

  // Draws a cursor for the given range
  function drawSelectionCursor(cm, head, output) {
    var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);

    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
    cursor.style.left = pos.left + "px";
    cursor.style.top = pos.top + "px";
    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";

    if (pos.other) {
      // Secondary cursor, shown when on a 'jump' in bi-directional text
      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
      otherCursor.style.display = "";
      otherCursor.style.left = pos.other.left + "px";
      otherCursor.style.top = pos.other.top + "px";
      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
    }
  }

  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }

  // Draws the given range as a highlighted selection
  function drawSelectionRange(cm, range, output) {
    var display = cm.display, doc = cm.doc;
    var fragment = document.createDocumentFragment();
    var padding = paddingH(cm.display), leftSide = padding.left;
    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
    var docLTR = doc.direction == "ltr";

    function add(left, top, width, bottom) {
      if (top < 0) { top = 0; }
      top = Math.round(top);
      bottom = Math.round(bottom);
      fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n                             top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n                             height: " + (bottom - top) + "px")));
    }

    function drawForLine(line, fromArg, toArg) {
      var lineObj = getLine(doc, line);
      var lineLen = lineObj.text.length;
      var start, end;
      function coords(ch, bias) {
        return charCoords(cm, Pos(line, ch), "div", lineObj, bias)
      }

      function wrapX(pos, dir, side) {
        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);
        var prop = (dir == "ltr") == (side == "after") ? "left" : "right";
        var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);
        return coords(ch, prop)[prop]
      }

      var order = getOrder(lineObj, doc.direction);
      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {
        var ltr = dir == "ltr";
        var fromPos = coords(from, ltr ? "left" : "right");
        var toPos = coords(to - 1, ltr ? "right" : "left");

        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;
        var first = i == 0, last = !order || i == order.length - 1;
        if (toPos.top - fromPos.top <= 3) { // Single line
          var openLeft = (docLTR ? openStart : openEnd) && first;
          var openRight = (docLTR ? openEnd : openStart) && last;
          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;
          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;
          add(left, fromPos.top, right - left, fromPos.bottom);
        } else { // Multiple lines
          var topLeft, topRight, botLeft, botRight;
          if (ltr) {
            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;
            topRight = docLTR ? rightSide : wrapX(from, dir, "before");
            botLeft = docLTR ? leftSide : wrapX(to, dir, "after");
            botRight = docLTR && openEnd && last ? rightSide : toPos.right;
          } else {
            topLeft = !docLTR ? leftSide : wrapX(from, dir, "before");
            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;
            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;
            botRight = !docLTR ? rightSide : wrapX(to, dir, "after");
          }
          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);
          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }
          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);
        }

        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }
        if (cmpCoords(toPos, start) < 0) { start = toPos; }
        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }
        if (cmpCoords(toPos, end) < 0) { end = toPos; }
      });
      return {start: start, end: end}
    }

    var sFrom = range.from(), sTo = range.to();
    if (sFrom.line == sTo.line) {
      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
    } else {
      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
      var singleVLine = visualLine(fromLine) == visualLine(toLine);
      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
      if (singleVLine) {
        if (leftEnd.top < rightStart.top - 2) {
          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
        } else {
          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
        }
      }
      if (leftEnd.bottom < rightStart.top)
        { add(leftSide, leftEnd.bottom, null, rightStart.top); }
    }

    output.appendChild(fragment);
  }

  // Cursor-blinking
  function restartBlink(cm) {
    if (!cm.state.focused) { return }
    var display = cm.display;
    clearInterval(display.blinker);
    var on = true;
    display.cursorDiv.style.visibility = "";
    if (cm.options.cursorBlinkRate > 0)
      { display.blinker = setInterval(function () {
        if (!cm.hasFocus()) { onBlur(cm); }
        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
      }, cm.options.cursorBlinkRate); }
    else if (cm.options.cursorBlinkRate < 0)
      { display.cursorDiv.style.visibility = "hidden"; }
  }

  function ensureFocus(cm) {
    if (!cm.hasFocus()) {
      cm.display.input.focus();
      if (!cm.state.focused) { onFocus(cm); }
    }
  }

  function delayBlurEvent(cm) {
    cm.state.delayingBlurEvent = true;
    setTimeout(function () { if (cm.state.delayingBlurEvent) {
      cm.state.delayingBlurEvent = false;
      if (cm.state.focused) { onBlur(cm); }
    } }, 100);
  }

  function onFocus(cm, e) {
    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }

    if (cm.options.readOnly == "nocursor") { return }
    if (!cm.state.focused) {
      signal(cm, "focus", cm, e);
      cm.state.focused = true;
      addClass(cm.display.wrapper, "CodeMirror-focused");
      // This test prevents this from firing when a context
      // menu is closed (since the input reset would kill the
      // select-all detection hack)
      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
        cm.display.input.reset();
        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730
      }
      cm.display.input.receivedFocus();
    }
    restartBlink(cm);
  }
  function onBlur(cm, e) {
    if (cm.state.delayingBlurEvent) { return }

    if (cm.state.focused) {
      signal(cm, "blur", cm, e);
      cm.state.focused = false;
      rmClass(cm.display.wrapper, "CodeMirror-focused");
    }
    clearInterval(cm.display.blinker);
    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);
  }

  // Read the actual heights of the rendered lines, and update their
  // stored heights to match.
  function updateHeightsInViewport(cm) {
    var display = cm.display;
    var prevBottom = display.lineDiv.offsetTop;
    for (var i = 0; i < display.view.length; i++) {
      var cur = display.view[i], wrapping = cm.options.lineWrapping;
      var height = (void 0), width = 0;
      if (cur.hidden) { continue }
      if (ie && ie_version < 8) {
        var bot = cur.node.offsetTop + cur.node.offsetHeight;
        height = bot - prevBottom;
        prevBottom = bot;
      } else {
        var box = cur.node.getBoundingClientRect();
        height = box.bottom - box.top;
        // Check that lines don't extend past the right of the current
        // editor width
        if (!wrapping && cur.text.firstChild)
          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }
      }
      var diff = cur.line.height - height;
      if (diff > .005 || diff < -.005) {
        updateLineHeight(cur.line, height);
        updateWidgetHeight(cur.line);
        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)
          { updateWidgetHeight(cur.rest[j]); } }
      }
      if (width > cm.display.sizerWidth) {
        var chWidth = Math.ceil(width / charWidth(cm.display));
        if (chWidth > cm.display.maxLineLength) {
          cm.display.maxLineLength = chWidth;
          cm.display.maxLine = cur.line;
          cm.display.maxLineChanged = true;
        }
      }
    }
  }

  // Read and store the height of line widgets associated with the
  // given line.
  function updateWidgetHeight(line) {
    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {
      var w = line.widgets[i], parent = w.node.parentNode;
      if (parent) { w.height = parent.offsetHeight; }
    } }
  }

  // Compute the lines that are visible in a given viewport (defaults
  // the the current scroll position). viewport may contain top,
  // height, and ensure (see op.scrollToPos) properties.
  function visibleLines(display, doc, viewport) {
    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
    top = Math.floor(top - paddingTop(display));
    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;

    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
    // forces those lines into the viewport (if possible).
    if (viewport && viewport.ensure) {
      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
      if (ensureFrom < from) {
        from = ensureFrom;
        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
        to = ensureTo;
      }
    }
    return {from: from, to: Math.max(to, from + 1)}
  }

  // SCROLLING THINGS INTO VIEW

  // If an editor sits on the top or bottom of the window, partially
  // scrolled out of view, this ensures that the cursor is visible.
  function maybeScrollWindow(cm, rect) {
    if (signalDOMEvent(cm, "scrollCursorIntoView")) { return }

    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
    if (rect.top + box.top < 0) { doScroll = true; }
    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }
    if (doScroll != null && !phantom) {
      var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n                         top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n                         height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n                         left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;"));
      cm.display.lineSpace.appendChild(scrollNode);
      scrollNode.scrollIntoView(doScroll);
      cm.display.lineSpace.removeChild(scrollNode);
    }
  }

  // Scroll a given position into view (immediately), verifying that
  // it actually became visible (as line heights are accurately
  // measured, the position of something may 'drift' during drawing).
  function scrollPosIntoView(cm, pos, end, margin) {
    if (margin == null) { margin = 0; }
    var rect;
    if (!cm.options.lineWrapping && pos == end) {
      // Set pos and end to the cursor positions around the character pos sticks to
      // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
      // If pos == Pos(_, 0, "before"), pos and end are unchanged
      pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
      end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
    }
    for (var limit = 0; limit < 5; limit++) {
      var changed = false;
      var coords = cursorCoords(cm, pos);
      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
      rect = {left: Math.min(coords.left, endCoords.left),
              top: Math.min(coords.top, endCoords.top) - margin,
              right: Math.max(coords.left, endCoords.left),
              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};
      var scrollPos = calculateScrollPos(cm, rect);
      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
      if (scrollPos.scrollTop != null) {
        updateScrollTop(cm, scrollPos.scrollTop);
        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }
      }
      if (scrollPos.scrollLeft != null) {
        setScrollLeft(cm, scrollPos.scrollLeft);
        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }
      }
      if (!changed) { break }
    }
    return rect
  }

  // Scroll a given set of coordinates into view (immediately).
  function scrollIntoView(cm, rect) {
    var scrollPos = calculateScrollPos(cm, rect);
    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }
    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }
  }

  // Calculate a new scroll position needed to scroll the given
  // rectangle into view. Returns an object with scrollTop and
  // scrollLeft properties. When these are undefined, the
  // vertical/horizontal position does not need to be adjusted.
  function calculateScrollPos(cm, rect) {
    var display = cm.display, snapMargin = textHeight(cm.display);
    if (rect.top < 0) { rect.top = 0; }
    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
    var screen = displayHeight(cm), result = {};
    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }
    var docBottom = cm.doc.height + paddingVert(display);
    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;
    if (rect.top < screentop) {
      result.scrollTop = atTop ? 0 : rect.top;
    } else if (rect.bottom > screentop + screen) {
      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);
      if (newTop != screentop) { result.scrollTop = newTop; }
    }

    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;
    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;
    var screenw = displayWidth(cm) - display.gutters.offsetWidth;
    var tooWide = rect.right - rect.left > screenw;
    if (tooWide) { rect.right = rect.left + screenw; }
    if (rect.left < 10)
      { result.scrollLeft = 0; }
    else if (rect.left < screenleft)
      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }
    else if (rect.right > screenw + screenleft - 3)
      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
    return result
  }

  // Store a relative adjustment to the scroll position in the current
  // operation (to be applied when the operation finishes).
  function addToScrollTop(cm, top) {
    if (top == null) { return }
    resolveScrollToPos(cm);
    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
  }

  // Make sure that at the end of the operation the current cursor is
  // shown.
  function ensureCursorVisible(cm) {
    resolveScrollToPos(cm);
    var cur = cm.getCursor();
    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};
  }

  function scrollToCoords(cm, x, y) {
    if (x != null || y != null) { resolveScrollToPos(cm); }
    if (x != null) { cm.curOp.scrollLeft = x; }
    if (y != null) { cm.curOp.scrollTop = y; }
  }

  function scrollToRange(cm, range) {
    resolveScrollToPos(cm);
    cm.curOp.scrollToPos = range;
  }

  // When an operation has its scrollToPos property set, and another
  // scroll action is applied before the end of the operation, this
  // 'simulates' scrolling that position into view in a cheap way, so
  // that the effect of intermediate scroll commands is not ignored.
  function resolveScrollToPos(cm) {
    var range = cm.curOp.scrollToPos;
    if (range) {
      cm.curOp.scrollToPos = null;
      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
      scrollToCoordsRange(cm, from, to, range.margin);
    }
  }

  function scrollToCoordsRange(cm, from, to, margin) {
    var sPos = calculateScrollPos(cm, {
      left: Math.min(from.left, to.left),
      top: Math.min(from.top, to.top) - margin,
      right: Math.max(from.right, to.right),
      bottom: Math.max(from.bottom, to.bottom) + margin
    });
    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);
  }

  // Sync the scrollable area and scrollbars, ensure the viewport
  // covers the visible area.
  function updateScrollTop(cm, val) {
    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }
    if (!gecko) { updateDisplaySimple(cm, {top: val}); }
    setScrollTop(cm, val, true);
    if (gecko) { updateDisplaySimple(cm); }
    startWorker(cm, 100);
  }

  function setScrollTop(cm, val, forceScroll) {
    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));
    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }
    cm.doc.scrollTop = val;
    cm.display.scrollbars.setScrollTop(val);
    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }
  }

  // Sync scroller and scrollbar, ensure the gutter elements are
  // aligned.
  function setScrollLeft(cm, val, isScroller, forceScroll) {
    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));
    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }
    cm.doc.scrollLeft = val;
    alignHorizontally(cm);
    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }
    cm.display.scrollbars.setScrollLeft(val);
  }

  // SCROLLBARS

  // Prepare DOM reads needed to update the scrollbars. Done in one
  // shot to minimize update/measure roundtrips.
  function measureForScrollbars(cm) {
    var d = cm.display, gutterW = d.gutters.offsetWidth;
    var docH = Math.round(cm.doc.height + paddingVert(cm.display));
    return {
      clientHeight: d.scroller.clientHeight,
      viewHeight: d.wrapper.clientHeight,
      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
      viewWidth: d.wrapper.clientWidth,
      barLeft: cm.options.fixedGutter ? gutterW : 0,
      docHeight: docH,
      scrollHeight: docH + scrollGap(cm) + d.barHeight,
      nativeBarWidth: d.nativeBarWidth,
      gutterWidth: gutterW
    }
  }

  var NativeScrollbars = function(place, scroll, cm) {
    this.cm = cm;
    var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
    var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
    vert.tabIndex = horiz.tabIndex = -1;
    place(vert); place(horiz);

    on(vert, "scroll", function () {
      if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); }
    });
    on(horiz, "scroll", function () {
      if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); }
    });

    this.checkedZeroWidth = false;
    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; }
  };

  NativeScrollbars.prototype.update = function (measure) {
    var needsH = measure.scrollWidth > measure.clientWidth + 1;
    var needsV = measure.scrollHeight > measure.clientHeight + 1;
    var sWidth = measure.nativeBarWidth;

    if (needsV) {
      this.vert.style.display = "block";
      this.vert.style.bottom = needsH ? sWidth + "px" : "0";
      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
      // A bug in IE8 can cause this value to be negative, so guard it.
      this.vert.firstChild.style.height =
        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
    } else {
      this.vert.style.display = "";
      this.vert.firstChild.style.height = "0";
    }

    if (needsH) {
      this.horiz.style.display = "block";
      this.horiz.style.right = needsV ? sWidth + "px" : "0";
      this.horiz.style.left = measure.barLeft + "px";
      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
      this.horiz.firstChild.style.width =
        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
    } else {
      this.horiz.style.display = "";
      this.horiz.firstChild.style.width = "0";
    }

    if (!this.checkedZeroWidth && measure.clientHeight > 0) {
      if (sWidth == 0) { this.zeroWidthHack(); }
      this.checkedZeroWidth = true;
    }

    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}
  };

  NativeScrollbars.prototype.setScrollLeft = function (pos) {
    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }
    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); }
  };

  NativeScrollbars.prototype.setScrollTop = function (pos) {
    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }
    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); }
  };

  NativeScrollbars.prototype.zeroWidthHack = function () {
    var w = mac && !mac_geMountainLion ? "12px" : "18px";
    this.horiz.style.height = this.vert.style.width = w;
    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
    this.disableHoriz = new Delayed;
    this.disableVert = new Delayed;
  };

  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {
    bar.style.pointerEvents = "auto";
    function maybeDisable() {
      // To find out whether the scrollbar is still visible, we
      // check whether the element under the pixel in the bottom
      // right corner of the scrollbar box is the scrollbar box
      // itself (when the bar is still visible) or its filler child
      // (when the bar is hidden). If it is still visible, we keep
      // it enabled, if it's hidden, we disable pointer events.
      var box = bar.getBoundingClientRect();
      var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)
          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);
      if (elt != bar) { bar.style.pointerEvents = "none"; }
      else { delay.set(1000, maybeDisable); }
    }
    delay.set(1000, maybeDisable);
  };

  NativeScrollbars.prototype.clear = function () {
    var parent = this.horiz.parentNode;
    parent.removeChild(this.horiz);
    parent.removeChild(this.vert);
  };

  var NullScrollbars = function () {};

  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };
  NullScrollbars.prototype.setScrollLeft = function () {};
  NullScrollbars.prototype.setScrollTop = function () {};
  NullScrollbars.prototype.clear = function () {};

  function updateScrollbars(cm, measure) {
    if (!measure) { measure = measureForScrollbars(cm); }
    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
    updateScrollbarsInner(cm, measure);
    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
        { updateHeightsInViewport(cm); }
      updateScrollbarsInner(cm, measureForScrollbars(cm));
      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
    }
  }

  // Re-synchronize the fake scrollbars with the actual size of the
  // content.
  function updateScrollbarsInner(cm, measure) {
    var d = cm.display;
    var sizes = d.scrollbars.update(measure);

    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
    d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent";

    if (sizes.right && sizes.bottom) {
      d.scrollbarFiller.style.display = "block";
      d.scrollbarFiller.style.height = sizes.bottom + "px";
      d.scrollbarFiller.style.width = sizes.right + "px";
    } else { d.scrollbarFiller.style.display = ""; }
    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
      d.gutterFiller.style.display = "block";
      d.gutterFiller.style.height = sizes.bottom + "px";
      d.gutterFiller.style.width = measure.gutterWidth + "px";
    } else { d.gutterFiller.style.display = ""; }
  }

  var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};

  function initScrollbars(cm) {
    if (cm.display.scrollbars) {
      cm.display.scrollbars.clear();
      if (cm.display.scrollbars.addClass)
        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
    }

    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {
      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
      // Prevent clicks in the scrollbars from killing focus
      on(node, "mousedown", function () {
        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }
      });
      node.setAttribute("cm-not-content", "true");
    }, function (pos, axis) {
      if (axis == "horizontal") { setScrollLeft(cm, pos); }
      else { updateScrollTop(cm, pos); }
    }, cm);
    if (cm.display.scrollbars.addClass)
      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
  }

  // Operations are used to wrap a series of changes to the editor
  // state in such a way that each change won't have to update the
  // cursor and display (which would be awkward, slow, and
  // error-prone). Instead, display updates are batched and then all
  // combined and executed at once.

  var nextOpId = 0;
  // Start a new operation.
  function startOperation(cm) {
    cm.curOp = {
      cm: cm,
      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
      startHeight: cm.doc.height, // Used to detect need to update scrollbar
      forceUpdate: false,      // Used to force a redraw
      updateInput: 0,       // Whether to reset the input textarea
      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
      changeObjs: null,        // Accumulated changes, for firing change events
      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
      selectionChanged: false, // Whether the selection needs to be redrawn
      updateMaxLine: false,    // Set when the widest line needs to be determined anew
      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
      scrollToPos: null,       // Used to scroll to a specific position
      focus: false,
      id: ++nextOpId           // Unique ID
    };
    pushOperation(cm.curOp);
  }

  // Finish an operation, updating the display and signalling delayed events
  function endOperation(cm) {
    var op = cm.curOp;
    if (op) { finishOperation(op, function (group) {
      for (var i = 0; i < group.ops.length; i++)
        { group.ops[i].cm.curOp = null; }
      endOperations(group);
    }); }
  }

  // The DOM updates done when an operation finishes are batched so
  // that the minimum number of relayouts are required.
  function endOperations(group) {
    var ops = group.ops;
    for (var i = 0; i < ops.length; i++) // Read DOM
      { endOperation_R1(ops[i]); }
    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)
      { endOperation_W1(ops[i$1]); }
    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM
      { endOperation_R2(ops[i$2]); }
    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)
      { endOperation_W2(ops[i$3]); }
    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM
      { endOperation_finish(ops[i$4]); }
  }

  function endOperation_R1(op) {
    var cm = op.cm, display = cm.display;
    maybeClipScrollbars(cm);
    if (op.updateMaxLine) { findMaxLine(cm); }

    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
                         op.scrollToPos.to.line >= display.viewTo) ||
      display.maxLineChanged && cm.options.lineWrapping;
    op.update = op.mustUpdate &&
      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
  }

  function endOperation_W1(op) {
    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
  }

  function endOperation_R2(op) {
    var cm = op.cm, display = cm.display;
    if (op.updatedDisplay) { updateHeightsInViewport(cm); }

    op.barMeasure = measureForScrollbars(cm);

    // If the max line changed since it was last measured, measure it,
    // and ensure the document's width matches it.
    // updateDisplay_W2 will use these properties to do the actual resizing
    if (display.maxLineChanged && !cm.options.lineWrapping) {
      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
      cm.display.sizerWidth = op.adjustWidthTo;
      op.barMeasure.scrollWidth =
        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
    }

    if (op.updatedDisplay || op.selectionChanged)
      { op.preparedSelection = display.input.prepareSelection(); }
  }

  function endOperation_W2(op) {
    var cm = op.cm;

    if (op.adjustWidthTo != null) {
      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
      if (op.maxScrollLeft < cm.doc.scrollLeft)
        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }
      cm.display.maxLineChanged = false;
    }

    var takeFocus = op.focus && op.focus == activeElt();
    if (op.preparedSelection)
      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }
    if (op.updatedDisplay || op.startHeight != cm.doc.height)
      { updateScrollbars(cm, op.barMeasure); }
    if (op.updatedDisplay)
      { setDocumentHeight(cm, op.barMeasure); }

    if (op.selectionChanged) { restartBlink(cm); }

    if (cm.state.focused && op.updateInput)
      { cm.display.input.reset(op.typing); }
    if (takeFocus) { ensureFocus(op.cm); }
  }

  function endOperation_finish(op) {
    var cm = op.cm, display = cm.display, doc = cm.doc;

    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }

    // Abort mouse wheel delta measurement, when scrolling explicitly
    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
      { display.wheelStartX = display.wheelStartY = null; }

    // Propagate the scroll position to the actual DOM scroller
    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }

    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }
    // If we need to scroll a specific position into view, do so.
    if (op.scrollToPos) {
      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
      maybeScrollWindow(cm, rect);
    }

    // Fire events for markers that are hidden/unidden by editing or
    // undoing
    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
    if (hidden) { for (var i = 0; i < hidden.length; ++i)
      { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } }
    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)
      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } }

    if (display.wrapper.offsetHeight)
      { doc.scrollTop = cm.display.scroller.scrollTop; }

    // Fire change events, and delayed event handlers
    if (op.changeObjs)
      { signal(cm, "changes", cm, op.changeObjs); }
    if (op.update)
      { op.update.finish(); }
  }

  // Run the given function in an operation
  function runInOp(cm, f) {
    if (cm.curOp) { return f() }
    startOperation(cm);
    try { return f() }
    finally { endOperation(cm); }
  }
  // Wraps a function in an operation. Returns the wrapped function.
  function operation(cm, f) {
    return function() {
      if (cm.curOp) { return f.apply(cm, arguments) }
      startOperation(cm);
      try { return f.apply(cm, arguments) }
      finally { endOperation(cm); }
    }
  }
  // Used to add methods to editor and doc instances, wrapping them in
  // operations.
  function methodOp(f) {
    return function() {
      if (this.curOp) { return f.apply(this, arguments) }
      startOperation(this);
      try { return f.apply(this, arguments) }
      finally { endOperation(this); }
    }
  }
  function docMethodOp(f) {
    return function() {
      var cm = this.cm;
      if (!cm || cm.curOp) { return f.apply(this, arguments) }
      startOperation(cm);
      try { return f.apply(this, arguments) }
      finally { endOperation(cm); }
    }
  }

  // HIGHLIGHT WORKER

  function startWorker(cm, time) {
    if (cm.doc.highlightFrontier < cm.display.viewTo)
      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }
  }

  function highlightWorker(cm) {
    var doc = cm.doc;
    if (doc.highlightFrontier >= cm.display.viewTo) { return }
    var end = +new Date + cm.options.workTime;
    var context = getContextBefore(cm, doc.highlightFrontier);
    var changedLines = [];

    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {
      if (context.line >= cm.display.viewFrom) { // Visible
        var oldStyles = line.styles;
        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;
        var highlighted = highlightLine(cm, line, context, true);
        if (resetState) { context.state = resetState; }
        line.styles = highlighted.styles;
        var oldCls = line.styleClasses, newCls = highlighted.classes;
        if (newCls) { line.styleClasses = newCls; }
        else if (oldCls) { line.styleClasses = null; }
        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }
        if (ischange) { changedLines.push(context.line); }
        line.stateAfter = context.save();
        context.nextLine();
      } else {
        if (line.text.length <= cm.options.maxHighlightLength)
          { processLine(cm, line.text, context); }
        line.stateAfter = context.line % 5 == 0 ? context.save() : null;
        context.nextLine();
      }
      if (+new Date > end) {
        startWorker(cm, cm.options.workDelay);
        return true
      }
    });
    doc.highlightFrontier = context.line;
    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);
    if (changedLines.length) { runInOp(cm, function () {
      for (var i = 0; i < changedLines.length; i++)
        { regLineChange(cm, changedLines[i], "text"); }
    }); }
  }

  // DISPLAY DRAWING

  var DisplayUpdate = function(cm, viewport, force) {
    var display = cm.display;

    this.viewport = viewport;
    // Store some values that we'll need later (but don't want to force a relayout for)
    this.visible = visibleLines(display, cm.doc, viewport);
    this.editorIsHidden = !display.wrapper.offsetWidth;
    this.wrapperHeight = display.wrapper.clientHeight;
    this.wrapperWidth = display.wrapper.clientWidth;
    this.oldDisplayWidth = displayWidth(cm);
    this.force = force;
    this.dims = getDimensions(cm);
    this.events = [];
  };

  DisplayUpdate.prototype.signal = function (emitter, type) {
    if (hasHandler(emitter, type))
      { this.events.push(arguments); }
  };
  DisplayUpdate.prototype.finish = function () {
    for (var i = 0; i < this.events.length; i++)
      { signal.apply(null, this.events[i]); }
  };

  function maybeClipScrollbars(cm) {
    var display = cm.display;
    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
      display.heightForcer.style.height = scrollGap(cm) + "px";
      display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
      display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
      display.scrollbarsClipped = true;
    }
  }

  function selectionSnapshot(cm) {
    if (cm.hasFocus()) { return null }
    var active = activeElt();
    if (!active || !contains(cm.display.lineDiv, active)) { return null }
    var result = {activeElt: active};
    if (window.getSelection) {
      var sel = window.getSelection();
      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {
        result.anchorNode = sel.anchorNode;
        result.anchorOffset = sel.anchorOffset;
        result.focusNode = sel.focusNode;
        result.focusOffset = sel.focusOffset;
      }
    }
    return result
  }

  function restoreSelection(snapshot) {
    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }
    snapshot.activeElt.focus();
    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&
        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {
      var sel = window.getSelection(), range = document.createRange();
      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);
      range.collapse(false);
      sel.removeAllRanges();
      sel.addRange(range);
      sel.extend(snapshot.focusNode, snapshot.focusOffset);
    }
  }

  // Does the actual updating of the line display. Bails out
  // (returning false) when there is nothing to be done and forced is
  // false.
  function updateDisplayIfNeeded(cm, update) {
    var display = cm.display, doc = cm.doc;

    if (update.editorIsHidden) {
      resetView(cm);
      return false
    }

    // Bail out if the visible area is already rendered and nothing changed.
    if (!update.force &&
        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
        display.renderedView == display.view && countDirtyView(cm) == 0)
      { return false }

    if (maybeUpdateLineNumberWidth(cm)) {
      resetView(cm);
      update.dims = getDimensions(cm);
    }

    // Compute a suitable new viewport (from & to)
    var end = doc.first + doc.size;
    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }
    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }
    if (sawCollapsedSpans) {
      from = visualLineNo(cm.doc, from);
      to = visualLineEndNo(cm.doc, to);
    }

    var different = from != display.viewFrom || to != display.viewTo ||
      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
    adjustView(cm, from, to);

    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
    // Position the mover div to align with the current scroll position
    cm.display.mover.style.top = display.viewOffset + "px";

    var toUpdate = countDirtyView(cm);
    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
      { return false }

    // For big changes, we hide the enclosing element during the
    // update, since that speeds up the operations on most browsers.
    var selSnapshot = selectionSnapshot(cm);
    if (toUpdate > 4) { display.lineDiv.style.display = "none"; }
    patchDisplay(cm, display.updateLineNumbers, update.dims);
    if (toUpdate > 4) { display.lineDiv.style.display = ""; }
    display.renderedView = display.view;
    // There might have been a widget with a focused element that got
    // hidden or updated, if so re-focus it.
    restoreSelection(selSnapshot);

    // Prevent selection and cursors from interfering with the scroll
    // width and height.
    removeChildren(display.cursorDiv);
    removeChildren(display.selectionDiv);
    display.gutters.style.height = display.sizer.style.minHeight = 0;

    if (different) {
      display.lastWrapHeight = update.wrapperHeight;
      display.lastWrapWidth = update.wrapperWidth;
      startWorker(cm, 400);
    }

    display.updateLineNumbers = null;

    return true
  }

  function postUpdateDisplay(cm, update) {
    var viewport = update.viewport;

    for (var first = true;; first = false) {
      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
        // Clip forced viewport to actual scrollable area.
        if (viewport && viewport.top != null)
          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }
        // Updated line heights might result in the drawn area not
        // actually covering the viewport. Keep looping until it does.
        update.visible = visibleLines(cm.display, cm.doc, viewport);
        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
          { break }
      } else if (first) {
        update.visible = visibleLines(cm.display, cm.doc, viewport);
      }
      if (!updateDisplayIfNeeded(cm, update)) { break }
      updateHeightsInViewport(cm);
      var barMeasure = measureForScrollbars(cm);
      updateSelection(cm);
      updateScrollbars(cm, barMeasure);
      setDocumentHeight(cm, barMeasure);
      update.force = false;
    }

    update.signal(cm, "update", cm);
    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
      update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
    }
  }

  function updateDisplaySimple(cm, viewport) {
    var update = new DisplayUpdate(cm, viewport);
    if (updateDisplayIfNeeded(cm, update)) {
      updateHeightsInViewport(cm);
      postUpdateDisplay(cm, update);
      var barMeasure = measureForScrollbars(cm);
      updateSelection(cm);
      updateScrollbars(cm, barMeasure);
      setDocumentHeight(cm, barMeasure);
      update.finish();
    }
  }

  // Sync the actual display DOM structure with display.view, removing
  // nodes for lines that are no longer in view, and creating the ones
  // that are not there yet, and updating the ones that are out of
  // date.
  function patchDisplay(cm, updateNumbersFrom, dims) {
    var display = cm.display, lineNumbers = cm.options.lineNumbers;
    var container = display.lineDiv, cur = container.firstChild;

    function rm(node) {
      var next = node.nextSibling;
      // Works around a throw-scroll bug in OS X Webkit
      if (webkit && mac && cm.display.currentWheelTarget == node)
        { node.style.display = "none"; }
      else
        { node.parentNode.removeChild(node); }
      return next
    }

    var view = display.view, lineN = display.viewFrom;
    // Loop over the elements in the view, syncing cur (the DOM nodes
    // in display.lineDiv) with the view as we go.
    for (var i = 0; i < view.length; i++) {
      var lineView = view[i];
      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
        var node = buildLineElement(cm, lineView, lineN, dims);
        container.insertBefore(node, cur);
      } else { // Already drawn
        while (cur != lineView.node) { cur = rm(cur); }
        var updateNumber = lineNumbers && updateNumbersFrom != null &&
          updateNumbersFrom <= lineN && lineView.lineNumber;
        if (lineView.changes) {
          if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; }
          updateLineForChanges(cm, lineView, lineN, dims);
        }
        if (updateNumber) {
          removeChildren(lineView.lineNumber);
          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
        }
        cur = lineView.node.nextSibling;
      }
      lineN += lineView.size;
    }
    while (cur) { cur = rm(cur); }
  }

  function updateGutterSpace(display) {
    var width = display.gutters.offsetWidth;
    display.sizer.style.marginLeft = width + "px";
  }

  function setDocumentHeight(cm, measure) {
    cm.display.sizer.style.minHeight = measure.docHeight + "px";
    cm.display.heightForcer.style.top = measure.docHeight + "px";
    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
  }

  // Re-align line numbers and gutter marks to compensate for
  // horizontal scrolling.
  function alignHorizontally(cm) {
    var display = cm.display, view = display.view;
    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }
    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
    var gutterW = display.gutters.offsetWidth, left = comp + "px";
    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {
      if (cm.options.fixedGutter) {
        if (view[i].gutter)
          { view[i].gutter.style.left = left; }
        if (view[i].gutterBackground)
          { view[i].gutterBackground.style.left = left; }
      }
      var align = view[i].alignable;
      if (align) { for (var j = 0; j < align.length; j++)
        { align[j].style.left = left; } }
    } }
    if (cm.options.fixedGutter)
      { display.gutters.style.left = (comp + gutterW) + "px"; }
  }

  // Used to ensure that the line number gutter is still the right
  // size for the current document size. Returns true when an update
  // is needed.
  function maybeUpdateLineNumberWidth(cm) {
    if (!cm.options.lineNumbers) { return false }
    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
    if (last.length != display.lineNumChars) {
      var test = display.measure.appendChild(elt("div", [elt("div", last)],
                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
      display.lineGutter.style.width = "";
      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
      display.lineNumWidth = display.lineNumInnerWidth + padding;
      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
      display.lineGutter.style.width = display.lineNumWidth + "px";
      updateGutterSpace(cm.display);
      return true
    }
    return false
  }

  function getGutters(gutters, lineNumbers) {
    var result = [], sawLineNumbers = false;
    for (var i = 0; i < gutters.length; i++) {
      var name = gutters[i], style = null;
      if (typeof name != "string") { style = name.style; name = name.className; }
      if (name == "CodeMirror-linenumbers") {
        if (!lineNumbers) { continue }
        else { sawLineNumbers = true; }
      }
      result.push({className: name, style: style});
    }
    if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); }
    return result
  }

  // Rebuild the gutter elements, ensure the margin to the left of the
  // code matches their width.
  function renderGutters(display) {
    var gutters = display.gutters, specs = display.gutterSpecs;
    removeChildren(gutters);
    display.lineGutter = null;
    for (var i = 0; i < specs.length; ++i) {
      var ref = specs[i];
      var className = ref.className;
      var style = ref.style;
      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className));
      if (style) { gElt.style.cssText = style; }
      if (className == "CodeMirror-linenumbers") {
        display.lineGutter = gElt;
        gElt.style.width = (display.lineNumWidth || 1) + "px";
      }
    }
    gutters.style.display = specs.length ? "" : "none";
    updateGutterSpace(display);
  }

  function updateGutters(cm) {
    renderGutters(cm.display);
    regChange(cm);
    alignHorizontally(cm);
  }

  // The display handles the DOM integration, both for input reading
  // and content drawing. It holds references to DOM nodes and
  // display-related state.

  function Display(place, doc, input, options) {
    var d = this;
    this.input = input;

    // Covers bottom-right square when both scrollbars are present.
    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
    d.scrollbarFiller.setAttribute("cm-not-content", "true");
    // Covers bottom of gutter when coverGutterNextToScrollbar is on
    // and h scrollbar is present.
    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
    d.gutterFiller.setAttribute("cm-not-content", "true");
    // Will contain the actual code, positioned to cover the viewport.
    d.lineDiv = eltP("div", null, "CodeMirror-code");
    // Elements are added to these to represent selection and cursors.
    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
    // A visibility: hidden element used to find the size of things.
    d.measure = elt("div", null, "CodeMirror-measure");
    // When lines outside of the viewport are measured, they are drawn in this.
    d.lineMeasure = elt("div", null, "CodeMirror-measure");
    // Wraps everything that needs to exist inside the vertically-padded coordinate system
    d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
                      null, "position: relative; outline: none");
    var lines = eltP("div", [d.lineSpace], "CodeMirror-lines");
    // Moved around its parent to cover visible view.
    d.mover = elt("div", [lines], null, "position: relative");
    // Set to the height of the document, allowing scrolling.
    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
    d.sizerWidth = null;
    // Behavior of elts with overflow: auto and padding is
    // inconsistent across browsers. This is used to ensure the
    // scrollable area is big enough.
    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
    // Will contain the gutters, if any.
    d.gutters = elt("div", null, "CodeMirror-gutters");
    d.lineGutter = null;
    // Actual scrollable element.
    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
    d.scroller.setAttribute("tabIndex", "-1");
    // The element in which the editor lives.
    d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");

    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }

    if (place) {
      if (place.appendChild) { place.appendChild(d.wrapper); }
      else { place(d.wrapper); }
    }

    // Current rendered range (may be bigger than the view window).
    d.viewFrom = d.viewTo = doc.first;
    d.reportedViewFrom = d.reportedViewTo = doc.first;
    // Information about the rendered lines.
    d.view = [];
    d.renderedView = null;
    // Holds info about a single rendered line when it was rendered
    // for measurement, while not in view.
    d.externalMeasured = null;
    // Empty space (in pixels) above the view
    d.viewOffset = 0;
    d.lastWrapHeight = d.lastWrapWidth = 0;
    d.updateLineNumbers = null;

    d.nativeBarWidth = d.barHeight = d.barWidth = 0;
    d.scrollbarsClipped = false;

    // Used to only resize the line number gutter when necessary (when
    // the amount of lines crosses a boundary that makes its width change)
    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
    // Set to true when a non-horizontal-scrolling line widget is
    // added. As an optimization, line widget aligning is skipped when
    // this is false.
    d.alignWidgets = false;

    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;

    // Tracks the maximum line length so that the horizontal scrollbar
    // can be kept static when scrolling.
    d.maxLine = null;
    d.maxLineLength = 0;
    d.maxLineChanged = false;

    // Used for measuring wheel scrolling granularity
    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;

    // True when shift is held down.
    d.shift = false;

    // Used to track whether anything happened since the context menu
    // was opened.
    d.selForContextMenu = null;

    d.activeTouch = null;

    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);
    renderGutters(d);

    input.init(d);
  }

  // Since the delta values reported on mouse wheel events are
  // unstandardized between browsers and even browser versions, and
  // generally horribly unpredictable, this code starts by measuring
  // the scroll effect that the first few mouse wheel events have,
  // and, from that, detects the way it can convert deltas to pixel
  // offsets afterwards.
  //
  // The reason we want to know the amount a wheel event will scroll
  // is that it gives us a chance to update the display before the
  // actual scrolling happens, reducing flickering.

  var wheelSamples = 0, wheelPixelsPerUnit = null;
  // Fill in a browser-detected starting value on browsers where we
  // know one. These don't have to be accurate -- the result of them
  // being wrong would just be a slight flicker on the first wheel
  // scroll (if it is large enough).
  if (ie) { wheelPixelsPerUnit = -.53; }
  else if (gecko) { wheelPixelsPerUnit = 15; }
  else if (chrome) { wheelPixelsPerUnit = -.7; }
  else if (safari) { wheelPixelsPerUnit = -1/3; }

  function wheelEventDelta(e) {
    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }
    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }
    else if (dy == null) { dy = e.wheelDelta; }
    return {x: dx, y: dy}
  }
  function wheelEventPixels(e) {
    var delta = wheelEventDelta(e);
    delta.x *= wheelPixelsPerUnit;
    delta.y *= wheelPixelsPerUnit;
    return delta
  }

  function onScrollWheel(cm, e) {
    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;

    var display = cm.display, scroll = display.scroller;
    // Quit if there's nothing to scroll here
    var canScrollX = scroll.scrollWidth > scroll.clientWidth;
    var canScrollY = scroll.scrollHeight > scroll.clientHeight;
    if (!(dx && canScrollX || dy && canScrollY)) { return }

    // Webkit browsers on OS X abort momentum scrolls when the target
    // of the scroll event is removed from the scrollable element.
    // This hack (see related code in patchDisplay) makes sure the
    // element is kept around.
    if (dy && mac && webkit) {
      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
        for (var i = 0; i < view.length; i++) {
          if (view[i].node == cur) {
            cm.display.currentWheelTarget = cur;
            break outer
          }
        }
      }
    }

    // On some browsers, horizontal scrolling will cause redraws to
    // happen before the gutter has been realigned, causing it to
    // wriggle around in a most unseemly way. When we have an
    // estimated pixels/delta value, we just handle horizontal
    // scrolling entirely here. It'll be slightly off from native, but
    // better than glitching out.
    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
      if (dy && canScrollY)
        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }
      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));
      // Only prevent default scrolling if vertical scrolling is
      // actually possible. Otherwise, it causes vertical scroll
      // jitter on OSX trackpads when deltaX is small and deltaY
      // is large (issue #3579)
      if (!dy || (dy && canScrollY))
        { e_preventDefault(e); }
      display.wheelStartX = null; // Abort measurement, if in progress
      return
    }

    // 'Project' the visible viewport to cover the area that is being
    // scrolled into view (if we know enough to estimate it).
    if (dy && wheelPixelsPerUnit != null) {
      var pixels = dy * wheelPixelsPerUnit;
      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }
      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }
      updateDisplaySimple(cm, {top: top, bottom: bot});
    }

    if (wheelSamples < 20) {
      if (display.wheelStartX == null) {
        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
        display.wheelDX = dx; display.wheelDY = dy;
        setTimeout(function () {
          if (display.wheelStartX == null) { return }
          var movedX = scroll.scrollLeft - display.wheelStartX;
          var movedY = scroll.scrollTop - display.wheelStartY;
          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
            (movedX && display.wheelDX && movedX / display.wheelDX);
          display.wheelStartX = display.wheelStartY = null;
          if (!sample) { return }
          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
          ++wheelSamples;
        }, 200);
      } else {
        display.wheelDX += dx; display.wheelDY += dy;
      }
    }
  }

  // Selection objects are immutable. A new one is created every time
  // the selection changes. A selection is one or more non-overlapping
  // (and non-touching) ranges, sorted, and an integer that indicates
  // which one is the primary selection (the one that's scrolled into
  // view, that getCursor returns, etc).
  var Selection = function(ranges, primIndex) {
    this.ranges = ranges;
    this.primIndex = primIndex;
  };

  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };

  Selection.prototype.equals = function (other) {
    if (other == this) { return true }
    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }
    for (var i = 0; i < this.ranges.length; i++) {
      var here = this.ranges[i], there = other.ranges[i];
      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }
    }
    return true
  };

  Selection.prototype.deepCopy = function () {
    var out = [];
    for (var i = 0; i < this.ranges.length; i++)
      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }
    return new Selection(out, this.primIndex)
  };

  Selection.prototype.somethingSelected = function () {
    for (var i = 0; i < this.ranges.length; i++)
      { if (!this.ranges[i].empty()) { return true } }
    return false
  };

  Selection.prototype.contains = function (pos, end) {
    if (!end) { end = pos; }
    for (var i = 0; i < this.ranges.length; i++) {
      var range = this.ranges[i];
      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
        { return i }
    }
    return -1
  };

  var Range = function(anchor, head) {
    this.anchor = anchor; this.head = head;
  };

  Range.prototype.from = function () { return minPos(this.anchor, this.head) };
  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };
  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };

  // Take an unsorted, potentially overlapping set of ranges, and
  // build a selection out of it. 'Consumes' ranges array (modifying
  // it).
  function normalizeSelection(cm, ranges, primIndex) {
    var mayTouch = cm && cm.options.selectionsMayTouch;
    var prim = ranges[primIndex];
    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });
    primIndex = indexOf(ranges, prim);
    for (var i = 1; i < ranges.length; i++) {
      var cur = ranges[i], prev = ranges[i - 1];
      var diff = cmp(prev.to(), cur.from());
      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {
        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
        if (i <= primIndex) { --primIndex; }
        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
      }
    }
    return new Selection(ranges, primIndex)
  }

  function simpleSelection(anchor, head) {
    return new Selection([new Range(anchor, head || anchor)], 0)
  }

  // Compute the position of the end of a change (its 'to' property
  // refers to the pre-change end).
  function changeEnd(change) {
    if (!change.text) { return change.to }
    return Pos(change.from.line + change.text.length - 1,
               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))
  }

  // Adjust a position to refer to the post-change position of the
  // same text, or the end of the change if the change covers it.
  function adjustForChange(pos, change) {
    if (cmp(pos, change.from) < 0) { return pos }
    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }

    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }
    return Pos(line, ch)
  }

  function computeSelAfterChange(doc, change) {
    var out = [];
    for (var i = 0; i < doc.sel.ranges.length; i++) {
      var range = doc.sel.ranges[i];
      out.push(new Range(adjustForChange(range.anchor, change),
                         adjustForChange(range.head, change)));
    }
    return normalizeSelection(doc.cm, out, doc.sel.primIndex)
  }

  function offsetPos(pos, old, nw) {
    if (pos.line == old.line)
      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }
    else
      { return Pos(nw.line + (pos.line - old.line), pos.ch) }
  }

  // Used by replaceSelections to allow moving the selection to the
  // start or around the replaced test. Hint may be "start" or "around".
  function computeReplacedSel(doc, changes, hint) {
    var out = [];
    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
    for (var i = 0; i < changes.length; i++) {
      var change = changes[i];
      var from = offsetPos(change.from, oldPrev, newPrev);
      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
      oldPrev = change.to;
      newPrev = to;
      if (hint == "around") {
        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
        out[i] = new Range(inv ? to : from, inv ? from : to);
      } else {
        out[i] = new Range(from, from);
      }
    }
    return new Selection(out, doc.sel.primIndex)
  }

  // Used to get the editor into a consistent state again when options change.

  function loadMode(cm) {
    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);
    resetModeState(cm);
  }

  function resetModeState(cm) {
    cm.doc.iter(function (line) {
      if (line.stateAfter) { line.stateAfter = null; }
      if (line.styles) { line.styles = null; }
    });
    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;
    startWorker(cm, 100);
    cm.state.modeGen++;
    if (cm.curOp) { regChange(cm); }
  }

  // DOCUMENT DATA STRUCTURE

  // By default, updates that start and end at the beginning of a line
  // are treated specially, in order to make the association of line
  // widgets and marker elements with the text behave more intuitive.
  function isWholeLineUpdate(doc, change) {
    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)
  }

  // Perform a change on the document data structure.
  function updateDoc(doc, change, markedSpans, estimateHeight) {
    function spansFor(n) {return markedSpans ? markedSpans[n] : null}
    function update(line, text, spans) {
      updateLine(line, text, spans, estimateHeight);
      signalLater(line, "change", line, change);
    }
    function linesFor(start, end) {
      var result = [];
      for (var i = start; i < end; ++i)
        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }
      return result
    }

    var from = change.from, to = change.to, text = change.text;
    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;

    // Adjust the line structure
    if (change.full) {
      doc.insert(0, linesFor(0, text.length));
      doc.remove(text.length, doc.size - text.length);
    } else if (isWholeLineUpdate(doc, change)) {
      // This is a whole-line replace. Treated specially to make
      // sure line objects move the way they are supposed to.
      var added = linesFor(0, text.length - 1);
      update(lastLine, lastLine.text, lastSpans);
      if (nlines) { doc.remove(from.line, nlines); }
      if (added.length) { doc.insert(from.line, added); }
    } else if (firstLine == lastLine) {
      if (text.length == 1) {
        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
      } else {
        var added$1 = linesFor(1, text.length - 1);
        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
        doc.insert(from.line + 1, added$1);
      }
    } else if (text.length == 1) {
      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
      doc.remove(from.line + 1, nlines);
    } else {
      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
      var added$2 = linesFor(1, text.length - 1);
      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }
      doc.insert(from.line + 1, added$2);
    }

    signalLater(doc, "change", doc, change);
  }

  // Call f for all linked documents.
  function linkedDocs(doc, f, sharedHistOnly) {
    function propagate(doc, skip, sharedHist) {
      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {
        var rel = doc.linked[i];
        if (rel.doc == skip) { continue }
        var shared = sharedHist && rel.sharedHist;
        if (sharedHistOnly && !shared) { continue }
        f(rel.doc, shared);
        propagate(rel.doc, doc, shared);
      } }
    }
    propagate(doc, null, true);
  }

  // Attach a document to an editor.
  function attachDoc(cm, doc) {
    if (doc.cm) { throw new Error("This document is already in use.") }
    cm.doc = doc;
    doc.cm = cm;
    estimateLineHeights(cm);
    loadMode(cm);
    setDirectionClass(cm);
    if (!cm.options.lineWrapping) { findMaxLine(cm); }
    cm.options.mode = doc.modeOption;
    regChange(cm);
  }

  function setDirectionClass(cm) {
  (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl");
  }

  function directionChanged(cm) {
    runInOp(cm, function () {
      setDirectionClass(cm);
      regChange(cm);
    });
  }

  function History(prev) {
    // Arrays of change events and selections. Doing something adds an
    // event to done and clears undo. Undoing moves events from done
    // to undone, redoing moves them in the other direction.
    this.done = []; this.undone = [];
    this.undoDepth = prev ? prev.undoDepth : Infinity;
    // Used to track when changes can be merged into a single undo
    // event
    this.lastModTime = this.lastSelTime = 0;
    this.lastOp = this.lastSelOp = null;
    this.lastOrigin = this.lastSelOrigin = null;
    // Used by the isClean() method
    this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;
  }

  // Create a history change event from an updateDoc-style change
  // object.
  function historyChangeFromChange(doc, change) {
    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);
    return histChange
  }

  // Pop all selection events off the end of a history array. Stop at
  // a change event.
  function clearSelectionEvents(array) {
    while (array.length) {
      var last = lst(array);
      if (last.ranges) { array.pop(); }
      else { break }
    }
  }

  // Find the top change event in the history. Pop off selection
  // events that are in the way.
  function lastChangeEvent(hist, force) {
    if (force) {
      clearSelectionEvents(hist.done);
      return lst(hist.done)
    } else if (hist.done.length && !lst(hist.done).ranges) {
      return lst(hist.done)
    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
      hist.done.pop();
      return lst(hist.done)
    }
  }

  // Register a change in the history. Merges changes that are within
  // a single operation, or are close together with an origin that
  // allows merging (starting with "+") into a single event.
  function addChangeToHistory(doc, change, selAfter, opId) {
    var hist = doc.history;
    hist.undone.length = 0;
    var time = +new Date, cur;
    var last;

    if ((hist.lastOp == opId ||
         hist.lastOrigin == change.origin && change.origin &&
         ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||
          change.origin.charAt(0) == "*")) &&
        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
      // Merge this change into the last event
      last = lst(cur.changes);
      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
        // Optimized case for simple insertion -- don't want to add
        // new changesets for every character typed
        last.to = changeEnd(change);
      } else {
        // Add new sub-event
        cur.changes.push(historyChangeFromChange(doc, change));
      }
    } else {
      // Can not be merged, start a new event.
      var before = lst(hist.done);
      if (!before || !before.ranges)
        { pushSelectionToHistory(doc.sel, hist.done); }
      cur = {changes: [historyChangeFromChange(doc, change)],
             generation: hist.generation};
      hist.done.push(cur);
      while (hist.done.length > hist.undoDepth) {
        hist.done.shift();
        if (!hist.done[0].ranges) { hist.done.shift(); }
      }
    }
    hist.done.push(selAfter);
    hist.generation = ++hist.maxGeneration;
    hist.lastModTime = hist.lastSelTime = time;
    hist.lastOp = hist.lastSelOp = opId;
    hist.lastOrigin = hist.lastSelOrigin = change.origin;

    if (!last) { signal(doc, "historyAdded"); }
  }

  function selectionEventCanBeMerged(doc, origin, prev, sel) {
    var ch = origin.charAt(0);
    return ch == "*" ||
      ch == "+" &&
      prev.ranges.length == sel.ranges.length &&
      prev.somethingSelected() == sel.somethingSelected() &&
      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
  }

  // Called whenever the selection changes, sets the new selection as
  // the pending selection in the history, and pushes the old pending
  // selection into the 'done' array when it was significantly
  // different (in number of selected ranges, emptiness, or time).
  function addSelectionToHistory(doc, sel, opId, options) {
    var hist = doc.history, origin = options && options.origin;

    // A new event is started when the previous origin does not match
    // the current, or the origins don't allow matching. Origins
    // starting with * are always merged, those starting with + are
    // merged when similar and close together in time.
    if (opId == hist.lastSelOp ||
        (origin && hist.lastSelOrigin == origin &&
         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
      { hist.done[hist.done.length - 1] = sel; }
    else
      { pushSelectionToHistory(sel, hist.done); }

    hist.lastSelTime = +new Date;
    hist.lastSelOrigin = origin;
    hist.lastSelOp = opId;
    if (options && options.clearRedo !== false)
      { clearSelectionEvents(hist.undone); }
  }

  function pushSelectionToHistory(sel, dest) {
    var top = lst(dest);
    if (!(top && top.ranges && top.equals(sel)))
      { dest.push(sel); }
  }

  // Used to store marked span information in the history.
  function attachLocalSpans(doc, change, from, to) {
    var existing = change["spans_" + doc.id], n = 0;
    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {
      if (line.markedSpans)
        { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; }
      ++n;
    });
  }

  // When un/re-doing restores text containing marked spans, those
  // that have been explicitly cleared should not be restored.
  function removeClearedSpans(spans) {
    if (!spans) { return null }
    var out;
    for (var i = 0; i < spans.length; ++i) {
      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }
      else if (out) { out.push(spans[i]); }
    }
    return !out ? spans : out.length ? out : null
  }

  // Retrieve and filter the old marked spans stored in a change event.
  function getOldSpans(doc, change) {
    var found = change["spans_" + doc.id];
    if (!found) { return null }
    var nw = [];
    for (var i = 0; i < change.text.length; ++i)
      { nw.push(removeClearedSpans(found[i])); }
    return nw
  }

  // Used for un/re-doing changes from the history. Combines the
  // result of computing the existing spans with the set of spans that
  // existed in the history (so that deleting around a span and then
  // undoing brings back the span).
  function mergeOldSpans(doc, change) {
    var old = getOldSpans(doc, change);
    var stretched = stretchSpansOverChange(doc, change);
    if (!old) { return stretched }
    if (!stretched) { return old }

    for (var i = 0; i < old.length; ++i) {
      var oldCur = old[i], stretchCur = stretched[i];
      if (oldCur && stretchCur) {
        spans: for (var j = 0; j < stretchCur.length; ++j) {
          var span = stretchCur[j];
          for (var k = 0; k < oldCur.length; ++k)
            { if (oldCur[k].marker == span.marker) { continue spans } }
          oldCur.push(span);
        }
      } else if (stretchCur) {
        old[i] = stretchCur;
      }
    }
    return old
  }

  // Used both to provide a JSON-safe object in .getHistory, and, when
  // detaching a document, to split the history in two
  function copyHistoryArray(events, newGroup, instantiateSel) {
    var copy = [];
    for (var i = 0; i < events.length; ++i) {
      var event = events[i];
      if (event.ranges) {
        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
        continue
      }
      var changes = event.changes, newChanges = [];
      copy.push({changes: newChanges});
      for (var j = 0; j < changes.length; ++j) {
        var change = changes[j], m = (void 0);
        newChanges.push({from: change.from, to: change.to, text: change.text});
        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) {
          if (indexOf(newGroup, Number(m[1])) > -1) {
            lst(newChanges)[prop] = change[prop];
            delete change[prop];
          }
        } } }
      }
    }
    return copy
  }

  // The 'scroll' parameter given to many of these indicated whether
  // the new cursor position should be scrolled into view after
  // modifying the selection.

  // If shift is held or the extend flag is set, extends a range to
  // include a given position (and optionally a second position).
  // Otherwise, simply returns the range between the given positions.
  // Used for cursor motion and such.
  function extendRange(range, head, other, extend) {
    if (extend) {
      var anchor = range.anchor;
      if (other) {
        var posBefore = cmp(head, anchor) < 0;
        if (posBefore != (cmp(other, anchor) < 0)) {
          anchor = head;
          head = other;
        } else if (posBefore != (cmp(head, other) < 0)) {
          head = other;
        }
      }
      return new Range(anchor, head)
    } else {
      return new Range(other || head, head)
    }
  }

  // Extend the primary selection range, discard the rest.
  function extendSelection(doc, head, other, options, extend) {
    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }
    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);
  }

  // Extend all selections (pos is an array of selections with length
  // equal the number of selections)
  function extendSelections(doc, heads, options) {
    var out = [];
    var extend = doc.cm && (doc.cm.display.shift || doc.extend);
    for (var i = 0; i < doc.sel.ranges.length; i++)
      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }
    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);
    setSelection(doc, newSel, options);
  }

  // Updates a single range in the selection.
  function replaceOneSelection(doc, i, range, options) {
    var ranges = doc.sel.ranges.slice(0);
    ranges[i] = range;
    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);
  }

  // Reset the selection to a single range.
  function setSimpleSelection(doc, anchor, head, options) {
    setSelection(doc, simpleSelection(anchor, head), options);
  }

  // Give beforeSelectionChange handlers a change to influence a
  // selection update.
  function filterSelectionChange(doc, sel, options) {
    var obj = {
      ranges: sel.ranges,
      update: function(ranges) {
        this.ranges = [];
        for (var i = 0; i < ranges.length; i++)
          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
                                     clipPos(doc, ranges[i].head)); }
      },
      origin: options && options.origin
    };
    signal(doc, "beforeSelectionChange", doc, obj);
    if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); }
    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }
    else { return sel }
  }

  function setSelectionReplaceHistory(doc, sel, options) {
    var done = doc.history.done, last = lst(done);
    if (last && last.ranges) {
      done[done.length - 1] = sel;
      setSelectionNoUndo(doc, sel, options);
    } else {
      setSelection(doc, sel, options);
    }
  }

  // Set a new selection.
  function setSelection(doc, sel, options) {
    setSelectionNoUndo(doc, sel, options);
    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
  }

  function setSelectionNoUndo(doc, sel, options) {
    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
      { sel = filterSelectionChange(doc, sel, options); }

    var bias = options && options.bias ||
      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));

    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor")
      { ensureCursorVisible(doc.cm); }
  }

  function setSelectionInner(doc, sel) {
    if (sel.equals(doc.sel)) { return }

    doc.sel = sel;

    if (doc.cm) {
      doc.cm.curOp.updateInput = 1;
      doc.cm.curOp.selectionChanged = true;
      signalCursorActivity(doc.cm);
    }
    signalLater(doc, "cursorActivity", doc);
  }

  // Verify that the selection does not partially select any atomic
  // marked ranges.
  function reCheckSelection(doc) {
    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));
  }

  // Return a selection that does not partially select any atomic
  // ranges.
  function skipAtomicInSelection(doc, sel, bias, mayClear) {
    var out;
    for (var i = 0; i < sel.ranges.length; i++) {
      var range = sel.ranges[i];
      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
      if (out || newAnchor != range.anchor || newHead != range.head) {
        if (!out) { out = sel.ranges.slice(0, i); }
        out[i] = new Range(newAnchor, newHead);
      }
    }
    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel
  }

  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
    var line = getLine(doc, pos.line);
    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
      var sp = line.markedSpans[i], m = sp.marker;

      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker
      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it
      // is with selectLeft/Right
      var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft;
      var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight;

      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
        if (mayClear) {
          signal(m, "beforeCursorEnter");
          if (m.explicitlyCleared) {
            if (!line.markedSpans) { break }
            else {--i; continue}
          }
        }
        if (!m.atomic) { continue }

        if (oldPos) {
          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);
          if (dir < 0 ? preventCursorRight : preventCursorLeft)
            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }
          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
            { return skipAtomicInner(doc, near, pos, dir, mayClear) }
        }

        var far = m.find(dir < 0 ? -1 : 1);
        if (dir < 0 ? preventCursorLeft : preventCursorRight)
          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }
        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null
      }
    } }
    return pos
  }

  // Ensure a given position is not inside an atomic range.
  function skipAtomic(doc, pos, oldPos, bias, mayClear) {
    var dir = bias || 1;
    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
    if (!found) {
      doc.cantEdit = true;
      return Pos(doc.first, 0)
    }
    return found
  }

  function movePos(doc, pos, dir, line) {
    if (dir < 0 && pos.ch == 0) {
      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }
      else { return null }
    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }
      else { return null }
    } else {
      return new Pos(pos.line, pos.ch + dir)
    }
  }

  function selectAll(cm) {
    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);
  }

  // UPDATING

  // Allow "beforeChange" event handlers to influence a change
  function filterChange(doc, change, update) {
    var obj = {
      canceled: false,
      from: change.from,
      to: change.to,
      text: change.text,
      origin: change.origin,
      cancel: function () { return obj.canceled = true; }
    };
    if (update) { obj.update = function (from, to, text, origin) {
      if (from) { obj.from = clipPos(doc, from); }
      if (to) { obj.to = clipPos(doc, to); }
      if (text) { obj.text = text; }
      if (origin !== undefined) { obj.origin = origin; }
    }; }
    signal(doc, "beforeChange", doc, obj);
    if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); }

    if (obj.canceled) {
      if (doc.cm) { doc.cm.curOp.updateInput = 2; }
      return null
    }
    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}
  }

  // Apply a change to a document, and add it to the document's
  // history, and propagating it to all linked documents.
  function makeChange(doc, change, ignoreReadOnly) {
    if (doc.cm) {
      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }
      if (doc.cm.state.suppressEdits) { return }
    }

    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
      change = filterChange(doc, change, true);
      if (!change) { return }
    }

    // Possibly split or suppress the update based on the presence
    // of read-only spans in its range.
    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
    if (split) {
      for (var i = split.length - 1; i >= 0; --i)
        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); }
    } else {
      makeChangeInner(doc, change);
    }
  }

  function makeChangeInner(doc, change) {
    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return }
    var selAfter = computeSelAfterChange(doc, change);
    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);

    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
    var rebased = [];

    linkedDocs(doc, function (doc, sharedHist) {
      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
        rebaseHist(doc.history, change);
        rebased.push(doc.history);
      }
      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
    });
  }

  // Revert a change stored in a document's history.
  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
    var suppress = doc.cm && doc.cm.state.suppressEdits;
    if (suppress && !allowSelectionOnly) { return }

    var hist = doc.history, event, selAfter = doc.sel;
    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;

    // Verify that there is a useable event (so that ctrl-z won't
    // needlessly clear selection events)
    var i = 0;
    for (; i < source.length; i++) {
      event = source[i];
      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
        { break }
    }
    if (i == source.length) { return }
    hist.lastOrigin = hist.lastSelOrigin = null;

    for (;;) {
      event = source.pop();
      if (event.ranges) {
        pushSelectionToHistory(event, dest);
        if (allowSelectionOnly && !event.equals(doc.sel)) {
          setSelection(doc, event, {clearRedo: false});
          return
        }
        selAfter = event;
      } else if (suppress) {
        source.push(event);
        return
      } else { break }
    }

    // Build up a reverse change object to add to the opposite history
    // stack (redo when undoing, and vice versa).
    var antiChanges = [];
    pushSelectionToHistory(selAfter, dest);
    dest.push({changes: antiChanges, generation: hist.generation});
    hist.generation = event.generation || ++hist.maxGeneration;

    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");

    var loop = function ( i ) {
      var change = event.changes[i];
      change.origin = type;
      if (filter && !filterChange(doc, change, false)) {
        source.length = 0;
        return {}
      }

      antiChanges.push(historyChangeFromChange(doc, change));

      var after = i ? computeSelAfterChange(doc, change) : lst(source);
      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }
      var rebased = [];

      // Propagate to the linked documents
      linkedDocs(doc, function (doc, sharedHist) {
        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
          rebaseHist(doc.history, change);
          rebased.push(doc.history);
        }
        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
      });
    };

    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {
      var returned = loop( i$1 );

      if ( returned ) return returned.v;
    }
  }

  // Sub-views need their line numbers shifted when text is added
  // above or below them in the parent document.
  function shiftDoc(doc, distance) {
    if (distance == 0) { return }
    doc.first += distance;
    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(
      Pos(range.anchor.line + distance, range.anchor.ch),
      Pos(range.head.line + distance, range.head.ch)
    ); }), doc.sel.primIndex);
    if (doc.cm) {
      regChange(doc.cm, doc.first, doc.first - distance, distance);
      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
        { regLineChange(doc.cm, l, "gutter"); }
    }
  }

  // More lower-level change function, handling only a single document
  // (not linked ones).
  function makeChangeSingleDoc(doc, change, selAfter, spans) {
    if (doc.cm && !doc.cm.curOp)
      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }

    if (change.to.line < doc.first) {
      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
      return
    }
    if (change.from.line > doc.lastLine()) { return }

    // Clip the change to the size of this doc
    if (change.from.line < doc.first) {
      var shift = change.text.length - 1 - (doc.first - change.from.line);
      shiftDoc(doc, shift);
      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
                text: [lst(change.text)], origin: change.origin};
    }
    var last = doc.lastLine();
    if (change.to.line > last) {
      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
                text: [change.text[0]], origin: change.origin};
    }

    change.removed = getBetween(doc, change.from, change.to);

    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }
    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }
    else { updateDoc(doc, change, spans); }
    setSelectionNoUndo(doc, selAfter, sel_dontScroll);

    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))
      { doc.cantEdit = false; }
  }

  // Handle the interaction of a change to a document with the editor
  // that this document is part of.
  function makeChangeSingleDocInEditor(cm, change, spans) {
    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;

    var recomputeMaxLength = false, checkWidthStart = from.line;
    if (!cm.options.lineWrapping) {
      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
      doc.iter(checkWidthStart, to.line + 1, function (line) {
        if (line == display.maxLine) {
          recomputeMaxLength = true;
          return true
        }
      });
    }

    if (doc.sel.contains(change.from, change.to) > -1)
      { signalCursorActivity(cm); }

    updateDoc(doc, change, spans, estimateHeight(cm));

    if (!cm.options.lineWrapping) {
      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {
        var len = lineLength(line);
        if (len > display.maxLineLength) {
          display.maxLine = line;
          display.maxLineLength = len;
          display.maxLineChanged = true;
          recomputeMaxLength = false;
        }
      });
      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }
    }

    retreatFrontier(doc, from.line);
    startWorker(cm, 400);

    var lendiff = change.text.length - (to.line - from.line) - 1;
    // Remember that these lines changed, for updating the display
    if (change.full)
      { regChange(cm); }
    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
      { regLineChange(cm, from.line, "text"); }
    else
      { regChange(cm, from.line, to.line + 1, lendiff); }

    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
    if (changeHandler || changesHandler) {
      var obj = {
        from: from, to: to,
        text: change.text,
        removed: change.removed,
        origin: change.origin
      };
      if (changeHandler) { signalLater(cm, "change", cm, obj); }
      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }
    }
    cm.display.selForContextMenu = null;
  }

  function replaceRange(doc, code, from, to, origin) {
    var assign;

    if (!to) { to = from; }
    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }
    if (typeof code == "string") { code = doc.splitLines(code); }
    makeChange(doc, {from: from, to: to, text: code, origin: origin});
  }

  // Rebasing/resetting history to deal with externally-sourced changes

  function rebaseHistSelSingle(pos, from, to, diff) {
    if (to < pos.line) {
      pos.line += diff;
    } else if (from < pos.line) {
      pos.line = from;
      pos.ch = 0;
    }
  }

  // Tries to rebase an array of history events given a change in the
  // document. If the change touches the same lines as the event, the
  // event, and everything 'behind' it, is discarded. If the change is
  // before the event, the event's positions are updated. Uses a
  // copy-on-write scheme for the positions, to avoid having to
  // reallocate them all on every rebase, but also avoid problems with
  // shared position objects being unsafely updated.
  function rebaseHistArray(array, from, to, diff) {
    for (var i = 0; i < array.length; ++i) {
      var sub = array[i], ok = true;
      if (sub.ranges) {
        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
        for (var j = 0; j < sub.ranges.length; j++) {
          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
        }
        continue
      }
      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {
        var cur = sub.changes[j$1];
        if (to < cur.from.line) {
          cur.from = Pos(cur.from.line + diff, cur.from.ch);
          cur.to = Pos(cur.to.line + diff, cur.to.ch);
        } else if (from <= cur.to.line) {
          ok = false;
          break
        }
      }
      if (!ok) {
        array.splice(0, i + 1);
        i = 0;
      }
    }
  }

  function rebaseHist(hist, change) {
    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
    rebaseHistArray(hist.done, from, to, diff);
    rebaseHistArray(hist.undone, from, to, diff);
  }

  // Utility for applying a change to a line by handle or number,
  // returning the number and optionally registering the line as
  // changed.
  function changeLine(doc, handle, changeType, op) {
    var no = handle, line = handle;
    if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); }
    else { no = lineNo(handle); }
    if (no == null) { return null }
    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }
    return line
  }

  // The document is represented as a BTree consisting of leaves, with
  // chunk of lines in them, and branches, with up to ten leaves or
  // other branch nodes below them. The top node is always a branch
  // node, and is the document object itself (meaning it has
  // additional methods and properties).
  //
  // All nodes have parent links. The tree is used both to go from
  // line numbers to line objects, and to go from objects to numbers.
  // It also indexes by height, and is used to convert between height
  // and line object, and to find the total height of the document.
  //
  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html

  function LeafChunk(lines) {
    this.lines = lines;
    this.parent = null;
    var height = 0;
    for (var i = 0; i < lines.length; ++i) {
      lines[i].parent = this;
      height += lines[i].height;
    }
    this.height = height;
  }

  LeafChunk.prototype = {
    chunkSize: function() { return this.lines.length },

    // Remove the n lines at offset 'at'.
    removeInner: function(at, n) {
      for (var i = at, e = at + n; i < e; ++i) {
        var line = this.lines[i];
        this.height -= line.height;
        cleanUpLine(line);
        signalLater(line, "delete");
      }
      this.lines.splice(at, n);
    },

    // Helper used to collapse a small branch into a single leaf.
    collapse: function(lines) {
      lines.push.apply(lines, this.lines);
    },

    // Insert the given array of lines at offset 'at', count them as
    // having the given height.
    insertInner: function(at, lines, height) {
      this.height += height;
      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }
    },

    // Used to iterate over a part of the tree.
    iterN: function(at, n, op) {
      for (var e = at + n; at < e; ++at)
        { if (op(this.lines[at])) { return true } }
    }
  };

  function BranchChunk(children) {
    this.children = children;
    var size = 0, height = 0;
    for (var i = 0; i < children.length; ++i) {
      var ch = children[i];
      size += ch.chunkSize(); height += ch.height;
      ch.parent = this;
    }
    this.size = size;
    this.height = height;
    this.parent = null;
  }

  BranchChunk.prototype = {
    chunkSize: function() { return this.size },

    removeInner: function(at, n) {
      this.size -= n;
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at < sz) {
          var rm = Math.min(n, sz - at), oldHeight = child.height;
          child.removeInner(at, rm);
          this.height -= oldHeight - child.height;
          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
          if ((n -= rm) == 0) { break }
          at = 0;
        } else { at -= sz; }
      }
      // If the result is smaller than 25 lines, ensure that it is a
      // single leaf node.
      if (this.size - n < 25 &&
          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
        var lines = [];
        this.collapse(lines);
        this.children = [new LeafChunk(lines)];
        this.children[0].parent = this;
      }
    },

    collapse: function(lines) {
      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }
    },

    insertInner: function(at, lines, height) {
      this.size += lines.length;
      this.height += height;
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at <= sz) {
          child.insertInner(at, lines, height);
          if (child.lines && child.lines.length > 50) {
            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
            var remaining = child.lines.length % 25 + 25;
            for (var pos = remaining; pos < child.lines.length;) {
              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
              child.height -= leaf.height;
              this.children.splice(++i, 0, leaf);
              leaf.parent = this;
            }
            child.lines = child.lines.slice(0, remaining);
            this.maybeSpill();
          }
          break
        }
        at -= sz;
      }
    },

    // When a node has grown, check whether it should be split.
    maybeSpill: function() {
      if (this.children.length <= 10) { return }
      var me = this;
      do {
        var spilled = me.children.splice(me.children.length - 5, 5);
        var sibling = new BranchChunk(spilled);
        if (!me.parent) { // Become the parent node
          var copy = new BranchChunk(me.children);
          copy.parent = me;
          me.children = [copy, sibling];
          me = copy;
       } else {
          me.size -= sibling.size;
          me.height -= sibling.height;
          var myIndex = indexOf(me.parent.children, me);
          me.parent.children.splice(myIndex + 1, 0, sibling);
        }
        sibling.parent = me.parent;
      } while (me.children.length > 10)
      me.parent.maybeSpill();
    },

    iterN: function(at, n, op) {
      for (var i = 0; i < this.children.length; ++i) {
        var child = this.children[i], sz = child.chunkSize();
        if (at < sz) {
          var used = Math.min(n, sz - at);
          if (child.iterN(at, used, op)) { return true }
          if ((n -= used) == 0) { break }
          at = 0;
        } else { at -= sz; }
      }
    }
  };

  // Line widgets are block elements displayed above or below a line.

  var LineWidget = function(doc, node, options) {
    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))
      { this[opt] = options[opt]; } } }
    this.doc = doc;
    this.node = node;
  };

  LineWidget.prototype.clear = function () {
    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
    if (no == null || !ws) { return }
    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }
    if (!ws.length) { line.widgets = null; }
    var height = widgetHeight(this);
    updateLineHeight(line, Math.max(0, line.height - height));
    if (cm) {
      runInOp(cm, function () {
        adjustScrollWhenAboveVisible(cm, line, -height);
        regLineChange(cm, no, "widget");
      });
      signalLater(cm, "lineWidgetCleared", cm, this, no);
    }
  };

  LineWidget.prototype.changed = function () {
      var this$1 = this;

    var oldH = this.height, cm = this.doc.cm, line = this.line;
    this.height = null;
    var diff = widgetHeight(this) - oldH;
    if (!diff) { return }
    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }
    if (cm) {
      runInOp(cm, function () {
        cm.curOp.forceUpdate = true;
        adjustScrollWhenAboveVisible(cm, line, diff);
        signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line));
      });
    }
  };
  eventMixin(LineWidget);

  function adjustScrollWhenAboveVisible(cm, line, diff) {
    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
      { addToScrollTop(cm, diff); }
  }

  function addLineWidget(doc, handle, node, options) {
    var widget = new LineWidget(doc, node, options);
    var cm = doc.cm;
    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }
    changeLine(doc, handle, "widget", function (line) {
      var widgets = line.widgets || (line.widgets = []);
      if (widget.insertAt == null) { widgets.push(widget); }
      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }
      widget.line = line;
      if (cm && !lineIsHidden(doc, line)) {
        var aboveVisible = heightAtLine(line) < doc.scrollTop;
        updateLineHeight(line, line.height + widgetHeight(widget));
        if (aboveVisible) { addToScrollTop(cm, widget.height); }
        cm.curOp.forceUpdate = true;
      }
      return true
    });
    if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); }
    return widget
  }

  // TEXTMARKERS

  // Created with markText and setBookmark methods. A TextMarker is a
  // handle that can be used to clear or find a marked position in the
  // document. Line objects hold arrays (markedSpans) containing
  // {from, to, marker} object pointing to such marker objects, and
  // indicating that such a marker is present on that line. Multiple
  // lines may point to the same marker when it spans across lines.
  // The spans will have null for their from/to properties when the
  // marker continues beyond the start/end of the line. Markers have
  // links back to the lines they currently touch.

  // Collapsed markers have unique ids, in order to be able to order
  // them, which is needed for uniquely determining an outer marker
  // when they overlap (they may nest, but not partially overlap).
  var nextMarkerId = 0;

  var TextMarker = function(doc, type) {
    this.lines = [];
    this.type = type;
    this.doc = doc;
    this.id = ++nextMarkerId;
  };

  // Clear the marker.
  TextMarker.prototype.clear = function () {
    if (this.explicitlyCleared) { return }
    var cm = this.doc.cm, withOp = cm && !cm.curOp;
    if (withOp) { startOperation(cm); }
    if (hasHandler(this, "clear")) {
      var found = this.find();
      if (found) { signalLater(this, "clear", found.from, found.to); }
    }
    var min = null, max = null;
    for (var i = 0; i < this.lines.length; ++i) {
      var line = this.lines[i];
      var span = getMarkedSpanFor(line.markedSpans, this);
      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); }
      else if (cm) {
        if (span.to != null) { max = lineNo(line); }
        if (span.from != null) { min = lineNo(line); }
      }
      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
        { updateLineHeight(line, textHeight(cm.display)); }
    }
    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {
      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);
      if (len > cm.display.maxLineLength) {
        cm.display.maxLine = visual;
        cm.display.maxLineLength = len;
        cm.display.maxLineChanged = true;
      }
    } }

    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }
    this.lines.length = 0;
    this.explicitlyCleared = true;
    if (this.atomic && this.doc.cantEdit) {
      this.doc.cantEdit = false;
      if (cm) { reCheckSelection(cm.doc); }
    }
    if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); }
    if (withOp) { endOperation(cm); }
    if (this.parent) { this.parent.clear(); }
  };

  // Find the position of the marker in the document. Returns a {from,
  // to} object by default. Side can be passed to get a specific side
  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
  // Pos objects returned contain a line object, rather than a line
  // number (used to prevent looking up the same line twice).
  TextMarker.prototype.find = function (side, lineObj) {
    if (side == null && this.type == "bookmark") { side = 1; }
    var from, to;
    for (var i = 0; i < this.lines.length; ++i) {
      var line = this.lines[i];
      var span = getMarkedSpanFor(line.markedSpans, this);
      if (span.from != null) {
        from = Pos(lineObj ? line : lineNo(line), span.from);
        if (side == -1) { return from }
      }
      if (span.to != null) {
        to = Pos(lineObj ? line : lineNo(line), span.to);
        if (side == 1) { return to }
      }
    }
    return from && {from: from, to: to}
  };

  // Signals that the marker's widget changed, and surrounding layout
  // should be recomputed.
  TextMarker.prototype.changed = function () {
      var this$1 = this;

    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
    if (!pos || !cm) { return }
    runInOp(cm, function () {
      var line = pos.line, lineN = lineNo(pos.line);
      var view = findViewForLine(cm, lineN);
      if (view) {
        clearLineMeasurementCacheFor(view);
        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
      }
      cm.curOp.updateMaxLine = true;
      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
        var oldHeight = widget.height;
        widget.height = null;
        var dHeight = widgetHeight(widget) - oldHeight;
        if (dHeight)
          { updateLineHeight(line, line.height + dHeight); }
      }
      signalLater(cm, "markerChanged", cm, this$1);
    });
  };

  TextMarker.prototype.attachLine = function (line) {
    if (!this.lines.length && this.doc.cm) {
      var op = this.doc.cm.curOp;
      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }
    }
    this.lines.push(line);
  };

  TextMarker.prototype.detachLine = function (line) {
    this.lines.splice(indexOf(this.lines, line), 1);
    if (!this.lines.length && this.doc.cm) {
      var op = this.doc.cm.curOp
      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
    }
  };
  eventMixin(TextMarker);

  // Create a marker, wire it up to the right lines, and
  function markText(doc, from, to, options, type) {
    // Shared markers (across linked documents) are handled separately
    // (markTextShared will call out to this again, once per
    // document).
    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }
    // Ensure we are in an operation.
    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }

    var marker = new TextMarker(doc, type), diff = cmp(from, to);
    if (options) { copyObj(options, marker, false); }
    // Don't connect empty markers unless clearWhenEmpty is false
    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
      { return marker }
    if (marker.replacedWith) {
      // Showing up as a widget implies collapsed (widget replaces text)
      marker.collapsed = true;
      marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget");
      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); }
      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }
    }
    if (marker.collapsed) {
      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
        { throw new Error("Inserting collapsed marker partially overlapping an existing one") }
      seeCollapsedSpans();
    }

    if (marker.addToHistory)
      { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); }

    var curLine = from.line, cm = doc.cm, updateMaxLine;
    doc.iter(curLine, to.line + 1, function (line) {
      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
        { updateMaxLine = true; }
      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
      addMarkedSpan(line, new MarkedSpan(marker,
                                         curLine == from.line ? from.ch : null,
                                         curLine == to.line ? to.ch : null));
      ++curLine;
    });
    // lineIsHidden depends on the presence of the spans, so needs a second pass
    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {
      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }
    }); }

    if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); }

    if (marker.readOnly) {
      seeReadOnlySpans();
      if (doc.history.done.length || doc.history.undone.length)
        { doc.clearHistory(); }
    }
    if (marker.collapsed) {
      marker.id = ++nextMarkerId;
      marker.atomic = true;
    }
    if (cm) {
      // Sync editor state
      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }
      if (marker.collapsed)
        { regChange(cm, from.line, to.line + 1); }
      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||
               marker.attributes || marker.title)
        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } }
      if (marker.atomic) { reCheckSelection(cm.doc); }
      signalLater(cm, "markerAdded", cm, marker);
    }
    return marker
  }

  // SHARED TEXTMARKERS

  // A shared marker spans multiple linked documents. It is
  // implemented as a meta-marker-object controlling multiple normal
  // markers.
  var SharedTextMarker = function(markers, primary) {
    this.markers = markers;
    this.primary = primary;
    for (var i = 0; i < markers.length; ++i)
      { markers[i].parent = this; }
  };

  SharedTextMarker.prototype.clear = function () {
    if (this.explicitlyCleared) { return }
    this.explicitlyCleared = true;
    for (var i = 0; i < this.markers.length; ++i)
      { this.markers[i].clear(); }
    signalLater(this, "clear");
  };

  SharedTextMarker.prototype.find = function (side, lineObj) {
    return this.primary.find(side, lineObj)
  };
  eventMixin(SharedTextMarker);

  function markTextShared(doc, from, to, options, type) {
    options = copyObj(options);
    options.shared = false;
    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
    var widget = options.widgetNode;
    linkedDocs(doc, function (doc) {
      if (widget) { options.widgetNode = widget.cloneNode(true); }
      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
      for (var i = 0; i < doc.linked.length; ++i)
        { if (doc.linked[i].isParent) { return } }
      primary = lst(markers);
    });
    return new SharedTextMarker(markers, primary)
  }

  function findSharedMarkers(doc) {
    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })
  }

  function copySharedMarkers(doc, markers) {
    for (var i = 0; i < markers.length; i++) {
      var marker = markers[i], pos = marker.find();
      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
      if (cmp(mFrom, mTo)) {
        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
        marker.markers.push(subMark);
        subMark.parent = marker;
      }
    }
  }

  function detachSharedMarkers(markers) {
    var loop = function ( i ) {
      var marker = markers[i], linked = [marker.primary.doc];
      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });
      for (var j = 0; j < marker.markers.length; j++) {
        var subMarker = marker.markers[j];
        if (indexOf(linked, subMarker.doc) == -1) {
          subMarker.parent = null;
          marker.markers.splice(j--, 1);
        }
      }
    };

    for (var i = 0; i < markers.length; i++) loop( i );
  }

  var nextDocId = 0;
  var Doc = function(text, mode, firstLine, lineSep, direction) {
    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }
    if (firstLine == null) { firstLine = 0; }

    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
    this.first = firstLine;
    this.scrollTop = this.scrollLeft = 0;
    this.cantEdit = false;
    this.cleanGeneration = 1;
    this.modeFrontier = this.highlightFrontier = firstLine;
    var start = Pos(firstLine, 0);
    this.sel = simpleSelection(start);
    this.history = new History(null);
    this.id = ++nextDocId;
    this.modeOption = mode;
    this.lineSep = lineSep;
    this.direction = (direction == "rtl") ? "rtl" : "ltr";
    this.extend = false;

    if (typeof text == "string") { text = this.splitLines(text); }
    updateDoc(this, {from: start, to: start, text: text});
    setSelection(this, simpleSelection(start), sel_dontScroll);
  };

  Doc.prototype = createObj(BranchChunk.prototype, {
    constructor: Doc,
    // Iterate over the document. Supports two forms -- with only one
    // argument, it calls that for each line in the document. With
    // three, it iterates over the range given by the first two (with
    // the second being non-inclusive).
    iter: function(from, to, op) {
      if (op) { this.iterN(from - this.first, to - from, op); }
      else { this.iterN(this.first, this.first + this.size, from); }
    },

    // Non-public interface for adding and removing lines.
    insert: function(at, lines) {
      var height = 0;
      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }
      this.insertInner(at - this.first, lines, height);
    },
    remove: function(at, n) { this.removeInner(at - this.first, n); },

    // From here, the methods are part of the public interface. Most
    // are also available from CodeMirror (editor) instances.

    getValue: function(lineSep) {
      var lines = getLines(this, this.first, this.first + this.size);
      if (lineSep === false) { return lines }
      return lines.join(lineSep || this.lineSeparator())
    },
    setValue: docMethodOp(function(code) {
      var top = Pos(this.first, 0), last = this.first + this.size - 1;
      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
                        text: this.splitLines(code), origin: "setValue", full: true}, true);
      if (this.cm) { scrollToCoords(this.cm, 0, 0); }
      setSelection(this, simpleSelection(top), sel_dontScroll);
    }),
    replaceRange: function(code, from, to, origin) {
      from = clipPos(this, from);
      to = to ? clipPos(this, to) : from;
      replaceRange(this, code, from, to, origin);
    },
    getRange: function(from, to, lineSep) {
      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
      if (lineSep === false) { return lines }
      return lines.join(lineSep || this.lineSeparator())
    },

    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},

    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},
    getLineNumber: function(line) {return lineNo(line)},

    getLineHandleVisualStart: function(line) {
      if (typeof line == "number") { line = getLine(this, line); }
      return visualLine(line)
    },

    lineCount: function() {return this.size},
    firstLine: function() {return this.first},
    lastLine: function() {return this.first + this.size - 1},

    clipPos: function(pos) {return clipPos(this, pos)},

    getCursor: function(start) {
      var range = this.sel.primary(), pos;
      if (start == null || start == "head") { pos = range.head; }
      else if (start == "anchor") { pos = range.anchor; }
      else if (start == "end" || start == "to" || start === false) { pos = range.to(); }
      else { pos = range.from(); }
      return pos
    },
    listSelections: function() { return this.sel.ranges },
    somethingSelected: function() {return this.sel.somethingSelected()},

    setCursor: docMethodOp(function(line, ch, options) {
      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
    }),
    setSelection: docMethodOp(function(anchor, head, options) {
      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
    }),
    extendSelection: docMethodOp(function(head, other, options) {
      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
    }),
    extendSelections: docMethodOp(function(heads, options) {
      extendSelections(this, clipPosArray(this, heads), options);
    }),
    extendSelectionsBy: docMethodOp(function(f, options) {
      var heads = map(this.sel.ranges, f);
      extendSelections(this, clipPosArray(this, heads), options);
    }),
    setSelections: docMethodOp(function(ranges, primary, options) {
      if (!ranges.length) { return }
      var out = [];
      for (var i = 0; i < ranges.length; i++)
        { out[i] = new Range(clipPos(this, ranges[i].anchor),
                           clipPos(this, ranges[i].head || ranges[i].anchor)); }
      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
      setSelection(this, normalizeSelection(this.cm, out, primary), options);
    }),
    addSelection: docMethodOp(function(anchor, head, options) {
      var ranges = this.sel.ranges.slice(0);
      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);
    }),

    getSelection: function(lineSep) {
      var ranges = this.sel.ranges, lines;
      for (var i = 0; i < ranges.length; i++) {
        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
        lines = lines ? lines.concat(sel) : sel;
      }
      if (lineSep === false) { return lines }
      else { return lines.join(lineSep || this.lineSeparator()) }
    },
    getSelections: function(lineSep) {
      var parts = [], ranges = this.sel.ranges;
      for (var i = 0; i < ranges.length; i++) {
        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }
        parts[i] = sel;
      }
      return parts
    },
    replaceSelection: function(code, collapse, origin) {
      var dup = [];
      for (var i = 0; i < this.sel.ranges.length; i++)
        { dup[i] = code; }
      this.replaceSelections(dup, collapse, origin || "+input");
    },
    replaceSelections: docMethodOp(function(code, collapse, origin) {
      var changes = [], sel = this.sel;
      for (var i = 0; i < sel.ranges.length; i++) {
        var range = sel.ranges[i];
        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
      }
      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)
        { makeChange(this, changes[i$1]); }
      if (newSel) { setSelectionReplaceHistory(this, newSel); }
      else if (this.cm) { ensureCursorVisible(this.cm); }
    }),
    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),

    setExtending: function(val) {this.extend = val;},
    getExtending: function() {return this.extend},

    historySize: function() {
      var hist = this.history, done = 0, undone = 0;
      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }
      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }
      return {undo: done, redo: undone}
    },
    clearHistory: function() {
      var this$1 = this;

      this.history = new History(this.history);
      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);
    },

    markClean: function() {
      this.cleanGeneration = this.changeGeneration(true);
    },
    changeGeneration: function(forceSplit) {
      if (forceSplit)
        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }
      return this.history.generation
    },
    isClean: function (gen) {
      return this.history.generation == (gen || this.cleanGeneration)
    },

    getHistory: function() {
      return {done: copyHistoryArray(this.history.done),
              undone: copyHistoryArray(this.history.undone)}
    },
    setHistory: function(histData) {
      var hist = this.history = new History(this.history);
      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
    },

    setGutterMarker: docMethodOp(function(line, gutterID, value) {
      return changeLine(this, line, "gutter", function (line) {
        var markers = line.gutterMarkers || (line.gutterMarkers = {});
        markers[gutterID] = value;
        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }
        return true
      })
    }),

    clearGutter: docMethodOp(function(gutterID) {
      var this$1 = this;

      this.iter(function (line) {
        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
          changeLine(this$1, line, "gutter", function () {
            line.gutterMarkers[gutterID] = null;
            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }
            return true
          });
        }
      });
    }),

    lineInfo: function(line) {
      var n;
      if (typeof line == "number") {
        if (!isLine(this, line)) { return null }
        n = line;
        line = getLine(this, line);
        if (!line) { return null }
      } else {
        n = lineNo(line);
        if (n == null) { return null }
      }
      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
              widgets: line.widgets}
    },

    addLineClass: docMethodOp(function(handle, where, cls) {
      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
        var prop = where == "text" ? "textClass"
                 : where == "background" ? "bgClass"
                 : where == "gutter" ? "gutterClass" : "wrapClass";
        if (!line[prop]) { line[prop] = cls; }
        else if (classTest(cls).test(line[prop])) { return false }
        else { line[prop] += " " + cls; }
        return true
      })
    }),
    removeLineClass: docMethodOp(function(handle, where, cls) {
      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
        var prop = where == "text" ? "textClass"
                 : where == "background" ? "bgClass"
                 : where == "gutter" ? "gutterClass" : "wrapClass";
        var cur = line[prop];
        if (!cur) { return false }
        else if (cls == null) { line[prop] = null; }
        else {
          var found = cur.match(classTest(cls));
          if (!found) { return false }
          var end = found.index + found[0].length;
          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
        }
        return true
      })
    }),

    addLineWidget: docMethodOp(function(handle, node, options) {
      return addLineWidget(this, handle, node, options)
    }),
    removeLineWidget: function(widget) { widget.clear(); },

    markText: function(from, to, options) {
      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range")
    },
    setBookmark: function(pos, options) {
      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
                      insertLeft: options && options.insertLeft,
                      clearWhenEmpty: false, shared: options && options.shared,
                      handleMouseEvents: options && options.handleMouseEvents};
      pos = clipPos(this, pos);
      return markText(this, pos, pos, realOpts, "bookmark")
    },
    findMarksAt: function(pos) {
      pos = clipPos(this, pos);
      var markers = [], spans = getLine(this, pos.line).markedSpans;
      if (spans) { for (var i = 0; i < spans.length; ++i) {
        var span = spans[i];
        if ((span.from == null || span.from <= pos.ch) &&
            (span.to == null || span.to >= pos.ch))
          { markers.push(span.marker.parent || span.marker); }
      } }
      return markers
    },
    findMarks: function(from, to, filter) {
      from = clipPos(this, from); to = clipPos(this, to);
      var found = [], lineNo = from.line;
      this.iter(from.line, to.line + 1, function (line) {
        var spans = line.markedSpans;
        if (spans) { for (var i = 0; i < spans.length; i++) {
          var span = spans[i];
          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
                span.from == null && lineNo != from.line ||
                span.from != null && lineNo == to.line && span.from >= to.ch) &&
              (!filter || filter(span.marker)))
            { found.push(span.marker.parent || span.marker); }
        } }
        ++lineNo;
      });
      return found
    },
    getAllMarks: function() {
      var markers = [];
      this.iter(function (line) {
        var sps = line.markedSpans;
        if (sps) { for (var i = 0; i < sps.length; ++i)
          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }
      });
      return markers
    },

    posFromIndex: function(off) {
      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
      this.iter(function (line) {
        var sz = line.text.length + sepSize;
        if (sz > off) { ch = off; return true }
        off -= sz;
        ++lineNo;
      });
      return clipPos(this, Pos(lineNo, ch))
    },
    indexFromPos: function (coords) {
      coords = clipPos(this, coords);
      var index = coords.ch;
      if (coords.line < this.first || coords.ch < 0) { return 0 }
      var sepSize = this.lineSeparator().length;
      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value
        index += line.text.length + sepSize;
      });
      return index
    },

    copy: function(copyHistory) {
      var doc = new Doc(getLines(this, this.first, this.first + this.size),
                        this.modeOption, this.first, this.lineSep, this.direction);
      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
      doc.sel = this.sel;
      doc.extend = false;
      if (copyHistory) {
        doc.history.undoDepth = this.history.undoDepth;
        doc.setHistory(this.getHistory());
      }
      return doc
    },

    linkedDoc: function(options) {
      if (!options) { options = {}; }
      var from = this.first, to = this.first + this.size;
      if (options.from != null && options.from > from) { from = options.from; }
      if (options.to != null && options.to < to) { to = options.to; }
      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);
      if (options.sharedHist) { copy.history = this.history
      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
      copySharedMarkers(copy, findSharedMarkers(this));
      return copy
    },
    unlinkDoc: function(other) {
      if (other instanceof CodeMirror) { other = other.doc; }
      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {
        var link = this.linked[i];
        if (link.doc != other) { continue }
        this.linked.splice(i, 1);
        other.unlinkDoc(this);
        detachSharedMarkers(findSharedMarkers(this));
        break
      } }
      // If the histories were shared, split them again
      if (other.history == this.history) {
        var splitIds = [other.id];
        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);
        other.history = new History(null);
        other.history.done = copyHistoryArray(this.history.done, splitIds);
        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
      }
    },
    iterLinkedDocs: function(f) {linkedDocs(this, f);},

    getMode: function() {return this.mode},
    getEditor: function() {return this.cm},

    splitLines: function(str) {
      if (this.lineSep) { return str.split(this.lineSep) }
      return splitLinesAuto(str)
    },
    lineSeparator: function() { return this.lineSep || "\n" },

    setDirection: docMethodOp(function (dir) {
      if (dir != "rtl") { dir = "ltr"; }
      if (dir == this.direction) { return }
      this.direction = dir;
      this.iter(function (line) { return line.order = null; });
      if (this.cm) { directionChanged(this.cm); }
    })
  });

  // Public alias.
  Doc.prototype.eachLine = Doc.prototype.iter;

  // Kludge to work around strange IE behavior where it'll sometimes
  // re-fire a series of drag-related events right after the drop (#1551)
  var lastDrop = 0;

  function onDrop(e) {
    var cm = this;
    clearDragCursor(cm);
    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
      { return }
    e_preventDefault(e);
    if (ie) { lastDrop = +new Date; }
    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
    if (!pos || cm.isReadOnly()) { return }
    // Might be a file drop, in which case we simply extract the text
    // and insert it.
    if (files && files.length && window.FileReader && window.File) {
      var n = files.length, text = Array(n), read = 0;
      var markAsReadAndPasteIfAllFilesAreRead = function () {
        if (++read == n) {
          operation(cm, function () {
            pos = clipPos(cm.doc, pos);
            var change = {from: pos, to: pos,
                          text: cm.doc.splitLines(
                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),
                          origin: "paste"};
            makeChange(cm.doc, change);
            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));
          })();
        }
      };
      var readTextFromFile = function (file, i) {
        if (cm.options.allowDropFileTypes &&
            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {
          markAsReadAndPasteIfAllFilesAreRead();
          return
        }
        var reader = new FileReader;
        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };
        reader.onload = function () {
          var content = reader.result;
          if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) {
            markAsReadAndPasteIfAllFilesAreRead();
            return
          }
          text[i] = content;
          markAsReadAndPasteIfAllFilesAreRead();
        };
        reader.readAsText(file);
      };
      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }
    } else { // Normal drop
      // Don't do a replace if the drop happened inside of the selected text.
      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
        cm.state.draggingText(e);
        // Ensure the editor is re-focused
        setTimeout(function () { return cm.display.input.focus(); }, 20);
        return
      }
      try {
        var text$1 = e.dataTransfer.getData("Text");
        if (text$1) {
          var selected;
          if (cm.state.draggingText && !cm.state.draggingText.copy)
            { selected = cm.listSelections(); }
          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)
            { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } }
          cm.replaceSelection(text$1, "around", "paste");
          cm.display.input.focus();
        }
      }
      catch(e$1){}
    }
  }

  function onDragStart(cm, e) {
    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }
    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }

    e.dataTransfer.setData("Text", cm.getSelection());
    e.dataTransfer.effectAllowed = "copyMove";

    // Use dummy image instead of default browsers image.
    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
    if (e.dataTransfer.setDragImage && !safari) {
      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
      if (presto) {
        img.width = img.height = 1;
        cm.display.wrapper.appendChild(img);
        // Force a relayout, or Opera won't use our image for some obscure reason
        img._top = img.offsetTop;
      }
      e.dataTransfer.setDragImage(img, 0, 0);
      if (presto) { img.parentNode.removeChild(img); }
    }
  }

  function onDragOver(cm, e) {
    var pos = posFromMouse(cm, e);
    if (!pos) { return }
    var frag = document.createDocumentFragment();
    drawSelectionCursor(cm, pos, frag);
    if (!cm.display.dragCursor) {
      cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
    }
    removeChildrenAndAdd(cm.display.dragCursor, frag);
  }

  function clearDragCursor(cm) {
    if (cm.display.dragCursor) {
      cm.display.lineSpace.removeChild(cm.display.dragCursor);
      cm.display.dragCursor = null;
    }
  }

  // These must be handled carefully, because naively registering a
  // handler for each editor will cause the editors to never be
  // garbage collected.

  function forEachCodeMirror(f) {
    if (!document.getElementsByClassName) { return }
    var byClass = document.getElementsByClassName("CodeMirror"), editors = [];
    for (var i = 0; i < byClass.length; i++) {
      var cm = byClass[i].CodeMirror;
      if (cm) { editors.push(cm); }
    }
    if (editors.length) { editors[0].operation(function () {
      for (var i = 0; i < editors.length; i++) { f(editors[i]); }
    }); }
  }

  var globalsRegistered = false;
  function ensureGlobalHandlers() {
    if (globalsRegistered) { return }
    registerGlobalHandlers();
    globalsRegistered = true;
  }
  function registerGlobalHandlers() {
    // When the window resizes, we need to refresh active editors.
    var resizeTimer;
    on(window, "resize", function () {
      if (resizeTimer == null) { resizeTimer = setTimeout(function () {
        resizeTimer = null;
        forEachCodeMirror(onResize);
      }, 100); }
    });
    // When the window loses focus, we want to show the editor as blurred
    on(window, "blur", function () { return forEachCodeMirror(onBlur); });
  }
  // Called when the window resizes
  function onResize(cm) {
    var d = cm.display;
    // Might be a text scaling operation, clear size caches.
    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
    d.scrollbarsClipped = false;
    cm.setSize();
  }

  var keyNames = {
    3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
    19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
    36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
    46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
    106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock",
    173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
    221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
    63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
  };

  // Number keys
  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }
  // Alphabetic keys
  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }
  // Function keys
  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; }

  var keyMap = {};

  keyMap.basic = {
    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
    "Esc": "singleSelection"
  };
  // Note that the save and find-related commands aren't defined by
  // default. User code or addons can define them. Unknown commands
  // are simply ignored.
  keyMap.pcDefault = {
    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
    "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
    "fallthrough": "basic"
  };
  // Very basic readline/emacs-style bindings, which are standard on Mac.
  keyMap.emacsy = {
    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
    "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
    "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
    "Ctrl-O": "openLine"
  };
  keyMap.macDefault = {
    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
    "fallthrough": ["basic", "emacsy"]
  };
  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;

  // KEYMAP DISPATCH

  function normalizeKeyName(name) {
    var parts = name.split(/-(?!$)/);
    name = parts[parts.length - 1];
    var alt, ctrl, shift, cmd;
    for (var i = 0; i < parts.length - 1; i++) {
      var mod = parts[i];
      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }
      else if (/^a(lt)?$/i.test(mod)) { alt = true; }
      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }
      else if (/^s(hift)?$/i.test(mod)) { shift = true; }
      else { throw new Error("Unrecognized modifier name: " + mod) }
    }
    if (alt) { name = "Alt-" + name; }
    if (ctrl) { name = "Ctrl-" + name; }
    if (cmd) { name = "Cmd-" + name; }
    if (shift) { name = "Shift-" + name; }
    return name
  }

  // This is a kludge to keep keymaps mostly working as raw objects
  // (backwards compatibility) while at the same time support features
  // like normalization and multi-stroke key bindings. It compiles a
  // new normalized keymap, and then updates the old object to reflect
  // this.
  function normalizeKeyMap(keymap) {
    var copy = {};
    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {
      var value = keymap[keyname];
      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }
      if (value == "...") { delete keymap[keyname]; continue }

      var keys = map(keyname.split(" "), normalizeKeyName);
      for (var i = 0; i < keys.length; i++) {
        var val = (void 0), name = (void 0);
        if (i == keys.length - 1) {
          name = keys.join(" ");
          val = value;
        } else {
          name = keys.slice(0, i + 1).join(" ");
          val = "...";
        }
        var prev = copy[name];
        if (!prev) { copy[name] = val; }
        else if (prev != val) { throw new Error("Inconsistent bindings for " + name) }
      }
      delete keymap[keyname];
    } }
    for (var prop in copy) { keymap[prop] = copy[prop]; }
    return keymap
  }

  function lookupKey(key, map, handle, context) {
    map = getKeyMap(map);
    var found = map.call ? map.call(key, context) : map[key];
    if (found === false) { return "nothing" }
    if (found === "...") { return "multi" }
    if (found != null && handle(found)) { return "handled" }

    if (map.fallthrough) {
      if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
        { return lookupKey(key, map.fallthrough, handle, context) }
      for (var i = 0; i < map.fallthrough.length; i++) {
        var result = lookupKey(key, map.fallthrough[i], handle, context);
        if (result) { return result }
      }
    }
  }

  // Modifier key presses don't count as 'real' key presses for the
  // purpose of keymap fallthrough.
  function isModifierKey(value) {
    var name = typeof value == "string" ? value : keyNames[value.keyCode];
    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"
  }

  function addModifierNames(name, event, noShift) {
    var base = name;
    if (event.altKey && base != "Alt") { name = "Alt-" + name; }
    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; }
    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; }
    if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; }
    return name
  }

  // Look up the name of a key as indicated by an event object.
  function keyName(event, noShift) {
    if (presto && event.keyCode == 34 && event["char"]) { return false }
    var name = keyNames[event.keyCode];
    if (name == null || event.altGraphKey) { return false }
    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,
    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)
    if (event.keyCode == 3 && event.code) { name = event.code; }
    return addModifierNames(name, event, noShift)
  }

  function getKeyMap(val) {
    return typeof val == "string" ? keyMap[val] : val
  }

  // Helper for deleting text near the selection(s), used to implement
  // backspace, delete, and similar functionality.
  function deleteNearSelection(cm, compute) {
    var ranges = cm.doc.sel.ranges, kill = [];
    // Build up a set of ranges to kill first, merging overlapping
    // ranges.
    for (var i = 0; i < ranges.length; i++) {
      var toKill = compute(ranges[i]);
      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
        var replaced = kill.pop();
        if (cmp(replaced.from, toKill.from) < 0) {
          toKill.from = replaced.from;
          break
        }
      }
      kill.push(toKill);
    }
    // Next, remove those actual ranges.
    runInOp(cm, function () {
      for (var i = kill.length - 1; i >= 0; i--)
        { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); }
      ensureCursorVisible(cm);
    });
  }

  function moveCharLogically(line, ch, dir) {
    var target = skipExtendingChars(line.text, ch + dir, dir);
    return target < 0 || target > line.text.length ? null : target
  }

  function moveLogically(line, start, dir) {
    var ch = moveCharLogically(line, start.ch, dir);
    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before")
  }

  function endOfLine(visually, cm, lineObj, lineNo, dir) {
    if (visually) {
      if (cm.doc.direction == "rtl") { dir = -dir; }
      var order = getOrder(lineObj, cm.doc.direction);
      if (order) {
        var part = dir < 0 ? lst(order) : order[0];
        var moveInStorageOrder = (dir < 0) == (part.level == 1);
        var sticky = moveInStorageOrder ? "after" : "before";
        var ch;
        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),
        // it could be that the last bidi part is not on the last visual line,
        // since visual lines contain content order-consecutive chunks.
        // Thus, in rtl, we are looking for the first (content-order) character
        // in the rtl chunk that is on the last line (that is, the same line
        // as the last (content-order) character).
        if (part.level > 0 || cm.doc.direction == "rtl") {
          var prep = prepareMeasureForLine(cm, lineObj);
          ch = dir < 0 ? lineObj.text.length - 1 : 0;
          var targetTop = measureCharPrepared(cm, prep, ch).top;
          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);
          if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); }
        } else { ch = dir < 0 ? part.to : part.from; }
        return new Pos(lineNo, ch, sticky)
      }
    }
    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after")
  }

  function moveVisually(cm, line, start, dir) {
    var bidi = getOrder(line, cm.doc.direction);
    if (!bidi) { return moveLogically(line, start, dir) }
    if (start.ch >= line.text.length) {
      start.ch = line.text.length;
      start.sticky = "before";
    } else if (start.ch <= 0) {
      start.ch = 0;
      start.sticky = "after";
    }
    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];
    if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {
      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,
      // nothing interesting happens.
      return moveLogically(line, start, dir)
    }

    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };
    var prep;
    var getWrappedLineExtent = function (ch) {
      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }
      prep = prep || prepareMeasureForLine(cm, line);
      return wrappedLineExtentChar(cm, line, prep, ch)
    };
    var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch);

    if (cm.doc.direction == "rtl" || part.level == 1) {
      var moveInStorageOrder = (part.level == 1) == (dir < 0);
      var ch = mv(start, moveInStorageOrder ? 1 : -1);
      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {
        // Case 2: We move within an rtl part or in an rtl editor on the same visual line
        var sticky = moveInStorageOrder ? "before" : "after";
        return new Pos(start.line, ch, sticky)
      }
    }

    // Case 3: Could not move within this bidi part in this visual line, so leave
    // the current bidi part

    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {
      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder
        ? new Pos(start.line, mv(ch, 1), "before")
        : new Pos(start.line, ch, "after"); };

      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {
        var part = bidi[partPos];
        var moveInStorageOrder = (dir > 0) == (part.level != 1);
        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);
        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }
        ch = moveInStorageOrder ? part.from : mv(part.to, -1);
        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }
      }
    };

    // Case 3a: Look for other bidi parts on the same visual line
    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);
    if (res) { return res }

    // Case 3b: Look for other bidi parts on the next visual line
    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);
    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {
      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));
      if (res) { return res }
    }

    // Case 4: Nowhere to move
    return null
  }

  // Commands are parameter-less actions that can be performed on an
  // editor, mostly used for keybindings.
  var commands = {
    selectAll: selectAll,
    singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); },
    killLine: function (cm) { return deleteNearSelection(cm, function (range) {
      if (range.empty()) {
        var len = getLine(cm.doc, range.head.line).text.length;
        if (range.head.ch == len && range.head.line < cm.lastLine())
          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }
        else
          { return {from: range.head, to: Pos(range.head.line, len)} }
      } else {
        return {from: range.from(), to: range.to()}
      }
    }); },
    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({
      from: Pos(range.from().line, 0),
      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))
    }); }); },
    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({
      from: Pos(range.from().line, 0), to: range.from()
    }); }); },
    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {
      var top = cm.charCoords(range.head, "div").top + 5;
      var leftPos = cm.coordsChar({left: 0, top: top}, "div");
      return {from: leftPos, to: range.from()}
    }); },
    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {
      var top = cm.charCoords(range.head, "div").top + 5;
      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
      return {from: range.from(), to: rightPos }
    }); },
    undo: function (cm) { return cm.undo(); },
    redo: function (cm) { return cm.redo(); },
    undoSelection: function (cm) { return cm.undoSelection(); },
    redoSelection: function (cm) { return cm.redoSelection(); },
    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },
    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },
    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },
      {origin: "+move", bias: 1}
    ); },
    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },
      {origin: "+move", bias: 1}
    ); },
    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },
      {origin: "+move", bias: -1}
    ); },
    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {
      var top = cm.cursorCoords(range.head, "div").top + 5;
      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")
    }, sel_move); },
    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {
      var top = cm.cursorCoords(range.head, "div").top + 5;
      return cm.coordsChar({left: 0, top: top}, "div")
    }, sel_move); },
    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {
      var top = cm.cursorCoords(range.head, "div").top + 5;
      var pos = cm.coordsChar({left: 0, top: top}, "div");
      if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) }
      return pos
    }, sel_move); },
    goLineUp: function (cm) { return cm.moveV(-1, "line"); },
    goLineDown: function (cm) { return cm.moveV(1, "line"); },
    goPageUp: function (cm) { return cm.moveV(-1, "page"); },
    goPageDown: function (cm) { return cm.moveV(1, "page"); },
    goCharLeft: function (cm) { return cm.moveH(-1, "char"); },
    goCharRight: function (cm) { return cm.moveH(1, "char"); },
    goColumnLeft: function (cm) { return cm.moveH(-1, "column"); },
    goColumnRight: function (cm) { return cm.moveH(1, "column"); },
    goWordLeft: function (cm) { return cm.moveH(-1, "word"); },
    goGroupRight: function (cm) { return cm.moveH(1, "group"); },
    goGroupLeft: function (cm) { return cm.moveH(-1, "group"); },
    goWordRight: function (cm) { return cm.moveH(1, "word"); },
    delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); },
    delCharAfter: function (cm) { return cm.deleteH(1, "char"); },
    delWordBefore: function (cm) { return cm.deleteH(-1, "word"); },
    delWordAfter: function (cm) { return cm.deleteH(1, "word"); },
    delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); },
    delGroupAfter: function (cm) { return cm.deleteH(1, "group"); },
    indentAuto: function (cm) { return cm.indentSelection("smart"); },
    indentMore: function (cm) { return cm.indentSelection("add"); },
    indentLess: function (cm) { return cm.indentSelection("subtract"); },
    insertTab: function (cm) { return cm.replaceSelection("\t"); },
    insertSoftTab: function (cm) {
      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
      for (var i = 0; i < ranges.length; i++) {
        var pos = ranges[i].from();
        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
        spaces.push(spaceStr(tabSize - col % tabSize));
      }
      cm.replaceSelections(spaces);
    },
    defaultTab: function (cm) {
      if (cm.somethingSelected()) { cm.indentSelection("add"); }
      else { cm.execCommand("insertTab"); }
    },
    // Swap the two chars left and right of each selection's head.
    // Move cursor behind the two swapped characters afterwards.
    //
    // Doesn't consider line feeds a character.
    // Doesn't scan more than one line above to find a character.
    // Doesn't do anything on an empty line.
    // Doesn't do anything with non-empty selections.
    transposeChars: function (cm) { return runInOp(cm, function () {
      var ranges = cm.listSelections(), newSel = [];
      for (var i = 0; i < ranges.length; i++) {
        if (!ranges[i].empty()) { continue }
        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
        if (line) {
          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }
          if (cur.ch > 0) {
            cur = new Pos(cur.line, cur.ch + 1);
            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
                            Pos(cur.line, cur.ch - 2), cur, "+transpose");
          } else if (cur.line > cm.doc.first) {
            var prev = getLine(cm.doc, cur.line - 1).text;
            if (prev) {
              cur = new Pos(cur.line, 1);
              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
                              prev.charAt(prev.length - 1),
                              Pos(cur.line - 1, prev.length - 1), cur, "+transpose");
            }
          }
        }
        newSel.push(new Range(cur, cur));
      }
      cm.setSelections(newSel);
    }); },
    newlineAndIndent: function (cm) { return runInOp(cm, function () {
      var sels = cm.listSelections();
      for (var i = sels.length - 1; i >= 0; i--)
        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); }
      sels = cm.listSelections();
      for (var i$1 = 0; i$1 < sels.length; i$1++)
        { cm.indentLine(sels[i$1].from().line, null, true); }
      ensureCursorVisible(cm);
    }); },
    openLine: function (cm) { return cm.replaceSelection("\n", "start"); },
    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }
  };


  function lineStart(cm, lineN) {
    var line = getLine(cm.doc, lineN);
    var visual = visualLine(line);
    if (visual != line) { lineN = lineNo(visual); }
    return endOfLine(true, cm, visual, lineN, 1)
  }
  function lineEnd(cm, lineN) {
    var line = getLine(cm.doc, lineN);
    var visual = visualLineEnd(line);
    if (visual != line) { lineN = lineNo(visual); }
    return endOfLine(true, cm, line, lineN, -1)
  }
  function lineStartSmart(cm, pos) {
    var start = lineStart(cm, pos.line);
    var line = getLine(cm.doc, start.line);
    var order = getOrder(line, cm.doc.direction);
    if (!order || order[0].level == 0) {
      var firstNonWS = Math.max(start.ch, line.text.search(/\S/));
      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)
    }
    return start
  }

  // Run a handler that was bound to a key.
  function doHandleBinding(cm, bound, dropShift) {
    if (typeof bound == "string") {
      bound = commands[bound];
      if (!bound) { return false }
    }
    // Ensure previous input has been read, so that the handler sees a
    // consistent view of the document
    cm.display.input.ensurePolled();
    var prevShift = cm.display.shift, done = false;
    try {
      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
      if (dropShift) { cm.display.shift = false; }
      done = bound(cm) != Pass;
    } finally {
      cm.display.shift = prevShift;
      cm.state.suppressEdits = false;
    }
    return done
  }

  function lookupKeyForEditor(cm, name, handle) {
    for (var i = 0; i < cm.state.keyMaps.length; i++) {
      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
      if (result) { return result }
    }
    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
      || lookupKey(name, cm.options.keyMap, handle, cm)
  }

  // Note that, despite the name, this function is also used to check
  // for bound mouse clicks.

  var stopSeq = new Delayed;

  function dispatchKey(cm, name, e, handle) {
    var seq = cm.state.keySeq;
    if (seq) {
      if (isModifierKey(name)) { return "handled" }
      if (/\'$/.test(name))
        { cm.state.keySeq = null; }
      else
        { stopSeq.set(50, function () {
          if (cm.state.keySeq == seq) {
            cm.state.keySeq = null;
            cm.display.input.reset();
          }
        }); }
      if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true }
    }
    return dispatchKeyInner(cm, name, e, handle)
  }

  function dispatchKeyInner(cm, name, e, handle) {
    var result = lookupKeyForEditor(cm, name, handle);

    if (result == "multi")
      { cm.state.keySeq = name; }
    if (result == "handled")
      { signalLater(cm, "keyHandled", cm, name, e); }

    if (result == "handled" || result == "multi") {
      e_preventDefault(e);
      restartBlink(cm);
    }

    return !!result
  }

  // Handle a key from the keydown event.
  function handleKeyBinding(cm, e) {
    var name = keyName(e, true);
    if (!name) { return false }

    if (e.shiftKey && !cm.state.keySeq) {
      // First try to resolve full name (including 'Shift-'). Failing
      // that, see if there is a cursor-motion command (starting with
      // 'go') bound to the keyname without 'Shift-'.
      return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); })
          || dispatchKey(cm, name, e, function (b) {
               if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
                 { return doHandleBinding(cm, b) }
             })
    } else {
      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })
    }
  }

  // Handle a key from the keypress event
  function handleCharBinding(cm, e, ch) {
    return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); })
  }

  var lastStoppedKey = null;
  function onKeyDown(e) {
    var cm = this;
    if (e.target && e.target != cm.display.input.getField()) { return }
    cm.curOp.focus = activeElt();
    if (signalDOMEvent(cm, e)) { return }
    // IE does strange things with escape.
    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }
    var code = e.keyCode;
    cm.display.shift = code == 16 || e.shiftKey;
    var handled = handleKeyBinding(cm, e);
    if (presto) {
      lastStoppedKey = handled ? code : null;
      // Opera has no cut event... we try to at least catch the key combo
      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
        { cm.replaceSelection("", null, "cut"); }
    }
    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)
      { document.execCommand("cut"); }

    // Turn mouse into crosshair when Alt is held on Mac.
    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
      { showCrossHair(cm); }
  }

  function showCrossHair(cm) {
    var lineDiv = cm.display.lineDiv;
    addClass(lineDiv, "CodeMirror-crosshair");

    function up(e) {
      if (e.keyCode == 18 || !e.altKey) {
        rmClass(lineDiv, "CodeMirror-crosshair");
        off(document, "keyup", up);
        off(document, "mouseover", up);
      }
    }
    on(document, "keyup", up);
    on(document, "mouseover", up);
  }

  function onKeyUp(e) {
    if (e.keyCode == 16) { this.doc.sel.shift = false; }
    signalDOMEvent(this, e);
  }

  function onKeyPress(e) {
    var cm = this;
    if (e.target && e.target != cm.display.input.getField()) { return }
    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }
    var keyCode = e.keyCode, charCode = e.charCode;
    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}
    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }
    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
    // Some browsers fire keypress events for backspace
    if (ch == "\x08") { return }
    if (handleCharBinding(cm, e, ch)) { return }
    cm.display.input.onKeyPress(e);
  }

  var DOUBLECLICK_DELAY = 400;

  var PastClick = function(time, pos, button) {
    this.time = time;
    this.pos = pos;
    this.button = button;
  };

  PastClick.prototype.compare = function (time, pos, button) {
    return this.time + DOUBLECLICK_DELAY > time &&
      cmp(pos, this.pos) == 0 && button == this.button
  };

  var lastClick, lastDoubleClick;
  function clickRepeat(pos, button) {
    var now = +new Date;
    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {
      lastClick = lastDoubleClick = null;
      return "triple"
    } else if (lastClick && lastClick.compare(now, pos, button)) {
      lastDoubleClick = new PastClick(now, pos, button);
      lastClick = null;
      return "double"
    } else {
      lastClick = new PastClick(now, pos, button);
      lastDoubleClick = null;
      return "single"
    }
  }

  // A mouse down can be a single click, double click, triple click,
  // start of selection drag, start of text drag, new cursor
  // (ctrl-click), rectangle drag (alt-drag), or xwin
  // middle-click-paste. Or it might be a click on something we should
  // not interfere with, such as a scrollbar or widget.
  function onMouseDown(e) {
    var cm = this, display = cm.display;
    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }
    display.input.ensurePolled();
    display.shift = e.shiftKey;

    if (eventInWidget(display, e)) {
      if (!webkit) {
        // Briefly turn off draggability, to allow widgets to do
        // normal dragging things.
        display.scroller.draggable = false;
        setTimeout(function () { return display.scroller.draggable = true; }, 100);
      }
      return
    }
    if (clickInGutter(cm, e)) { return }
    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single";
    window.focus();

    // #3261: make sure, that we're not starting a second selection
    if (button == 1 && cm.state.selectingText)
      { cm.state.selectingText(e); }

    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }

    if (button == 1) {
      if (pos) { leftButtonDown(cm, pos, repeat, e); }
      else if (e_target(e) == display.scroller) { e_preventDefault(e); }
    } else if (button == 2) {
      if (pos) { extendSelection(cm.doc, pos); }
      setTimeout(function () { return display.input.focus(); }, 20);
    } else if (button == 3) {
      if (captureRightClick) { cm.display.input.onContextMenu(e); }
      else { delayBlurEvent(cm); }
    }
  }

  function handleMappedButton(cm, button, pos, repeat, event) {
    var name = "Click";
    if (repeat == "double") { name = "Double" + name; }
    else if (repeat == "triple") { name = "Triple" + name; }
    name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name;

    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {
      if (typeof bound == "string") { bound = commands[bound]; }
      if (!bound) { return false }
      var done = false;
      try {
        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
        done = bound(cm, pos) != Pass;
      } finally {
        cm.state.suppressEdits = false;
      }
      return done
    })
  }

  function configureMouse(cm, repeat, event) {
    var option = cm.getOption("configureMouse");
    var value = option ? option(cm, repeat, event) : {};
    if (value.unit == null) {
      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;
      value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line";
    }
    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }
    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }
    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }
    return value
  }

  function leftButtonDown(cm, pos, repeat, event) {
    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }
    else { cm.curOp.focus = activeElt(); }

    var behavior = configureMouse(cm, repeat, event);

    var sel = cm.doc.sel, contained;
    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
        repeat == "single" && (contained = sel.contains(pos)) > -1 &&
        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&
        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))
      { leftButtonStartDrag(cm, event, pos, behavior); }
    else
      { leftButtonSelect(cm, event, pos, behavior); }
  }

  // Start a text drag. When it ends, see if any dragging actually
  // happen, and treat as a click if it didn't.
  function leftButtonStartDrag(cm, event, pos, behavior) {
    var display = cm.display, moved = false;
    var dragEnd = operation(cm, function (e) {
      if (webkit) { display.scroller.draggable = false; }
      cm.state.draggingText = false;
      if (cm.state.delayingBlurEvent) {
        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }
        else { delayBlurEvent(cm); }
      }
      off(display.wrapper.ownerDocument, "mouseup", dragEnd);
      off(display.wrapper.ownerDocument, "mousemove", mouseMove);
      off(display.scroller, "dragstart", dragStart);
      off(display.scroller, "drop", dragEnd);
      if (!moved) {
        e_preventDefault(e);
        if (!behavior.addNew)
          { extendSelection(cm.doc, pos, null, null, behavior.extend); }
        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
        if ((webkit && !safari) || ie && ie_version == 9)
          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }
        else
          { display.input.focus(); }
      }
    });
    var mouseMove = function(e2) {
      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;
    };
    var dragStart = function () { return moved = true; };
    // Let the drag handler handle this.
    if (webkit) { display.scroller.draggable = true; }
    cm.state.draggingText = dragEnd;
    dragEnd.copy = !behavior.moveOnDrag;
    on(display.wrapper.ownerDocument, "mouseup", dragEnd);
    on(display.wrapper.ownerDocument, "mousemove", mouseMove);
    on(display.scroller, "dragstart", dragStart);
    on(display.scroller, "drop", dragEnd);

    cm.state.delayingBlurEvent = true;
    setTimeout(function () { return display.input.focus(); }, 20);
    // IE's approach to draggable
    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
  }

  function rangeForUnit(cm, pos, unit) {
    if (unit == "char") { return new Range(pos, pos) }
    if (unit == "word") { return cm.findWordAt(pos) }
    if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }
    var result = unit(cm, pos);
    return new Range(result.from, result.to)
  }

  // Normal selection, as opposed to text dragging.
  function leftButtonSelect(cm, event, start, behavior) {
    if (ie) { delayBlurEvent(cm); }
    var display = cm.display, doc = cm.doc;
    e_preventDefault(event);

    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
    if (behavior.addNew && !behavior.extend) {
      ourIndex = doc.sel.contains(start);
      if (ourIndex > -1)
        { ourRange = ranges[ourIndex]; }
      else
        { ourRange = new Range(start, start); }
    } else {
      ourRange = doc.sel.primary();
      ourIndex = doc.sel.primIndex;
    }

    if (behavior.unit == "rectangle") {
      if (!behavior.addNew) { ourRange = new Range(start, start); }
      start = posFromMouse(cm, event, true, true);
      ourIndex = -1;
    } else {
      var range = rangeForUnit(cm, start, behavior.unit);
      if (behavior.extend)
        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }
      else
        { ourRange = range; }
    }

    if (!behavior.addNew) {
      ourIndex = 0;
      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
      startSel = doc.sel;
    } else if (ourIndex == -1) {
      ourIndex = ranges.length;
      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),
                   {scroll: false, origin: "*mouse"});
    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) {
      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
                   {scroll: false, origin: "*mouse"});
      startSel = doc.sel;
    } else {
      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
    }

    var lastPos = start;
    function extendTo(pos) {
      if (cmp(lastPos, pos) == 0) { return }
      lastPos = pos;

      if (behavior.unit == "rectangle") {
        var ranges = [], tabSize = cm.options.tabSize;
        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
             line <= end; line++) {
          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
          if (left == right)
            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }
          else if (text.length > leftPos)
            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }
        }
        if (!ranges.length) { ranges.push(new Range(start, start)); }
        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
                     {origin: "*mouse", scroll: false});
        cm.scrollIntoView(pos);
      } else {
        var oldRange = ourRange;
        var range = rangeForUnit(cm, pos, behavior.unit);
        var anchor = oldRange.anchor, head;
        if (cmp(range.anchor, anchor) > 0) {
          head = range.head;
          anchor = minPos(oldRange.from(), range.anchor);
        } else {
          head = range.anchor;
          anchor = maxPos(oldRange.to(), range.head);
        }
        var ranges$1 = startSel.ranges.slice(0);
        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));
        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);
      }
    }

    var editorSize = display.wrapper.getBoundingClientRect();
    // Used to ensure timeout re-tries don't fire when another extend
    // happened in the meantime (clearTimeout isn't reliable -- at
    // least on Chrome, the timeouts still happen even when cleared,
    // if the clear happens after their scheduled firing time).
    var counter = 0;

    function extend(e) {
      var curCount = ++counter;
      var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle");
      if (!cur) { return }
      if (cmp(cur, lastPos) != 0) {
        cm.curOp.focus = activeElt();
        extendTo(cur);
        var visible = visibleLines(display, doc);
        if (cur.line >= visible.to || cur.line < visible.from)
          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }
      } else {
        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
        if (outside) { setTimeout(operation(cm, function () {
          if (counter != curCount) { return }
          display.scroller.scrollTop += outside;
          extend(e);
        }), 50); }
      }
    }

    function done(e) {
      cm.state.selectingText = false;
      counter = Infinity;
      // If e is null or undefined we interpret this as someone trying
      // to explicitly cancel the selection rather than the user
      // letting go of the mouse button.
      if (e) {
        e_preventDefault(e);
        display.input.focus();
      }
      off(display.wrapper.ownerDocument, "mousemove", move);
      off(display.wrapper.ownerDocument, "mouseup", up);
      doc.history.lastSelOrigin = null;
    }

    var move = operation(cm, function (e) {
      if (e.buttons === 0 || !e_button(e)) { done(e); }
      else { extend(e); }
    });
    var up = operation(cm, done);
    cm.state.selectingText = up;
    on(display.wrapper.ownerDocument, "mousemove", move);
    on(display.wrapper.ownerDocument, "mouseup", up);
  }

  // Used when mouse-selecting to adjust the anchor to the proper side
  // of a bidi jump depending on the visual position of the head.
  function bidiSimplify(cm, range) {
    var anchor = range.anchor;
    var head = range.head;
    var anchorLine = getLine(cm.doc, anchor.line);
    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }
    var order = getOrder(anchorLine);
    if (!order) { return range }
    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];
    if (part.from != anchor.ch && part.to != anchor.ch) { return range }
    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);
    if (boundary == 0 || boundary == order.length) { return range }

    // Compute the relative visual position of the head compared to the
    // anchor (<0 is to the left, >0 to the right)
    var leftSide;
    if (head.line != anchor.line) {
      leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0;
    } else {
      var headIndex = getBidiPartAt(order, head.ch, head.sticky);
      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);
      if (headIndex == boundary - 1 || headIndex == boundary)
        { leftSide = dir < 0; }
      else
        { leftSide = dir > 0; }
    }

    var usePart = order[boundary + (leftSide ? -1 : 0)];
    var from = leftSide == (usePart.level == 1);
    var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before";
    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)
  }


  // Determines whether an event happened in the gutter, and fires the
  // handlers for the corresponding event.
  function gutterEvent(cm, e, type, prevent) {
    var mX, mY;
    if (e.touches) {
      mX = e.touches[0].clientX;
      mY = e.touches[0].clientY;
    } else {
      try { mX = e.clientX; mY = e.clientY; }
      catch(e$1) { return false }
    }
    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }
    if (prevent) { e_preventDefault(e); }

    var display = cm.display;
    var lineBox = display.lineDiv.getBoundingClientRect();

    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }
    mY -= lineBox.top - display.viewOffset;

    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {
      var g = display.gutters.childNodes[i];
      if (g && g.getBoundingClientRect().right >= mX) {
        var line = lineAtHeight(cm.doc, mY);
        var gutter = cm.display.gutterSpecs[i];
        signal(cm, type, cm, line, gutter.className, e);
        return e_defaultPrevented(e)
      }
    }
  }

  function clickInGutter(cm, e) {
    return gutterEvent(cm, e, "gutterClick", true)
  }

  // CONTEXT MENU HANDLING

  // To make the context menu work, we need to briefly unhide the
  // textarea (making it as unobtrusive as possible) to let the
  // right-click take effect on it.
  function onContextMenu(cm, e) {
    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }
    if (signalDOMEvent(cm, e, "contextmenu")) { return }
    if (!captureRightClick) { cm.display.input.onContextMenu(e); }
  }

  function contextMenuInGutter(cm, e) {
    if (!hasHandler(cm, "gutterContextMenu")) { return false }
    return gutterEvent(cm, e, "gutterContextMenu", false)
  }

  function themeChanged(cm) {
    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
    clearCaches(cm);
  }

  var Init = {toString: function(){return "CodeMirror.Init"}};

  var defaults = {};
  var optionHandlers = {};

  function defineOptions(CodeMirror) {
    var optionHandlers = CodeMirror.optionHandlers;

    function option(name, deflt, handle, notOnInit) {
      CodeMirror.defaults[name] = deflt;
      if (handle) { optionHandlers[name] =
        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }
    }

    CodeMirror.defineOption = option;

    // Passed to option handlers when there is no old value.
    CodeMirror.Init = Init;

    // These two are, on init, called from the constructor because they
    // have to be initialized before the editor can start at all.
    option("value", "", function (cm, val) { return cm.setValue(val); }, true);
    option("mode", null, function (cm, val) {
      cm.doc.modeOption = val;
      loadMode(cm);
    }, true);

    option("indentUnit", 2, loadMode, true);
    option("indentWithTabs", false);
    option("smartIndent", true);
    option("tabSize", 4, function (cm) {
      resetModeState(cm);
      clearCaches(cm);
      regChange(cm);
    }, true);

    option("lineSeparator", null, function (cm, val) {
      cm.doc.lineSep = val;
      if (!val) { return }
      var newBreaks = [], lineNo = cm.doc.first;
      cm.doc.iter(function (line) {
        for (var pos = 0;;) {
          var found = line.text.indexOf(val, pos);
          if (found == -1) { break }
          pos = found + val.length;
          newBreaks.push(Pos(lineNo, found));
        }
        lineNo++;
      });
      for (var i = newBreaks.length - 1; i >= 0; i--)
        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
    });
    option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) {
      cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
      if (old != Init) { cm.refresh(); }
    });
    option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);
    option("electricChars", true);
    option("inputStyle", mobile ? "contenteditable" : "textarea", function () {
      throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME
    }, true);
    option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);
    option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);
    option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);
    option("rtlMoveVisually", !windows);
    option("wholeLineUpdateBefore", true);

    option("theme", "default", function (cm) {
      themeChanged(cm);
      updateGutters(cm);
    }, true);
    option("keyMap", "default", function (cm, val, old) {
      var next = getKeyMap(val);
      var prev = old != Init && getKeyMap(old);
      if (prev && prev.detach) { prev.detach(cm, next); }
      if (next.attach) { next.attach(cm, prev || null); }
    });
    option("extraKeys", null);
    option("configureMouse", null);

    option("lineWrapping", false, wrappingChanged, true);
    option("gutters", [], function (cm, val) {
      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);
      updateGutters(cm);
    }, true);
    option("fixedGutter", true, function (cm, val) {
      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
      cm.refresh();
    }, true);
    option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true);
    option("scrollbarStyle", "native", function (cm) {
      initScrollbars(cm);
      updateScrollbars(cm);
      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
    }, true);
    option("lineNumbers", false, function (cm, val) {
      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);
      updateGutters(cm);
    }, true);
    option("firstLineNumber", 1, updateGutters, true);
    option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true);
    option("showCursorWhenSelecting", false, updateSelection, true);

    option("resetSelectionOnContextMenu", true);
    option("lineWiseCopyCut", true);
    option("pasteLinesPerSelection", true);
    option("selectionsMayTouch", false);

    option("readOnly", false, function (cm, val) {
      if (val == "nocursor") {
        onBlur(cm);
        cm.display.input.blur();
      }
      cm.display.input.readOnlyChanged(val);
    });

    option("screenReaderLabel", null, function (cm, val) {
      val = (val === '') ? null : val;
      cm.display.input.screenReaderLabelChanged(val);
    });

    option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);
    option("dragDrop", true, dragDropChanged);
    option("allowDropFileTypes", null);

    option("cursorBlinkRate", 530);
    option("cursorScrollMargin", 0);
    option("cursorHeight", 1, updateSelection, true);
    option("singleCursorHeightPerLine", true, updateSelection, true);
    option("workTime", 100);
    option("workDelay", 100);
    option("flattenSpans", true, resetModeState, true);
    option("addModeClass", false, resetModeState, true);
    option("pollInterval", 100);
    option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });
    option("historyEventDelay", 1250);
    option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true);
    option("maxHighlightLength", 10000, resetModeState, true);
    option("moveInputWithCursor", true, function (cm, val) {
      if (!val) { cm.display.input.resetPosition(); }
    });

    option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; });
    option("autofocus", null);
    option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true);
    option("phrases", null);
  }

  function dragDropChanged(cm, value, old) {
    var wasOn = old && old != Init;
    if (!value != !wasOn) {
      var funcs = cm.display.dragFunctions;
      var toggle = value ? on : off;
      toggle(cm.display.scroller, "dragstart", funcs.start);
      toggle(cm.display.scroller, "dragenter", funcs.enter);
      toggle(cm.display.scroller, "dragover", funcs.over);
      toggle(cm.display.scroller, "dragleave", funcs.leave);
      toggle(cm.display.scroller, "drop", funcs.drop);
    }
  }

  function wrappingChanged(cm) {
    if (cm.options.lineWrapping) {
      addClass(cm.display.wrapper, "CodeMirror-wrap");
      cm.display.sizer.style.minWidth = "";
      cm.display.sizerWidth = null;
    } else {
      rmClass(cm.display.wrapper, "CodeMirror-wrap");
      findMaxLine(cm);
    }
    estimateLineHeights(cm);
    regChange(cm);
    clearCaches(cm);
    setTimeout(function () { return updateScrollbars(cm); }, 100);
  }

  // A CodeMirror instance represents an editor. This is the object
  // that user code is usually dealing with.

  function CodeMirror(place, options) {
    var this$1 = this;

    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }

    this.options = options = options ? copyObj(options) : {};
    // Determine effective options based on given values and defaults.
    copyObj(defaults, options, false);

    var doc = options.value;
    if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }
    else if (options.mode) { doc.modeOption = options.mode; }
    this.doc = doc;

    var input = new CodeMirror.inputStyles[options.inputStyle](this);
    var display = this.display = new Display(place, doc, input, options);
    display.wrapper.CodeMirror = this;
    themeChanged(this);
    if (options.lineWrapping)
      { this.display.wrapper.className += " CodeMirror-wrap"; }
    initScrollbars(this);

    this.state = {
      keyMaps: [],  // stores maps added by addKeyMap
      overlays: [], // highlighting overlays, as added by addOverlay
      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
      overwrite: false,
      delayingBlurEvent: false,
      focused: false,
      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll
      selectingText: false,
      draggingText: false,
      highlight: new Delayed(), // stores highlight worker timeout
      keySeq: null,  // Unfinished key sequence
      specialChars: null
    };

    if (options.autofocus && !mobile) { display.input.focus(); }

    // Override magic textarea content restore that IE sometimes does
    // on our hidden textarea on reload
    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }

    registerEventHandlers(this);
    ensureGlobalHandlers();

    startOperation(this);
    this.curOp.forceUpdate = true;
    attachDoc(this, doc);

    if ((options.autofocus && !mobile) || this.hasFocus())
      { setTimeout(function () {
        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }
      }, 20); }
    else
      { onBlur(this); }

    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))
      { optionHandlers[opt](this, options[opt], Init); } }
    maybeUpdateLineNumberWidth(this);
    if (options.finishInit) { options.finishInit(this); }
    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }
    endOperation(this);
    // Suppress optimizelegibility in Webkit, since it breaks text
    // measuring on line wrapping boundaries.
    if (webkit && options.lineWrapping &&
        getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
      { display.lineDiv.style.textRendering = "auto"; }
  }

  // The default configuration options.
  CodeMirror.defaults = defaults;
  // Functions to run when options are changed.
  CodeMirror.optionHandlers = optionHandlers;

  // Attach the necessary event handlers when initializing the editor
  function registerEventHandlers(cm) {
    var d = cm.display;
    on(d.scroller, "mousedown", operation(cm, onMouseDown));
    // Older IE's will not fire a second mousedown for a double click
    if (ie && ie_version < 11)
      { on(d.scroller, "dblclick", operation(cm, function (e) {
        if (signalDOMEvent(cm, e)) { return }
        var pos = posFromMouse(cm, e);
        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }
        e_preventDefault(e);
        var word = cm.findWordAt(pos);
        extendSelection(cm.doc, word.anchor, word.head);
      })); }
    else
      { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }
    // Some browsers fire contextmenu *after* opening the menu, at
    // which point we can't mess with it anymore. Context menu is
    // handled in onMouseDown for these browsers.
    on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); });
    on(d.input.getField(), "contextmenu", function (e) {
      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }
    });

    // Used to suppress mouse event handling when a touch happens
    var touchFinished, prevTouch = {end: 0};
    function finishTouch() {
      if (d.activeTouch) {
        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);
        prevTouch = d.activeTouch;
        prevTouch.end = +new Date;
      }
    }
    function isMouseLikeTouchEvent(e) {
      if (e.touches.length != 1) { return false }
      var touch = e.touches[0];
      return touch.radiusX <= 1 && touch.radiusY <= 1
    }
    function farAway(touch, other) {
      if (other.left == null) { return true }
      var dx = other.left - touch.left, dy = other.top - touch.top;
      return dx * dx + dy * dy > 20 * 20
    }
    on(d.scroller, "touchstart", function (e) {
      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {
        d.input.ensurePolled();
        clearTimeout(touchFinished);
        var now = +new Date;
        d.activeTouch = {start: now, moved: false,
                         prev: now - prevTouch.end <= 300 ? prevTouch : null};
        if (e.touches.length == 1) {
          d.activeTouch.left = e.touches[0].pageX;
          d.activeTouch.top = e.touches[0].pageY;
        }
      }
    });
    on(d.scroller, "touchmove", function () {
      if (d.activeTouch) { d.activeTouch.moved = true; }
    });
    on(d.scroller, "touchend", function (e) {
      var touch = d.activeTouch;
      if (touch && !eventInWidget(d, e) && touch.left != null &&
          !touch.moved && new Date - touch.start < 300) {
        var pos = cm.coordsChar(d.activeTouch, "page"), range;
        if (!touch.prev || farAway(touch, touch.prev)) // Single tap
          { range = new Range(pos, pos); }
        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
          { range = cm.findWordAt(pos); }
        else // Triple tap
          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }
        cm.setSelection(range.anchor, range.head);
        cm.focus();
        e_preventDefault(e);
      }
      finishTouch();
    });
    on(d.scroller, "touchcancel", finishTouch);

    // Sync scrolling between fake scrollbars and real scrollable
    // area, ensure viewport is updated when scrolling.
    on(d.scroller, "scroll", function () {
      if (d.scroller.clientHeight) {
        updateScrollTop(cm, d.scroller.scrollTop);
        setScrollLeft(cm, d.scroller.scrollLeft, true);
        signal(cm, "scroll", cm);
      }
    });

    // Listen to wheel events in order to try and update the viewport on time.
    on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); });
    on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); });

    // Prevent wrapper from ever scrolling
    on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });

    d.dragFunctions = {
      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},
      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
      start: function (e) { return onDragStart(cm, e); },
      drop: operation(cm, onDrop),
      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
    };

    var inp = d.input.getField();
    on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); });
    on(inp, "keydown", operation(cm, onKeyDown));
    on(inp, "keypress", operation(cm, onKeyPress));
    on(inp, "focus", function (e) { return onFocus(cm, e); });
    on(inp, "blur", function (e) { return onBlur(cm, e); });
  }

  var initHooks = [];
  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };

  // Indent the given line. The how parameter can be "smart",
  // "add"/null, "subtract", or "prev". When aggressive is false
  // (typically set to true for forced single-line indents), empty
  // lines are not indented, and places where the mode returns Pass
  // are left alone.
  function indentLine(cm, n, how, aggressive) {
    var doc = cm.doc, state;
    if (how == null) { how = "add"; }
    if (how == "smart") {
      // Fall back to "prev" when the mode doesn't have an indentation
      // method.
      if (!doc.mode.indent) { how = "prev"; }
      else { state = getContextBefore(cm, n).state; }
    }

    var tabSize = cm.options.tabSize;
    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
    if (line.stateAfter) { line.stateAfter = null; }
    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
    if (!aggressive && !/\S/.test(line.text)) {
      indentation = 0;
      how = "not";
    } else if (how == "smart") {
      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
      if (indentation == Pass || indentation > 150) {
        if (!aggressive) { return }
        how = "prev";
      }
    }
    if (how == "prev") {
      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }
      else { indentation = 0; }
    } else if (how == "add") {
      indentation = curSpace + cm.options.indentUnit;
    } else if (how == "subtract") {
      indentation = curSpace - cm.options.indentUnit;
    } else if (typeof how == "number") {
      indentation = curSpace + how;
    }
    indentation = Math.max(0, indentation);

    var indentString = "", pos = 0;
    if (cm.options.indentWithTabs)
      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} }
    if (pos < indentation) { indentString += spaceStr(indentation - pos); }

    if (indentString != curSpaceString) {
      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
      line.stateAfter = null;
      return true
    } else {
      // Ensure that, if the cursor was in the whitespace at the start
      // of the line, it is moved to the end of that space.
      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {
        var range = doc.sel.ranges[i$1];
        if (range.head.line == n && range.head.ch < curSpaceString.length) {
          var pos$1 = Pos(n, curSpaceString.length);
          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));
          break
        }
      }
    }
  }

  // This will be set to a {lineWise: bool, text: [string]} object, so
  // that, when pasting, we know what kind of selections the copied
  // text was made out of.
  var lastCopied = null;

  function setLastCopied(newLastCopied) {
    lastCopied = newLastCopied;
  }

  function applyTextInput(cm, inserted, deleted, sel, origin) {
    var doc = cm.doc;
    cm.display.shift = false;
    if (!sel) { sel = doc.sel; }

    var recent = +new Date - 200;
    var paste = origin == "paste" || cm.state.pasteIncoming > recent;
    var textLines = splitLinesAuto(inserted), multiPaste = null;
    // When pasting N lines into N selections, insert one line per selection
    if (paste && sel.ranges.length > 1) {
      if (lastCopied && lastCopied.text.join("\n") == inserted) {
        if (sel.ranges.length % lastCopied.text.length == 0) {
          multiPaste = [];
          for (var i = 0; i < lastCopied.text.length; i++)
            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }
        }
      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {
        multiPaste = map(textLines, function (l) { return [l]; });
      }
    }

    var updateInput = cm.curOp.updateInput;
    // Normal behavior is to insert the new text into every selection
    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {
      var range = sel.ranges[i$1];
      var from = range.from(), to = range.to();
      if (range.empty()) {
        if (deleted && deleted > 0) // Handle deletion
          { from = Pos(from.line, from.ch - deleted); }
        else if (cm.state.overwrite && !paste) // Handle overwrite
          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }
        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n"))
          { from = to = Pos(from.line, 0); }
      }
      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,
                         origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")};
      makeChange(cm.doc, changeEvent);
      signalLater(cm, "inputRead", cm, changeEvent);
    }
    if (inserted && !paste)
      { triggerElectric(cm, inserted); }

    ensureCursorVisible(cm);
    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }
    cm.curOp.typing = true;
    cm.state.pasteIncoming = cm.state.cutIncoming = -1;
  }

  function handlePaste(e, cm) {
    var pasted = e.clipboardData && e.clipboardData.getData("Text");
    if (pasted) {
      e.preventDefault();
      if (!cm.isReadOnly() && !cm.options.disableInput)
        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); }
      return true
    }
  }

  function triggerElectric(cm, inserted) {
    // When an 'electric' character is inserted, immediately trigger a reindent
    if (!cm.options.electricChars || !cm.options.smartIndent) { return }
    var sel = cm.doc.sel;

    for (var i = sel.ranges.length - 1; i >= 0; i--) {
      var range = sel.ranges[i];
      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }
      var mode = cm.getModeAt(range.head);
      var indented = false;
      if (mode.electricChars) {
        for (var j = 0; j < mode.electricChars.length; j++)
          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
            indented = indentLine(cm, range.head.line, "smart");
            break
          } }
      } else if (mode.electricInput) {
        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
          { indented = indentLine(cm, range.head.line, "smart"); }
      }
      if (indented) { signalLater(cm, "electricInput", cm, range.head.line); }
    }
  }

  function copyableRanges(cm) {
    var text = [], ranges = [];
    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
      var line = cm.doc.sel.ranges[i].head.line;
      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
      ranges.push(lineRange);
      text.push(cm.getRange(lineRange.anchor, lineRange.head));
    }
    return {text: text, ranges: ranges}
  }

  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {
    field.setAttribute("autocorrect", autocorrect ? "" : "off");
    field.setAttribute("autocapitalize", autocapitalize ? "" : "off");
    field.setAttribute("spellcheck", !!spellcheck);
  }

  function hiddenTextarea() {
    var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
    var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
    // The textarea is kept positioned near the cursor to prevent the
    // fact that it'll be scrolled into view on input from scrolling
    // our fake cursor out of view. On webkit, when wrap=off, paste is
    // very slow. So make the area wide instead.
    if (webkit) { te.style.width = "1000px"; }
    else { te.setAttribute("wrap", "off"); }
    // If border: 0; -- iOS fails to open keyboard (issue #1287)
    if (ios) { te.style.border = "1px solid black"; }
    disableBrowserMagic(te);
    return div
  }

  // The publicly visible API. Note that methodOp(f) means
  // 'wrap f in an operation, performed on its `this` parameter'.

  // This is not the complete set of editor methods. Most of the
  // methods defined on the Doc type are also injected into
  // CodeMirror.prototype, for backwards compatibility and
  // convenience.

  function addEditorMethods(CodeMirror) {
    var optionHandlers = CodeMirror.optionHandlers;

    var helpers = CodeMirror.helpers = {};

    CodeMirror.prototype = {
      constructor: CodeMirror,
      focus: function(){window.focus(); this.display.input.focus();},

      setOption: function(option, value) {
        var options = this.options, old = options[option];
        if (options[option] == value && option != "mode") { return }
        options[option] = value;
        if (optionHandlers.hasOwnProperty(option))
          { operation(this, optionHandlers[option])(this, value, old); }
        signal(this, "optionChange", this, option);
      },

      getOption: function(option) {return this.options[option]},
      getDoc: function() {return this.doc},

      addKeyMap: function(map, bottom) {
        this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
      },
      removeKeyMap: function(map) {
        var maps = this.state.keyMaps;
        for (var i = 0; i < maps.length; ++i)
          { if (maps[i] == map || maps[i].name == map) {
            maps.splice(i, 1);
            return true
          } }
      },

      addOverlay: methodOp(function(spec, options) {
        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
        if (mode.startState) { throw new Error("Overlays may not be stateful.") }
        insertSorted(this.state.overlays,
                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,
                      priority: (options && options.priority) || 0},
                     function (overlay) { return overlay.priority; });
        this.state.modeGen++;
        regChange(this);
      }),
      removeOverlay: methodOp(function(spec) {
        var overlays = this.state.overlays;
        for (var i = 0; i < overlays.length; ++i) {
          var cur = overlays[i].modeSpec;
          if (cur == spec || typeof spec == "string" && cur.name == spec) {
            overlays.splice(i, 1);
            this.state.modeGen++;
            regChange(this);
            return
          }
        }
      }),

      indentLine: methodOp(function(n, dir, aggressive) {
        if (typeof dir != "string" && typeof dir != "number") {
          if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; }
          else { dir = dir ? "add" : "subtract"; }
        }
        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }
      }),
      indentSelection: methodOp(function(how) {
        var ranges = this.doc.sel.ranges, end = -1;
        for (var i = 0; i < ranges.length; i++) {
          var range = ranges[i];
          if (!range.empty()) {
            var from = range.from(), to = range.to();
            var start = Math.max(end, from.line);
            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
            for (var j = start; j < end; ++j)
              { indentLine(this, j, how); }
            var newRanges = this.doc.sel.ranges;
            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }
          } else if (range.head.line > end) {
            indentLine(this, range.head.line, how, true);
            end = range.head.line;
            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }
          }
        }
      }),

      // Fetch the parser token for a given character. Useful for hacks
      // that want to inspect the mode state (say, for completion).
      getTokenAt: function(pos, precise) {
        return takeToken(this, pos, precise)
      },

      getLineTokens: function(line, precise) {
        return takeToken(this, Pos(line), precise, true)
      },

      getTokenTypeAt: function(pos) {
        pos = clipPos(this.doc, pos);
        var styles = getLineStyles(this, getLine(this.doc, pos.line));
        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
        var type;
        if (ch == 0) { type = styles[2]; }
        else { for (;;) {
          var mid = (before + after) >> 1;
          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }
          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }
          else { type = styles[mid * 2 + 2]; break }
        } }
        var cut = type ? type.indexOf("overlay ") : -1;
        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)
      },

      getModeAt: function(pos) {
        var mode = this.doc.mode;
        if (!mode.innerMode) { return mode }
        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode
      },

      getHelper: function(pos, type) {
        return this.getHelpers(pos, type)[0]
      },

      getHelpers: function(pos, type) {
        var found = [];
        if (!helpers.hasOwnProperty(type)) { return found }
        var help = helpers[type], mode = this.getModeAt(pos);
        if (typeof mode[type] == "string") {
          if (help[mode[type]]) { found.push(help[mode[type]]); }
        } else if (mode[type]) {
          for (var i = 0; i < mode[type].length; i++) {
            var val = help[mode[type][i]];
            if (val) { found.push(val); }
          }
        } else if (mode.helperType && help[mode.helperType]) {
          found.push(help[mode.helperType]);
        } else if (help[mode.name]) {
          found.push(help[mode.name]);
        }
        for (var i$1 = 0; i$1 < help._global.length; i$1++) {
          var cur = help._global[i$1];
          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
            { found.push(cur.val); }
        }
        return found
      },

      getStateAfter: function(line, precise) {
        var doc = this.doc;
        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
        return getContextBefore(this, line + 1, precise).state
      },

      cursorCoords: function(start, mode) {
        var pos, range = this.doc.sel.primary();
        if (start == null) { pos = range.head; }
        else if (typeof start == "object") { pos = clipPos(this.doc, start); }
        else { pos = start ? range.from() : range.to(); }
        return cursorCoords(this, pos, mode || "page")
      },

      charCoords: function(pos, mode) {
        return charCoords(this, clipPos(this.doc, pos), mode || "page")
      },

      coordsChar: function(coords, mode) {
        coords = fromCoordSystem(this, coords, mode || "page");
        return coordsChar(this, coords.left, coords.top)
      },

      lineAtHeight: function(height, mode) {
        height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
        return lineAtHeight(this.doc, height + this.display.viewOffset)
      },
      heightAtLine: function(line, mode, includeWidgets) {
        var end = false, lineObj;
        if (typeof line == "number") {
          var last = this.doc.first + this.doc.size - 1;
          if (line < this.doc.first) { line = this.doc.first; }
          else if (line > last) { line = last; end = true; }
          lineObj = getLine(this.doc, line);
        } else {
          lineObj = line;
        }
        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top +
          (end ? this.doc.height - heightAtLine(lineObj) : 0)
      },

      defaultTextHeight: function() { return textHeight(this.display) },
      defaultCharWidth: function() { return charWidth(this.display) },

      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},

      addWidget: function(pos, node, scroll, vert, horiz) {
        var display = this.display;
        pos = cursorCoords(this, clipPos(this.doc, pos));
        var top = pos.bottom, left = pos.left;
        node.style.position = "absolute";
        node.setAttribute("cm-ignore-events", "true");
        this.display.input.setUneditable(node);
        display.sizer.appendChild(node);
        if (vert == "over") {
          top = pos.top;
        } else if (vert == "above" || vert == "near") {
          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
          // Default to positioning above (if specified and possible); otherwise default to positioning below
          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
            { top = pos.top - node.offsetHeight; }
          else if (pos.bottom + node.offsetHeight <= vspace)
            { top = pos.bottom; }
          if (left + node.offsetWidth > hspace)
            { left = hspace - node.offsetWidth; }
        }
        node.style.top = top + "px";
        node.style.left = node.style.right = "";
        if (horiz == "right") {
          left = display.sizer.clientWidth - node.offsetWidth;
          node.style.right = "0px";
        } else {
          if (horiz == "left") { left = 0; }
          else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }
          node.style.left = left + "px";
        }
        if (scroll)
          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }
      },

      triggerOnKeyDown: methodOp(onKeyDown),
      triggerOnKeyPress: methodOp(onKeyPress),
      triggerOnKeyUp: onKeyUp,
      triggerOnMouseDown: methodOp(onMouseDown),

      execCommand: function(cmd) {
        if (commands.hasOwnProperty(cmd))
          { return commands[cmd].call(null, this) }
      },

      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),

      findPosH: function(from, amount, unit, visually) {
        var dir = 1;
        if (amount < 0) { dir = -1; amount = -amount; }
        var cur = clipPos(this.doc, from);
        for (var i = 0; i < amount; ++i) {
          cur = findPosH(this.doc, cur, dir, unit, visually);
          if (cur.hitSide) { break }
        }
        return cur
      },

      moveH: methodOp(function(dir, unit) {
        var this$1 = this;

        this.extendSelectionsBy(function (range) {
          if (this$1.display.shift || this$1.doc.extend || range.empty())
            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }
          else
            { return dir < 0 ? range.from() : range.to() }
        }, sel_move);
      }),

      deleteH: methodOp(function(dir, unit) {
        var sel = this.doc.sel, doc = this.doc;
        if (sel.somethingSelected())
          { doc.replaceSelection("", null, "+delete"); }
        else
          { deleteNearSelection(this, function (range) {
            var other = findPosH(doc, range.head, dir, unit, false);
            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}
          }); }
      }),

      findPosV: function(from, amount, unit, goalColumn) {
        var dir = 1, x = goalColumn;
        if (amount < 0) { dir = -1; amount = -amount; }
        var cur = clipPos(this.doc, from);
        for (var i = 0; i < amount; ++i) {
          var coords = cursorCoords(this, cur, "div");
          if (x == null) { x = coords.left; }
          else { coords.left = x; }
          cur = findPosV(this, coords, dir, unit);
          if (cur.hitSide) { break }
        }
        return cur
      },

      moveV: methodOp(function(dir, unit) {
        var this$1 = this;

        var doc = this.doc, goals = [];
        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();
        doc.extendSelectionsBy(function (range) {
          if (collapse)
            { return dir < 0 ? range.from() : range.to() }
          var headPos = cursorCoords(this$1, range.head, "div");
          if (range.goalColumn != null) { headPos.left = range.goalColumn; }
          goals.push(headPos.left);
          var pos = findPosV(this$1, headPos, dir, unit);
          if (unit == "page" && range == doc.sel.primary())
            { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); }
          return pos
        }, sel_move);
        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)
          { doc.sel.ranges[i].goalColumn = goals[i]; } }
      }),

      // Find the word at the given position (as returned by coordsChar).
      findWordAt: function(pos) {
        var doc = this.doc, line = getLine(doc, pos.line).text;
        var start = pos.ch, end = pos.ch;
        if (line) {
          var helper = this.getHelper(pos, "wordChars");
          if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; }
          var startChar = line.charAt(start);
          var check = isWordChar(startChar, helper)
            ? function (ch) { return isWordChar(ch, helper); }
            : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); }
            : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); };
          while (start > 0 && check(line.charAt(start - 1))) { --start; }
          while (end < line.length && check(line.charAt(end))) { ++end; }
        }
        return new Range(Pos(pos.line, start), Pos(pos.line, end))
      },

      toggleOverwrite: function(value) {
        if (value != null && value == this.state.overwrite) { return }
        if (this.state.overwrite = !this.state.overwrite)
          { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
        else
          { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); }

        signal(this, "overwriteToggle", this, this.state.overwrite);
      },
      hasFocus: function() { return this.display.input.getField() == activeElt() },
      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },

      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),
      getScrollInfo: function() {
        var scroller = this.display.scroller;
        return {left: scroller.scrollLeft, top: scroller.scrollTop,
                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}
      },

      scrollIntoView: methodOp(function(range, margin) {
        if (range == null) {
          range = {from: this.doc.sel.primary().head, to: null};
          if (margin == null) { margin = this.options.cursorScrollMargin; }
        } else if (typeof range == "number") {
          range = {from: Pos(range, 0), to: null};
        } else if (range.from == null) {
          range = {from: range, to: null};
        }
        if (!range.to) { range.to = range.from; }
        range.margin = margin || 0;

        if (range.from.line != null) {
          scrollToRange(this, range);
        } else {
          scrollToCoordsRange(this, range.from, range.to, range.margin);
        }
      }),

      setSize: methodOp(function(width, height) {
        var this$1 = this;

        var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; };
        if (width != null) { this.display.wrapper.style.width = interpret(width); }
        if (height != null) { this.display.wrapper.style.height = interpret(height); }
        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }
        var lineNo = this.display.viewFrom;
        this.doc.iter(lineNo, this.display.viewTo, function (line) {
          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)
            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } }
          ++lineNo;
        });
        this.curOp.forceUpdate = true;
        signal(this, "refresh", this);
      }),

      operation: function(f){return runInOp(this, f)},
      startOperation: function(){return startOperation(this)},
      endOperation: function(){return endOperation(this)},

      refresh: methodOp(function() {
        var oldHeight = this.display.cachedTextHeight;
        regChange(this);
        this.curOp.forceUpdate = true;
        clearCaches(this);
        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);
        updateGutterSpace(this.display);
        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)
          { estimateLineHeights(this); }
        signal(this, "refresh", this);
      }),

      swapDoc: methodOp(function(doc) {
        var old = this.doc;
        old.cm = null;
        // Cancel the current text selection if any (#5821)
        if (this.state.selectingText) { this.state.selectingText(); }
        attachDoc(this, doc);
        clearCaches(this);
        this.display.input.reset();
        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);
        this.curOp.forceScroll = true;
        signalLater(this, "swapDoc", this, old);
        return old
      }),

      phrase: function(phraseText) {
        var phrases = this.options.phrases;
        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText
      },

      getInputField: function(){return this.display.input.getField()},
      getWrapperElement: function(){return this.display.wrapper},
      getScrollerElement: function(){return this.display.scroller},
      getGutterElement: function(){return this.display.gutters}
    };
    eventMixin(CodeMirror);

    CodeMirror.registerHelper = function(type, name, value) {
      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }
      helpers[type][name] = value;
    };
    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
      CodeMirror.registerHelper(type, name, value);
      helpers[type]._global.push({pred: predicate, val: value});
    };
  }

  // Used for horizontal relative motion. Dir is -1 or 1 (left or
  // right), unit can be "codepoint", "char", "column" (like char, but
  // doesn't cross line boundaries), "word" (across next word), or
  // "group" (to the start of next group of word or
  // non-word-non-whitespace chars). The visually param controls
  // whether, in right-to-left text, direction 1 means to move towards
  // the next index in the string, or towards the character to the right
  // of the current position. The resulting position will have a
  // hitSide=true property if it reached the end of the document.
  function findPosH(doc, pos, dir, unit, visually) {
    var oldPos = pos;
    var origDir = dir;
    var lineObj = getLine(doc, pos.line);
    var lineDir = visually && doc.direction == "rtl" ? -dir : dir;
    function findNextLine() {
      var l = pos.line + lineDir;
      if (l < doc.first || l >= doc.first + doc.size) { return false }
      pos = new Pos(l, pos.ch, pos.sticky);
      return lineObj = getLine(doc, l)
    }
    function moveOnce(boundToLine) {
      var next;
      if (unit == "codepoint") {
        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));
        if (isNaN(ch)) {
          next = null;
        } else {
          var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;
          next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);
        }
      } else if (visually) {
        next = moveVisually(doc.cm, lineObj, pos, dir);
      } else {
        next = moveLogically(lineObj, pos, dir);
      }
      if (next == null) {
        if (!boundToLine && findNextLine())
          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }
        else
          { return false }
      } else {
        pos = next;
      }
      return true
    }

    if (unit == "char" || unit == "codepoint") {
      moveOnce();
    } else if (unit == "column") {
      moveOnce(true);
    } else if (unit == "word" || unit == "group") {
      var sawType = null, group = unit == "group";
      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
      for (var first = true;; first = false) {
        if (dir < 0 && !moveOnce(!first)) { break }
        var cur = lineObj.text.charAt(pos.ch) || "\n";
        var type = isWordChar(cur, helper) ? "w"
          : group && cur == "\n" ? "n"
          : !group || /\s/.test(cur) ? null
          : "p";
        if (group && !first && !type) { type = "s"; }
        if (sawType && sawType != type) {
          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";}
          break
        }

        if (type) { sawType = type; }
        if (dir > 0 && !moveOnce(!first)) { break }
      }
    }
    var result = skipAtomic(doc, pos, oldPos, origDir, true);
    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }
    return result
  }

  // For relative vertical movement. Dir may be -1 or 1. Unit can be
  // "page" or "line". The resulting position will have a hitSide=true
  // property if it reached the end of the document.
  function findPosV(cm, pos, dir, unit) {
    var doc = cm.doc, x = pos.left, y;
    if (unit == "page") {
      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);
      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;

    } else if (unit == "line") {
      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
    }
    var target;
    for (;;) {
      target = coordsChar(cm, x, y);
      if (!target.outside) { break }
      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }
      y += dir * 5;
    }
    return target
  }

  // CONTENTEDITABLE INPUT STYLE

  var ContentEditableInput = function(cm) {
    this.cm = cm;
    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
    this.polling = new Delayed();
    this.composing = null;
    this.gracePeriod = false;
    this.readDOMTimeout = null;
  };

  ContentEditableInput.prototype.init = function (display) {
      var this$1 = this;

    var input = this, cm = input.cm;
    var div = input.div = display.lineDiv;
    div.contentEditable = true;
    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);

    function belongsToInput(e) {
      for (var t = e.target; t; t = t.parentNode) {
        if (t == div) { return true }
        if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break }
      }
      return false
    }

    on(div, "paste", function (e) {
      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
      // IE doesn't fire input events, so we schedule a read for the pasted content in this way
      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }
    });

    on(div, "compositionstart", function (e) {
      this$1.composing = {data: e.data, done: false};
    });
    on(div, "compositionupdate", function (e) {
      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }
    });
    on(div, "compositionend", function (e) {
      if (this$1.composing) {
        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }
        this$1.composing.done = true;
      }
    });

    on(div, "touchstart", function () { return input.forceCompositionEnd(); });

    on(div, "input", function () {
      if (!this$1.composing) { this$1.readFromDOMSoon(); }
    });

    function onCopyCut(e) {
      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }
      if (cm.somethingSelected()) {
        setLastCopied({lineWise: false, text: cm.getSelections()});
        if (e.type == "cut") { cm.replaceSelection("", null, "cut"); }
      } else if (!cm.options.lineWiseCopyCut) {
        return
      } else {
        var ranges = copyableRanges(cm);
        setLastCopied({lineWise: true, text: ranges.text});
        if (e.type == "cut") {
          cm.operation(function () {
            cm.setSelections(ranges.ranges, 0, sel_dontScroll);
            cm.replaceSelection("", null, "cut");
          });
        }
      }
      if (e.clipboardData) {
        e.clipboardData.clearData();
        var content = lastCopied.text.join("\n");
        // iOS exposes the clipboard API, but seems to discard content inserted into it
        e.clipboardData.setData("Text", content);
        if (e.clipboardData.getData("Text") == content) {
          e.preventDefault();
          return
        }
      }
      // Old-fashioned briefly-focus-a-textarea hack
      var kludge = hiddenTextarea(), te = kludge.firstChild;
      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
      te.value = lastCopied.text.join("\n");
      var hadFocus = document.activeElement;
      selectInput(te);
      setTimeout(function () {
        cm.display.lineSpace.removeChild(kludge);
        hadFocus.focus();
        if (hadFocus == div) { input.showPrimarySelection(); }
      }, 50);
    }
    on(div, "copy", onCopyCut);
    on(div, "cut", onCopyCut);
  };

  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {
    // Label for screenreaders, accessibility
    if(label) {
      this.div.setAttribute('aria-label', label);
    } else {
      this.div.removeAttribute('aria-label');
    }
  };

  ContentEditableInput.prototype.prepareSelection = function () {
    var result = prepareSelection(this.cm, false);
    result.focus = document.activeElement == this.div;
    return result
  };

  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {
    if (!info || !this.cm.display.view.length) { return }
    if (info.focus || takeFocus) { this.showPrimarySelection(); }
    this.showMultipleSelections(info);
  };

  ContentEditableInput.prototype.getSelection = function () {
    return this.cm.display.wrapper.ownerDocument.getSelection()
  };

  ContentEditableInput.prototype.showPrimarySelection = function () {
    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
    var from = prim.from(), to = prim.to();

    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
      sel.removeAllRanges();
      return
    }

    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);
    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
        cmp(minPos(curAnchor, curFocus), from) == 0 &&
        cmp(maxPos(curAnchor, curFocus), to) == 0)
      { return }

    var view = cm.display.view;
    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||
        {node: view[0].measure.map[2], offset: 0};
    var end = to.line < cm.display.viewTo && posToDOM(cm, to);
    if (!end) {
      var measure = view[view.length - 1].measure;
      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
    }

    if (!start || !end) {
      sel.removeAllRanges();
      return
    }

    var old = sel.rangeCount && sel.getRangeAt(0), rng;
    try { rng = range(start.node, start.offset, end.offset, end.node); }
    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
    if (rng) {
      if (!gecko && cm.state.focused) {
        sel.collapse(start.node, start.offset);
        if (!rng.collapsed) {
          sel.removeAllRanges();
          sel.addRange(rng);
        }
      } else {
        sel.removeAllRanges();
        sel.addRange(rng);
      }
      if (old && sel.anchorNode == null) { sel.addRange(old); }
      else if (gecko) { this.startGracePeriod(); }
    }
    this.rememberSelection();
  };

  ContentEditableInput.prototype.startGracePeriod = function () {
      var this$1 = this;

    clearTimeout(this.gracePeriod);
    this.gracePeriod = setTimeout(function () {
      this$1.gracePeriod = false;
      if (this$1.selectionChanged())
        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }
    }, 20);
  };

  ContentEditableInput.prototype.showMultipleSelections = function (info) {
    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
  };

  ContentEditableInput.prototype.rememberSelection = function () {
    var sel = this.getSelection();
    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
  };

  ContentEditableInput.prototype.selectionInEditor = function () {
    var sel = this.getSelection();
    if (!sel.rangeCount) { return false }
    var node = sel.getRangeAt(0).commonAncestorContainer;
    return contains(this.div, node)
  };

  ContentEditableInput.prototype.focus = function () {
    if (this.cm.options.readOnly != "nocursor") {
      if (!this.selectionInEditor() || document.activeElement != this.div)
        { this.showSelection(this.prepareSelection(), true); }
      this.div.focus();
    }
  };
  ContentEditableInput.prototype.blur = function () { this.div.blur(); };
  ContentEditableInput.prototype.getField = function () { return this.div };

  ContentEditableInput.prototype.supportsTouch = function () { return true };

  ContentEditableInput.prototype.receivedFocus = function () {
    var input = this;
    if (this.selectionInEditor())
      { this.pollSelection(); }
    else
      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }

    function poll() {
      if (input.cm.state.focused) {
        input.pollSelection();
        input.polling.set(input.cm.options.pollInterval, poll);
      }
    }
    this.polling.set(this.cm.options.pollInterval, poll);
  };

  ContentEditableInput.prototype.selectionChanged = function () {
    var sel = this.getSelection();
    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
  };

  ContentEditableInput.prototype.pollSelection = function () {
    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
    var sel = this.getSelection(), cm = this.cm;
    // On Android Chrome (version 56, at least), backspacing into an
    // uneditable block element will put the cursor in that element,
    // and then, because it's not editable, hide the virtual keyboard.
    // Because Android doesn't allow us to actually detect backspace
    // presses in a sane way, this code checks for when that happens
    // and simulates a backspace press in this case.
    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {
      this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs});
      this.blur();
      this.focus();
      return
    }
    if (this.composing) { return }
    this.rememberSelection();
    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
    var head = domToPos(cm, sel.focusNode, sel.focusOffset);
    if (anchor && head) { runInOp(cm, function () {
      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }
    }); }
  };

  ContentEditableInput.prototype.pollContent = function () {
    if (this.readDOMTimeout != null) {
      clearTimeout(this.readDOMTimeout);
      this.readDOMTimeout = null;
    }

    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
    var from = sel.from(), to = sel.to();
    if (from.ch == 0 && from.line > cm.firstLine())
      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }
    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())
      { to = Pos(to.line + 1, 0); }
    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }

    var fromIndex, fromLine, fromNode;
    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
      fromLine = lineNo(display.view[0].line);
      fromNode = display.view[0].node;
    } else {
      fromLine = lineNo(display.view[fromIndex].line);
      fromNode = display.view[fromIndex - 1].node.nextSibling;
    }
    var toIndex = findViewIndex(cm, to.line);
    var toLine, toNode;
    if (toIndex == display.view.length - 1) {
      toLine = display.viewTo - 1;
      toNode = display.lineDiv.lastChild;
    } else {
      toLine = lineNo(display.view[toIndex + 1].line) - 1;
      toNode = display.view[toIndex + 1].node.previousSibling;
    }

    if (!fromNode) { return false }
    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
    while (newText.length > 1 && oldText.length > 1) {
      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
      else { break }
    }

    var cutFront = 0, cutEnd = 0;
    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
      { ++cutFront; }
    var newBot = lst(newText), oldBot = lst(oldText);
    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
                             oldBot.length - (oldText.length == 1 ? cutFront : 0));
    while (cutEnd < maxCutEnd &&
           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
      { ++cutEnd; }
    // Try to move start of change to start of selection if ambiguous
    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {
      while (cutFront && cutFront > from.ch &&
             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {
        cutFront--;
        cutEnd++;
      }
    }

    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "");
    newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "");

    var chFrom = Pos(fromLine, cutFront);
    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
      replaceRange(cm.doc, newText, chFrom, chTo, "+input");
      return true
    }
  };

  ContentEditableInput.prototype.ensurePolled = function () {
    this.forceCompositionEnd();
  };
  ContentEditableInput.prototype.reset = function () {
    this.forceCompositionEnd();
  };
  ContentEditableInput.prototype.forceCompositionEnd = function () {
    if (!this.composing) { return }
    clearTimeout(this.readDOMTimeout);
    this.composing = null;
    this.updateFromDOM();
    this.div.blur();
    this.div.focus();
  };
  ContentEditableInput.prototype.readFromDOMSoon = function () {
      var this$1 = this;

    if (this.readDOMTimeout != null) { return }
    this.readDOMTimeout = setTimeout(function () {
      this$1.readDOMTimeout = null;
      if (this$1.composing) {
        if (this$1.composing.done) { this$1.composing = null; }
        else { return }
      }
      this$1.updateFromDOM();
    }, 80);
  };

  ContentEditableInput.prototype.updateFromDOM = function () {
      var this$1 = this;

    if (this.cm.isReadOnly() || !this.pollContent())
      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }
  };

  ContentEditableInput.prototype.setUneditable = function (node) {
    node.contentEditable = "false";
  };

  ContentEditableInput.prototype.onKeyPress = function (e) {
    if (e.charCode == 0 || this.composing) { return }
    e.preventDefault();
    if (!this.cm.isReadOnly())
      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }
  };

  ContentEditableInput.prototype.readOnlyChanged = function (val) {
    this.div.contentEditable = String(val != "nocursor");
  };

  ContentEditableInput.prototype.onContextMenu = function () {};
  ContentEditableInput.prototype.resetPosition = function () {};

  ContentEditableInput.prototype.needsContentAttribute = true;

  function posToDOM(cm, pos) {
    var view = findViewForLine(cm, pos.line);
    if (!view || view.hidden) { return null }
    var line = getLine(cm.doc, pos.line);
    var info = mapFromLineView(view, line, pos.line);

    var order = getOrder(line, cm.doc.direction), side = "left";
    if (order) {
      var partPos = getBidiPartAt(order, pos.ch);
      side = partPos % 2 ? "right" : "left";
    }
    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
    result.offset = result.collapse == "right" ? result.end : result.start;
    return result
  }

  function isInGutter(node) {
    for (var scan = node; scan; scan = scan.parentNode)
      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }
    return false
  }

  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }

  function domTextBetween(cm, from, to, fromLine, toLine) {
    var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;
    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
    function close() {
      if (closing) {
        text += lineSep;
        if (extraLinebreak) { text += lineSep; }
        closing = extraLinebreak = false;
      }
    }
    function addText(str) {
      if (str) {
        close();
        text += str;
      }
    }
    function walk(node) {
      if (node.nodeType == 1) {
        var cmText = node.getAttribute("cm-text");
        if (cmText) {
          addText(cmText);
          return
        }
        var markerID = node.getAttribute("cm-marker"), range;
        if (markerID) {
          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
          if (found.length && (range = found[0].find(0)))
            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }
          return
        }
        if (node.getAttribute("contenteditable") == "false") { return }
        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);
        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }

        if (isBlock) { close(); }
        for (var i = 0; i < node.childNodes.length; i++)
          { walk(node.childNodes[i]); }

        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }
        if (isBlock) { closing = true; }
      } else if (node.nodeType == 3) {
        addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " "));
      }
    }
    for (;;) {
      walk(from);
      if (from == to) { break }
      from = from.nextSibling;
      extraLinebreak = false;
    }
    return text
  }

  function domToPos(cm, node, offset) {
    var lineNode;
    if (node == cm.display.lineDiv) {
      lineNode = cm.display.lineDiv.childNodes[offset];
      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }
      node = null; offset = 0;
    } else {
      for (lineNode = node;; lineNode = lineNode.parentNode) {
        if (!lineNode || lineNode == cm.display.lineDiv) { return null }
        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }
      }
    }
    for (var i = 0; i < cm.display.view.length; i++) {
      var lineView = cm.display.view[i];
      if (lineView.node == lineNode)
        { return locateNodeInLineView(lineView, node, offset) }
    }
  }

  function locateNodeInLineView(lineView, node, offset) {
    var wrapper = lineView.text.firstChild, bad = false;
    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }
    if (node == wrapper) {
      bad = true;
      node = wrapper.childNodes[offset];
      offset = 0;
      if (!node) {
        var line = lineView.rest ? lst(lineView.rest) : lineView.line;
        return badPos(Pos(lineNo(line), line.text.length), bad)
      }
    }

    var textNode = node.nodeType == 3 ? node : null, topNode = node;
    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
      textNode = node.firstChild;
      if (offset) { offset = textNode.nodeValue.length; }
    }
    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }
    var measure = lineView.measure, maps = measure.maps;

    function find(textNode, topNode, offset) {
      for (var i = -1; i < (maps ? maps.length : 0); i++) {
        var map = i < 0 ? measure.map : maps[i];
        for (var j = 0; j < map.length; j += 3) {
          var curNode = map[j + 2];
          if (curNode == textNode || curNode == topNode) {
            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
            var ch = map[j] + offset;
            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }
            return Pos(line, ch)
          }
        }
      }
    }
    var found = find(textNode, topNode, offset);
    if (found) { return badPos(found, bad) }

    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
      found = find(after, after.firstChild, 0);
      if (found)
        { return badPos(Pos(found.line, found.ch - dist), bad) }
      else
        { dist += after.textContent.length; }
    }
    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {
      found = find(before, before.firstChild, -1);
      if (found)
        { return badPos(Pos(found.line, found.ch + dist$1), bad) }
      else
        { dist$1 += before.textContent.length; }
    }
  }

  // TEXTAREA INPUT STYLE

  var TextareaInput = function(cm) {
    this.cm = cm;
    // See input.poll and input.reset
    this.prevInput = "";

    // Flag that indicates whether we expect input to appear real soon
    // now (after some event like 'keypress' or 'input') and are
    // polling intensively.
    this.pollingFast = false;
    // Self-resetting timeout for the poller
    this.polling = new Delayed();
    // Used to work around IE issue with selection being forgotten when focus moves away from textarea
    this.hasSelection = false;
    this.composing = null;
  };

  TextareaInput.prototype.init = function (display) {
      var this$1 = this;

    var input = this, cm = this.cm;
    this.createField(display);
    var te = this.textarea;

    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);

    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
    if (ios) { te.style.width = "0px"; }

    on(te, "input", function () {
      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }
      input.poll();
    });

    on(te, "paste", function (e) {
      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }

      cm.state.pasteIncoming = +new Date;
      input.fastPoll();
    });

    function prepareCopyCut(e) {
      if (signalDOMEvent(cm, e)) { return }
      if (cm.somethingSelected()) {
        setLastCopied({lineWise: false, text: cm.getSelections()});
      } else if (!cm.options.lineWiseCopyCut) {
        return
      } else {
        var ranges = copyableRanges(cm);
        setLastCopied({lineWise: true, text: ranges.text});
        if (e.type == "cut") {
          cm.setSelections(ranges.ranges, null, sel_dontScroll);
        } else {
          input.prevInput = "";
          te.value = ranges.text.join("\n");
          selectInput(te);
        }
      }
      if (e.type == "cut") { cm.state.cutIncoming = +new Date; }
    }
    on(te, "cut", prepareCopyCut);
    on(te, "copy", prepareCopyCut);

    on(display.scroller, "paste", function (e) {
      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }
      if (!te.dispatchEvent) {
        cm.state.pasteIncoming = +new Date;
        input.focus();
        return
      }

      // Pass the `paste` event to the textarea so it's handled by its event listener.
      var event = new Event("paste");
      event.clipboardData = e.clipboardData;
      te.dispatchEvent(event);
    });

    // Prevent normal selection in the editor (we handle our own)
    on(display.lineSpace, "selectstart", function (e) {
      if (!eventInWidget(display, e)) { e_preventDefault(e); }
    });

    on(te, "compositionstart", function () {
      var start = cm.getCursor("from");
      if (input.composing) { input.composing.range.clear(); }
      input.composing = {
        start: start,
        range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
      };
    });
    on(te, "compositionend", function () {
      if (input.composing) {
        input.poll();
        input.composing.range.clear();
        input.composing = null;
      }
    });
  };

  TextareaInput.prototype.createField = function (_display) {
    // Wraps and hides input textarea
    this.wrapper = hiddenTextarea();
    // The semihidden textarea that is focused when the editor is
    // focused, and receives input.
    this.textarea = this.wrapper.firstChild;
  };

  TextareaInput.prototype.screenReaderLabelChanged = function (label) {
    // Label for screenreaders, accessibility
    if(label) {
      this.textarea.setAttribute('aria-label', label);
    } else {
      this.textarea.removeAttribute('aria-label');
    }
  };

  TextareaInput.prototype.prepareSelection = function () {
    // Redraw the selection and/or cursor
    var cm = this.cm, display = cm.display, doc = cm.doc;
    var result = prepareSelection(cm);

    // Move the hidden textarea near the cursor to prevent scrolling artifacts
    if (cm.options.moveInputWithCursor) {
      var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
                                          headPos.top + lineOff.top - wrapOff.top));
      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
                                           headPos.left + lineOff.left - wrapOff.left));
    }

    return result
  };

  TextareaInput.prototype.showSelection = function (drawn) {
    var cm = this.cm, display = cm.display;
    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
    removeChildrenAndAdd(display.selectionDiv, drawn.selection);
    if (drawn.teTop != null) {
      this.wrapper.style.top = drawn.teTop + "px";
      this.wrapper.style.left = drawn.teLeft + "px";
    }
  };

  // Reset the input to correspond to the selection (or to be empty,
  // when not typing and nothing is selected)
  TextareaInput.prototype.reset = function (typing) {
    if (this.contextMenuPending || this.composing) { return }
    var cm = this.cm;
    if (cm.somethingSelected()) {
      this.prevInput = "";
      var content = cm.getSelection();
      this.textarea.value = content;
      if (cm.state.focused) { selectInput(this.textarea); }
      if (ie && ie_version >= 9) { this.hasSelection = content; }
    } else if (!typing) {
      this.prevInput = this.textarea.value = "";
      if (ie && ie_version >= 9) { this.hasSelection = null; }
    }
  };

  TextareaInput.prototype.getField = function () { return this.textarea };

  TextareaInput.prototype.supportsTouch = function () { return false };

  TextareaInput.prototype.focus = function () {
    if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
      try { this.textarea.focus(); }
      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
    }
  };

  TextareaInput.prototype.blur = function () { this.textarea.blur(); };

  TextareaInput.prototype.resetPosition = function () {
    this.wrapper.style.top = this.wrapper.style.left = 0;
  };

  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };

  // Poll for input changes, using the normal rate of polling. This
  // runs as long as the editor is focused.
  TextareaInput.prototype.slowPoll = function () {
      var this$1 = this;

    if (this.pollingFast) { return }
    this.polling.set(this.cm.options.pollInterval, function () {
      this$1.poll();
      if (this$1.cm.state.focused) { this$1.slowPoll(); }
    });
  };

  // When an event has just come in that is likely to add or change
  // something in the input textarea, we poll faster, to ensure that
  // the change appears on the screen quickly.
  TextareaInput.prototype.fastPoll = function () {
    var missed = false, input = this;
    input.pollingFast = true;
    function p() {
      var changed = input.poll();
      if (!changed && !missed) {missed = true; input.polling.set(60, p);}
      else {input.pollingFast = false; input.slowPoll();}
    }
    input.polling.set(20, p);
  };

  // Read input from the textarea, and update the document to match.
  // When something is selected, it is present in the textarea, and
  // selected (unless it is huge, in which case a placeholder is
  // used). When nothing is selected, the cursor sits after previously
  // seen text (can be empty), which is stored in prevInput (we must
  // not reset the textarea when typing, because that breaks IME).
  TextareaInput.prototype.poll = function () {
      var this$1 = this;

    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
    // Since this is called a *lot*, try to bail out as cheaply as
    // possible when it is clear that nothing happened. hasSelection
    // will be the case when there is a lot of text in the textarea,
    // in which case reading its value would be expensive.
    if (this.contextMenuPending || !cm.state.focused ||
        (hasSelection(input) && !prevInput && !this.composing) ||
        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
      { return false }

    var text = input.value;
    // If nothing changed, bail.
    if (text == prevInput && !cm.somethingSelected()) { return false }
    // Work around nonsensical selection resetting in IE9/10, and
    // inexplicable appearance of private area unicode characters on
    // some key combos in Mac (#2689).
    if (ie && ie_version >= 9 && this.hasSelection === text ||
        mac && /[\uf700-\uf7ff]/.test(text)) {
      cm.display.input.reset();
      return false
    }

    if (cm.doc.sel == cm.display.selForContextMenu) {
      var first = text.charCodeAt(0);
      if (first == 0x200b && !prevInput) { prevInput = "\u200b"; }
      if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") }
    }
    // Find the part of the input that is actually new
    var same = 0, l = Math.min(prevInput.length, text.length);
    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }

    runInOp(cm, function () {
      applyTextInput(cm, text.slice(same), prevInput.length - same,
                     null, this$1.composing ? "*compose" : null);

      // Don't leave long text in the textarea, since it makes further polling slow
      if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; }
      else { this$1.prevInput = text; }

      if (this$1.composing) {
        this$1.composing.range.clear();
        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"),
                                           {className: "CodeMirror-composing"});
      }
    });
    return true
  };

  TextareaInput.prototype.ensurePolled = function () {
    if (this.pollingFast && this.poll()) { this.pollingFast = false; }
  };

  TextareaInput.prototype.onKeyPress = function () {
    if (ie && ie_version >= 9) { this.hasSelection = null; }
    this.fastPoll();
  };

  TextareaInput.prototype.onContextMenu = function (e) {
    var input = this, cm = input.cm, display = cm.display, te = input.textarea;
    if (input.contextMenuPending) { input.contextMenuPending(); }
    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
    if (!pos || presto) { return } // Opera is difficult.

    // Reset the current text selection only if the click is done outside of the selection
    // and 'resetSelectionOnContextMenu' option is true.
    var reset = cm.options.resetSelectionOnContextMenu;
    if (reset && cm.doc.sel.contains(pos) == -1)
      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }

    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();
    input.wrapper.style.cssText = "position: static";
    te.style.cssText = "position: absolute; width: 30px; height: 30px;\n      top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n      z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
    var oldScrollY;
    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)
    display.input.focus();
    if (webkit) { window.scrollTo(null, oldScrollY); }
    display.input.reset();
    // Adds "Select all" to context menu in FF
    if (!cm.somethingSelected()) { te.value = input.prevInput = " "; }
    input.contextMenuPending = rehide;
    display.selForContextMenu = cm.doc.sel;
    clearTimeout(display.detectingSelectAll);

    // Select-all will be greyed out if there's nothing to select, so
    // this adds a zero-width space so that we can later check whether
    // it got selected.
    function prepareSelectAllHack() {
      if (te.selectionStart != null) {
        var selected = cm.somethingSelected();
        var extval = "\u200b" + (selected ? te.value : "");
        te.value = "\u21da"; // Used to catch context-menu undo
        te.value = extval;
        input.prevInput = selected ? "" : "\u200b";
        te.selectionStart = 1; te.selectionEnd = extval.length;
        // Re-set this, in case some other handler touched the
        // selection in the meantime.
        display.selForContextMenu = cm.doc.sel;
      }
    }
    function rehide() {
      if (input.contextMenuPending != rehide) { return }
      input.contextMenuPending = false;
      input.wrapper.style.cssText = oldWrapperCSS;
      te.style.cssText = oldCSS;
      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }

      // Try to detect the user choosing select-all
      if (te.selectionStart != null) {
        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }
        var i = 0, poll = function () {
          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
              te.selectionEnd > 0 && input.prevInput == "\u200b") {
            operation(cm, selectAll)(cm);
          } else if (i++ < 10) {
            display.detectingSelectAll = setTimeout(poll, 500);
          } else {
            display.selForContextMenu = null;
            display.input.reset();
          }
        };
        display.detectingSelectAll = setTimeout(poll, 200);
      }
    }

    if (ie && ie_version >= 9) { prepareSelectAllHack(); }
    if (captureRightClick) {
      e_stop(e);
      var mouseup = function () {
        off(window, "mouseup", mouseup);
        setTimeout(rehide, 20);
      };
      on(window, "mouseup", mouseup);
    } else {
      setTimeout(rehide, 50);
    }
  };

  TextareaInput.prototype.readOnlyChanged = function (val) {
    if (!val) { this.reset(); }
    this.textarea.disabled = val == "nocursor";
    this.textarea.readOnly = !!val;
  };

  TextareaInput.prototype.setUneditable = function () {};

  TextareaInput.prototype.needsContentAttribute = false;

  function fromTextArea(textarea, options) {
    options = options ? copyObj(options) : {};
    options.value = textarea.value;
    if (!options.tabindex && textarea.tabIndex)
      { options.tabindex = textarea.tabIndex; }
    if (!options.placeholder && textarea.placeholder)
      { options.placeholder = textarea.placeholder; }
    // Set autofocus to true if this textarea is focused, or if it has
    // autofocus and no other element is focused.
    if (options.autofocus == null) {
      var hasFocus = activeElt();
      options.autofocus = hasFocus == textarea ||
        textarea.getAttribute("autofocus") != null && hasFocus == document.body;
    }

    function save() {textarea.value = cm.getValue();}

    var realSubmit;
    if (textarea.form) {
      on(textarea.form, "submit", save);
      // Deplorable hack to make the submit method do the right thing.
      if (!options.leaveSubmitMethodAlone) {
        var form = textarea.form;
        realSubmit = form.submit;
        try {
          var wrappedSubmit = form.submit = function () {
            save();
            form.submit = realSubmit;
            form.submit();
            form.submit = wrappedSubmit;
          };
        } catch(e) {}
      }
    }

    options.finishInit = function (cm) {
      cm.save = save;
      cm.getTextArea = function () { return textarea; };
      cm.toTextArea = function () {
        cm.toTextArea = isNaN; // Prevent this from being ran twice
        save();
        textarea.parentNode.removeChild(cm.getWrapperElement());
        textarea.style.display = "";
        if (textarea.form) {
          off(textarea.form, "submit", save);
          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function")
            { textarea.form.submit = realSubmit; }
        }
      };
    };

    textarea.style.display = "none";
    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },
      options);
    return cm
  }

  function addLegacyProps(CodeMirror) {
    CodeMirror.off = off;
    CodeMirror.on = on;
    CodeMirror.wheelEventPixels = wheelEventPixels;
    CodeMirror.Doc = Doc;
    CodeMirror.splitLines = splitLinesAuto;
    CodeMirror.countColumn = countColumn;
    CodeMirror.findColumn = findColumn;
    CodeMirror.isWordChar = isWordCharBasic;
    CodeMirror.Pass = Pass;
    CodeMirror.signal = signal;
    CodeMirror.Line = Line;
    CodeMirror.changeEnd = changeEnd;
    CodeMirror.scrollbarModel = scrollbarModel;
    CodeMirror.Pos = Pos;
    CodeMirror.cmpPos = cmp;
    CodeMirror.modes = modes;
    CodeMirror.mimeModes = mimeModes;
    CodeMirror.resolveMode = resolveMode;
    CodeMirror.getMode = getMode;
    CodeMirror.modeExtensions = modeExtensions;
    CodeMirror.extendMode = extendMode;
    CodeMirror.copyState = copyState;
    CodeMirror.startState = startState;
    CodeMirror.innerMode = innerMode;
    CodeMirror.commands = commands;
    CodeMirror.keyMap = keyMap;
    CodeMirror.keyName = keyName;
    CodeMirror.isModifierKey = isModifierKey;
    CodeMirror.lookupKey = lookupKey;
    CodeMirror.normalizeKeyMap = normalizeKeyMap;
    CodeMirror.StringStream = StringStream;
    CodeMirror.SharedTextMarker = SharedTextMarker;
    CodeMirror.TextMarker = TextMarker;
    CodeMirror.LineWidget = LineWidget;
    CodeMirror.e_preventDefault = e_preventDefault;
    CodeMirror.e_stopPropagation = e_stopPropagation;
    CodeMirror.e_stop = e_stop;
    CodeMirror.addClass = addClass;
    CodeMirror.contains = contains;
    CodeMirror.rmClass = rmClass;
    CodeMirror.keyNames = keyNames;
  }

  // EDITOR CONSTRUCTOR

  defineOptions(CodeMirror);

  addEditorMethods(CodeMirror);

  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
  var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
    { CodeMirror.prototype[prop] = (function(method) {
      return function() {return method.apply(this.doc, arguments)}
    })(Doc.prototype[prop]); } }

  eventMixin(Doc);
  CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};

  // Extra arguments are stored as the mode's dependencies, which is
  // used by (legacy) mechanisms like loadmode.js to automatically
  // load a mode. (Preferred mechanism is the require/define calls.)
  CodeMirror.defineMode = function(name/*, mode, …*/) {
    if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; }
    defineMode.apply(this, arguments);
  };

  CodeMirror.defineMIME = defineMIME;

  // Minimal default mode.
  CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });
  CodeMirror.defineMIME("text/plain", "null");

  // EXTENSIONS

  CodeMirror.defineExtension = function (name, func) {
    CodeMirror.prototype[name] = func;
  };
  CodeMirror.defineDocExtension = function (name, func) {
    Doc.prototype[name] = func;
  };

  CodeMirror.fromTextArea = fromTextArea;

  addLegacyProps(CodeMirror);

  CodeMirror.version = "5.60.0";

  return CodeMirror;

})));
addons.min.js000060400000164544152455704320007155 0ustar00!(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(a){var b=a.getWrapperElement();a.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:b.style.width,height:b.style.height},b.style.width="",b.style.height="auto",b.className+=" CodeMirror-fullscreen",document.documentElement.style.overflow="hidden",a.refresh()}function c(a){var b=a.getWrapperElement();b.className=b.className.replace(/\s*CodeMirror-fullscreen\b/,""),document.documentElement.style.overflow="";var c=a.state.fullScreenRestore;b.style.width=c.width,b.style.height=c.height,window.scrollTo(c.scrollLeft,c.scrollTop),a.refresh()}a.defineOption("fullScreen",!1,(function(d,e,f){f==a.Init&&(f=!1),!f!=!e&&(e?b(d):c(d))}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){function b(a,b,c,d){this.cm=a,this.node=b,this.options=c,this.height=d,this.cleared=!1}function c(a){var b=a.getWrapperElement(),c=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,d=parseInt(c.height),e=a.state.panels={setHeight:b.style.height,panels:[],wrapper:document.createElement("div")},f=a.hasFocus(),g=a.getScrollInfo();b.parentNode.insertBefore(e.wrapper,b),e.wrapper.appendChild(b),a.scrollTo(g.left,g.top),f&&a.focus(),a._setSize=a.setSize,null!=d&&(a.setSize=function(b,c){if(c||(c=e.wrapper.offsetHeight),e.setHeight=c,"number"!=typeof c){var f=/^(\d+\.?\d*)px$/.exec(c);f?c=Number(f[1]):(e.wrapper.style.height=c,c=e.wrapper.offsetHeight)}var g=c-e.panels.map((function(a){return a.node.getBoundingClientRect().height})).reduce((function(a,b){return a+b}),0);a._setSize(b,g),d=c})}function d(a){var b=a.state.panels;a.state.panels=null;var c=a.getWrapperElement(),d=a.hasFocus(),e=a.getScrollInfo();b.wrapper.parentNode.replaceChild(c,b.wrapper),a.scrollTo(e.left,e.top),d&&a.focus(),c.style.height=b.setHeight,a.setSize=a._setSize,a.setSize()}function e(a,b){for(var c=b.nextSibling;c;c=c.nextSibling)if(c==a.getWrapperElement())return!0;return!1}a.defineExtension("addPanel",(function(a,d){d=d||{},this.state.panels||c(this);var f=this.state.panels,g=f.wrapper,h=this.getWrapperElement(),i=d.replace instanceof b&&!d.replace.cleared;d.after instanceof b&&!d.after.cleared?g.insertBefore(a,d.before.node.nextSibling):d.before instanceof b&&!d.before.cleared?g.insertBefore(a,d.before.node):i?(g.insertBefore(a,d.replace.node),d.replace.clear(!0)):"bottom"==d.position?g.appendChild(a):"before-bottom"==d.position?g.insertBefore(a,h.nextSibling):"after-top"==d.position?g.insertBefore(a,h):g.insertBefore(a,g.firstChild);var j=d&&d.height||a.offsetHeight,k=new b(this,a,d,j);return f.panels.push(k),this.setSize(),d.stable&&e(this,a)&&this.scrollTo(null,this.getScrollInfo().top+j),k})),b.prototype.clear=function(a){if(!this.cleared){this.cleared=!0;var b=this.cm.state.panels;b.panels.splice(b.panels.indexOf(this),1),this.cm.setSize(),this.options.stable&&e(this.cm,this.node)&&this.cm.scrollTo(null,this.cm.getScrollInfo().top-this.height),b.wrapper.removeChild(this.node),0!=b.panels.length||a||d(this.cm)}},b.prototype.changed=function(){this.height=this.node.getBoundingClientRect().height,this.cm.setSize()}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){function b(a,b){return"pairs"==b&&"string"==typeof a?a:"object"==typeof a&&null!=a[b]?a[b]:m[b]}function c(a){for(var b=0;b<a.length;b++){var c=a.charAt(b),e="'"+c+"'";o[e]||(o[e]=d(c))}}function d(a){return function(b){return j(b,a)}}function e(a){var b=a.state.closeBrackets;return!b||b.override?b:a.getModeAt(a.getCursor()).closeBrackets||b}function f(c){var d=e(c);if(!d||c.getOption("disableInput"))return a.Pass;for(var f=b(d,"pairs"),g=c.listSelections(),h=0;h<g.length;h++){if(!g[h].empty())return a.Pass;var i=k(c,g[h].head);if(!i||f.indexOf(i)%2!=0)return a.Pass}for(var h=g.length-1;h>=0;h--){var j=g[h].head;c.replaceRange("",n(j.line,j.ch-1),n(j.line,j.ch+1),"+delete")}}function g(c){var d=e(c),f=d&&b(d,"explode");if(!f||c.getOption("disableInput"))return a.Pass;for(var g=c.listSelections(),i=0;i<g.length;i++){if(!g[i].empty())return a.Pass;var j=k(c,g[i].head);if(!j||f.indexOf(j)%2!=0)return a.Pass}c.operation((function(){var a=c.lineSeparator()||"\n";c.replaceSelection(a+a,null),h(c,-1),g=c.listSelections();for(var b=0;b<g.length;b++){var d=g[b].head.line;c.indentLine(d,null,!0),c.indentLine(d+1,null,!0)}}))}function h(a,b){for(var c=[],d=a.listSelections(),e=0,f=0;f<d.length;f++){var g=d[f];g.head==a.getCursor()&&(e=f);var h=g.head.ch||b>0?{line:g.head.line,ch:g.head.ch+b}:{line:g.head.line-1};c.push({anchor:h,head:h})}a.setSelections(c,e)}function i(b){var c=a.cmpPos(b.anchor,b.head)>0;return{anchor:new n(b.anchor.line,b.anchor.ch+(c?-1:1)),head:new n(b.head.line,b.head.ch+(c?1:-1))}}function j(c,d){var f=e(c);if(!f||c.getOption("disableInput"))return a.Pass;var g=b(f,"pairs"),j=g.indexOf(d);if(-1==j)return a.Pass;for(var k,m=b(f,"closeBefore"),o=b(f,"triples"),p=g.charAt(j+1)==d,q=c.listSelections(),r=j%2==0,s=0;s<q.length;s++){var t,u=q[s],v=u.head,w=c.getRange(v,n(v.line,v.ch+1));if(r&&!u.empty())t="surround";else if(!p&&r||w!=d)if(p&&v.ch>1&&o.indexOf(d)>=0&&c.getRange(n(v.line,v.ch-2),v)==d+d){if(v.ch>2&&/\bstring/.test(c.getTokenTypeAt(n(v.line,v.ch-2))))return a.Pass;t="addFour"}else if(p){var x=0==v.ch?" ":c.getRange(n(v.line,v.ch-1),v);if(a.isWordChar(w)||x==d||a.isWordChar(x))return a.Pass;t="both"}else{if(!r||!(0===w.length||/\s/.test(w)||m.indexOf(w)>-1))return a.Pass;t="both"}else t=p&&l(c,v)?"both":o.indexOf(d)>=0&&c.getRange(v,n(v.line,v.ch+3))==d+d+d?"skipThree":"skip";if(k){if(k!=t)return a.Pass}else k=t}var y=j%2?g.charAt(j-1):d,z=j%2?d:g.charAt(j+1);c.operation((function(){if("skip"==k)h(c,1);else if("skipThree"==k)h(c,3);else if("surround"==k){for(var a=c.getSelections(),b=0;b<a.length;b++)a[b]=y+a[b]+z;c.replaceSelections(a,"around"),a=c.listSelections().slice();for(var b=0;b<a.length;b++)a[b]=i(a[b]);c.setSelections(a)}else"both"==k?(c.replaceSelection(y+z,null),c.triggerElectric(y+z),h(c,-1)):"addFour"==k&&(c.replaceSelection(y+y+y+y,"before"),h(c,1))}))}function k(a,b){var c=a.getRange(n(b.line,b.ch-1),n(b.line,b.ch+1));return 2==c.length?c:null}function l(a,b){var c=a.getTokenAt(n(b.line,b.ch+1));return/\bstring/.test(c.type)&&c.start==b.ch&&(0==b.ch||!/\bstring/.test(a.getTokenTypeAt(b)))}var m={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=a.Pos;a.defineOption("autoCloseBrackets",!1,(function(d,e,f){f&&f!=a.Init&&(d.removeKeyMap(o),d.state.closeBrackets=null),e&&(c(b(e,"pairs")),d.state.closeBrackets=e,d.addKeyMap(o))}));var o={Backspace:f,Enter:g};c(m.pairs+"`")})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)})((function(a){function b(b){if(b.getOption("disableInput"))return a.Pass;for(var c=b.listSelections(),d=[],i=b.getOption("autoCloseTags"),j=0;j<c.length;j++){if(!c[j].empty())return a.Pass;var k=c[j].head,l=b.getTokenAt(k),m=a.innerMode(b.getMode(),l.state),n=m.state,o=m.mode.xmlCurrentTag&&m.mode.xmlCurrentTag(n),p=o&&o.name;if(!p)return a.Pass;var q="html"==m.mode.configuration,r="object"==typeof i&&i.dontCloseTags||q&&g,s="object"==typeof i&&i.indentTags||q&&h;l.end>k.ch&&(p=p.slice(0,p.length-l.end+k.ch));var t=p.toLowerCase();if(!p||"string"==l.type&&(l.end!=k.ch||!/[\"\']/.test(l.string.charAt(l.string.length-1))||1==l.string.length)||"tag"==l.type&&o.close||l.string.indexOf("/")==k.ch-l.start-1||r&&e(r,t)>-1||f(b,m.mode.xmlCurrentContext&&m.mode.xmlCurrentContext(n)||[],p,k,!0))return a.Pass;var u="object"==typeof i&&i.emptyTags;if(u&&e(u,p)>-1)d[j]={text:"/>",newPos:a.Pos(k.line,k.ch+2)};else{var v=s&&e(s,t)>-1;d[j]={indent:v,text:">"+(v?"\n\n":"")+"</"+p+">",newPos:v?a.Pos(k.line+1,0):a.Pos(k.line,k.ch+1)}}}for(var w="object"==typeof i&&i.dontIndentOnAutoClose,j=c.length-1;j>=0;j--){var x=d[j];b.replaceRange(x.text,c[j].head,c[j].anchor,"+insert");var y=b.listSelections().slice(0);y[j]={head:x.newPos,anchor:x.newPos},b.setSelections(y),!w&&x.indent&&(b.indentLine(x.newPos.line,null,!0),b.indentLine(x.newPos.line+1,null,!0))}}function c(b,c){for(var d=b.listSelections(),e=[],g=c?"/":"</",h=b.getOption("autoCloseTags"),i="object"==typeof h&&h.dontIndentOnSlash,j=0;j<d.length;j++){if(!d[j].empty())return a.Pass;var k=d[j].head,l=b.getTokenAt(k),m=a.innerMode(b.getMode(),l.state),n=m.state;if(c&&("string"==l.type||"<"!=l.string.charAt(0)||l.start!=k.ch-1))return a.Pass;var o,p="xml"!=m.mode.name&&"htmlmixed"==b.getMode().name;if(p&&"javascript"==m.mode.name)o=g+"script";else if(p&&"css"==m.mode.name)o=g+"style";else{var q=m.mode.xmlCurrentContext&&m.mode.xmlCurrentContext(n),r=q.length?q[q.length-1]:"";if(!q||q.length&&f(b,q,r,k))return a.Pass;o=g+r}">"!=b.getLine(k.line).charAt(l.end)&&(o+=">"),e[j]=o}if(b.replaceSelections(e),d=b.listSelections(),!i)for(var j=0;j<d.length;j++)(j==d.length-1||d[j].head.line<d[j+1].head.line)&&b.indentLine(d[j].head.line)}function d(b){return b.getOption("disableInput")?a.Pass:c(b,!0)}function e(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0,d=a.length;c<d;++c)if(a[c]==b)return c;return-1}function f(b,c,d,e,f){if(!a.scanForClosingTag)return!1;var g=Math.min(b.lastLine()+1,e.line+500),h=a.scanForClosingTag(b,e,null,g);if(!h||h.tag!=d)return!1;for(var i=f?1:0,j=c.length-1;j>=0&&c[j]==d;j--)++i;e=h.to;for(var j=1;j<i;j++){var k=a.scanForClosingTag(b,e,null,g);if(!k||k.tag!=d)return!1;e=k.to}return!0}a.defineOption("autoCloseTags",!1,(function(c,e,f){if(f!=a.Init&&f&&c.removeKeyMap("autoCloseTags"),e){var g={name:"autoCloseTags"};"object"==typeof e&&!1===e.whenClosing||(g["'/'"]=function(a){return d(a)}),"object"==typeof e&&!1===e.whenOpening||(g["'>'"]=function(a){return b(a)}),c.addKeyMap(g)}}));var g=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],h=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];a.commands.closeTag=function(a){return c(a)}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){function b(a){return a&&a.bracketRegex||/[(){}[\]]/}function c(a,c,e){var f=a.getLineHandle(c.line),g=c.ch-1,h=e&&e.afterCursor;null==h&&(h=/(^| )cm-fat-cursor($| )/.test(a.getWrapperElement().className));var k=b(e),l=!h&&g>=0&&k.test(f.text.charAt(g))&&j[f.text.charAt(g)]||k.test(f.text.charAt(g+1))&&j[f.text.charAt(++g)];if(!l)return null;var m=">"==l.charAt(1)?1:-1;if(e&&e.strict&&m>0!=(g==c.ch))return null;var n=a.getTokenTypeAt(i(c.line,g+1)),o=d(a,i(c.line,g+(m>0?1:0)),m,n,e);return null==o?null:{from:i(c.line,g),to:o&&o.pos,match:o&&o.ch==l.charAt(0),forward:m>0}}function d(a,c,d,e,f){for(var g=f&&f.maxScanLineLength||1e4,h=f&&f.maxScanLines||1e3,k=[],l=b(f),m=d>0?Math.min(c.line+h,a.lastLine()+1):Math.max(a.firstLine()-1,c.line-h),n=c.line;n!=m;n+=d){var o=a.getLine(n);if(o){var p=d>0?0:o.length-1,q=d>0?o.length:-1;if(!(o.length>g))for(n==c.line&&(p=c.ch-(d<0?1:0));p!=q;p+=d){var r=o.charAt(p);if(l.test(r)&&(void 0===e||(a.getTokenTypeAt(i(n,p+1))||"")==(e||""))){var s=j[r];if(s&&">"==s.charAt(1)==d>0)k.push(r);else{if(!k.length)return{pos:i(n,p),ch:r};k.pop()}}}}}return n-d!=(d>0?a.lastLine():a.firstLine())&&null}function e(a,b,d){for(var e=a.state.matchBrackets.maxHighlightLineLength||1e3,f=d&&d.highlightNonMatching,g=[],j=a.listSelections(),k=0;k<j.length;k++){var l=j[k].empty()&&c(a,j[k].head,d);if(l&&(l.match||!1!==f)&&a.getLine(l.from.line).length<=e){var m=l.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";g.push(a.markText(l.from,i(l.from.line,l.from.ch+1),{className:m})),l.to&&a.getLine(l.to.line).length<=e&&g.push(a.markText(l.to,i(l.to.line,l.to.ch+1),{className:m}))}}if(g.length){h&&a.state.focused&&a.focus();var n=function(){a.operation((function(){for(var a=0;a<g.length;a++)g[a].clear()}))};if(!b)return n;setTimeout(n,800)}}function f(a){a.operation((function(){a.state.matchBrackets.currentlyHighlighted&&(a.state.matchBrackets.currentlyHighlighted(),a.state.matchBrackets.currentlyHighlighted=null),a.state.matchBrackets.currentlyHighlighted=e(a,!1,a.state.matchBrackets)}))}function g(a){a.state.matchBrackets&&a.state.matchBrackets.currentlyHighlighted&&(a.state.matchBrackets.currentlyHighlighted(),a.state.matchBrackets.currentlyHighlighted=null)}var h=/MSIE \d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),i=a.Pos,j={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<","<":">>",">":"<<"};a.defineOption("matchBrackets",!1,(function(b,c,d){d&&d!=a.Init&&(b.off("cursorActivity",f),b.off("focus",f),b.off("blur",g),g(b)),c&&(b.state.matchBrackets="object"==typeof c?c:{},b.on("cursorActivity",f),b.on("focus",f),b.on("blur",g))})),a.defineExtension("matchBrackets",(function(){e(this,!0)})),a.defineExtension("findMatchingBracket",(function(a,b,d){return(d||"boolean"==typeof b)&&(d?(d.strict=b,b=d):b=b?{strict:!0}:null),c(this,a,b)})),a.defineExtension("scanForBracket",(function(a,b,c,e){return d(this,a,b,c,e)}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)})((function(a){"use strict";function b(a){a.state.tagHit&&a.state.tagHit.clear(),a.state.tagOther&&a.state.tagOther.clear(),a.state.tagHit=a.state.tagOther=null}function c(c){c.state.failedTagMatch=!1,c.operation((function(){if(b(c),!c.somethingSelected()){var d=c.getCursor(),e=c.getViewport();e.from=Math.min(e.from,d.line),e.to=Math.max(d.line+1,e.to);var f=a.findMatchingTag(c,d,e);if(f){if(c.state.matchBothTags){var g="open"==f.at?f.open:f.close;g&&(c.state.tagHit=c.markText(g.from,g.to,{className:"CodeMirror-matchingtag"}))}var h="close"==f.at?f.open:f.close;h?c.state.tagOther=c.markText(h.from,h.to,{className:"CodeMirror-matchingtag"}):c.state.failedTagMatch=!0}}}))}function d(a){a.state.failedTagMatch&&c(a)}a.defineOption("matchTags",!1,(function(e,f,g){g&&g!=a.Init&&(e.off("cursorActivity",c),e.off("viewportChange",d),b(e)),f&&(e.state.matchBothTags="object"==typeof f&&f.bothTags,e.on("cursorActivity",c),e.on("viewportChange",d),c(e))})),a.commands.toMatchingTag=function(b){var c=a.findMatchingTag(b,b.getCursor());if(c){var d="close"==c.at?c.open:c.close;d&&b.extendSelection(d.to,d.from)}}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";a.registerHelper("fold","brace",(function(b,c){function d(d){for(var f=c.ch,g=0;;){var h=f<=0?-1:j.lastIndexOf(d,f-1);if(-1!=h){if(1==g&&h<c.ch)break;if(e=b.getTokenTypeAt(a.Pos(i,h+1)),!/^(comment|string)/.test(e))return h+1;f=h-1}else{if(1==g)break;g=1,f=j.length}}}var e,f,g,h,i=c.line,j=b.getLine(i),k=d("{"),l=d("[");if(null!=k&&(null==l||l>k))h=k,f="{",g="}";else{if(null==l)return;h=l,f="[",g="]"}var m,n,o=1,p=b.lastLine();a:for(var q=i;q<=p;++q)for(var r=b.getLine(q),s=q==i?h:0;;){var t=r.indexOf(f,s),u=r.indexOf(g,s);if(t<0&&(t=r.length),u<0&&(u=r.length),(s=Math.min(t,u))==r.length)break;if(b.getTokenTypeAt(a.Pos(q,s+1))==e)if(s==t)++o;else if(!--o){m=q,n=s;break a}++s}if(null!=m&&i!=m)return{from:a.Pos(i,h),to:a.Pos(m,n)}})),a.registerHelper("fold","import",(function(b,c){function d(c){if(c<b.firstLine()||c>b.lastLine())return null;var d=b.getTokenAt(a.Pos(c,1));if(/\S/.test(d.string)||(d=b.getTokenAt(a.Pos(c,d.end+1))),"keyword"!=d.type||"import"!=d.string)return null;for(var e=c,f=Math.min(b.lastLine(),c+10);e<=f;++e){var g=b.getLine(e),h=g.indexOf(";");if(-1!=h)return{startCh:d.end,end:a.Pos(e,h)}}}var e,f=c.line,g=d(f);if(!g||d(f-1)||(e=d(f-2))&&e.end.line==f-1)return null;for(var h=g.end;;){var i=d(h.line+1);if(null==i)break;h=i.end}return{from:b.clipPos(a.Pos(f,g.startCh+1)),to:h}})),a.registerHelper("fold","include",(function(b,c){function d(c){if(c<b.firstLine()||c>b.lastLine())return null;var d=b.getTokenAt(a.Pos(c,1));return/\S/.test(d.string)||(d=b.getTokenAt(a.Pos(c,d.end+1))),"meta"==d.type&&"#include"==d.string.slice(0,8)?d.start+8:void 0}var e=c.line,f=d(e);if(null==f||null!=d(e-1))return null;for(var g=e;;){if(null==d(g+1))break;++g}return{from:a.Pos(e,f+1),to:b.clipPos(a.Pos(g))}}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(b,e,f,g){function h(a){var c=i(b,e);if(!c||c.to.line-c.from.line<j)return null;for(var d=b.findMarksAt(c.from),f=0;f<d.length;++f)if(d[f].__isFold&&"fold"!==g){if(!a)return null;c.cleared=!0,d[f].clear()}return c}if(f&&f.call){var i=f;f=null}else var i=d(b,f,"rangeFinder");"number"==typeof e&&(e=a.Pos(e,0));var j=d(b,f,"minFoldSize"),k=h(!0);if(d(b,f,"scanUp"))for(;!k&&e.line>b.firstLine();)e=a.Pos(e.line-1,0),k=h(!1);if(k&&!k.cleared&&"unfold"!==g){var l=c(b,f,k);a.on(l,"mousedown",(function(b){m.clear(),a.e_preventDefault(b)}));var m=b.markText(k.from,k.to,{replacedWith:l,clearOnEnter:d(b,f,"clearOnEnter"),__isFold:!0});m.on("clear",(function(c,d){a.signal(b,"unfold",b,c,d)})),a.signal(b,"fold",b,k.from,k.to)}}function c(a,b,c){var e=d(a,b,"widget");if("function"==typeof e&&(e=e(c.from,c.to)),"string"==typeof e){var f=document.createTextNode(e);e=document.createElement("span"),e.appendChild(f),e.className="CodeMirror-foldmarker"}else e&&(e=e.cloneNode(!0));return e}function d(a,b,c){if(b&&void 0!==b[c])return b[c];var d=a.options.foldOptions;return d&&void 0!==d[c]?d[c]:e[c]}a.newFoldFunction=function(a,c){return function(d,e){b(d,e,{rangeFinder:a,widget:c})}},a.defineExtension("foldCode",(function(a,c,d){b(this,a,c,d)})),a.defineExtension("isFolded",(function(a){for(var b=this.findMarksAt(a),c=0;c<b.length;++c)if(b[c].__isFold)return!0})),a.commands.toggleFold=function(a){a.foldCode(a.getCursor())},a.commands.fold=function(a){a.foldCode(a.getCursor(),null,"fold")},a.commands.unfold=function(a){a.foldCode(a.getCursor(),null,"unfold")},a.commands.foldAll=function(b){b.operation((function(){for(var c=b.firstLine(),d=b.lastLine();c<=d;c++)b.foldCode(a.Pos(c,0),null,"fold")}))},a.commands.unfoldAll=function(b){b.operation((function(){for(var c=b.firstLine(),d=b.lastLine();c<=d;c++)b.foldCode(a.Pos(c,0),null,"unfold")}))},a.registerHelper("fold","combine",(function(){var a=Array.prototype.slice.call(arguments,0);return function(b,c){for(var d=0;d<a.length;++d){var e=a[d](b,c);if(e)return e}}})),a.registerHelper("fold","auto",(function(a,b){for(var c=a.getHelpers(b,"fold"),d=0;d<c.length;d++){var e=c[d](a,b);if(e)return e}}));var e={rangeFinder:a.fold.auto,widget:"↔",minFoldSize:0,scanUp:!1,clearOnEnter:!0};a.defineOption("foldOptions",null),a.defineExtension("foldOption",(function(a,b){return d(this,a,b)}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("./foldcode")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./foldcode"],a):a(CodeMirror)})((function(a){"use strict";function b(a){this.options=a,this.from=this.to=0}function c(a){return!0===a&&(a={}),null==a.gutter&&(a.gutter="CodeMirror-foldgutter"),null==a.indicatorOpen&&(a.indicatorOpen="CodeMirror-foldgutter-open"),null==a.indicatorFolded&&(a.indicatorFolded="CodeMirror-foldgutter-folded"),a}function d(a,b){for(var c=a.findMarks(m(b,0),m(b+1,0)),d=0;d<c.length;++d)if(c[d].__isFold){var e=c[d].find(-1);if(e&&e.line===b)return c[d]}}function e(a){if("string"==typeof a){var b=document.createElement("div");return b.className=a+" CodeMirror-guttermarker-subtle",b}return a.cloneNode(!0)}function f(a,b,c){var f=a.state.foldGutter.options,h=b-1,i=a.foldOption(f,"minFoldSize"),j=a.foldOption(f,"rangeFinder"),k="string"==typeof f.indicatorFolded&&g(f.indicatorFolded),l="string"==typeof f.indicatorOpen&&g(f.indicatorOpen);a.eachLine(b,c,(function(b){++h;var c=null,g=b.gutterMarkers;if(g&&(g=g[f.gutter]),d(a,h)){if(k&&g&&k.test(g.className))return;c=e(f.indicatorFolded)}else{var n=m(h,0),o=j&&j(a,n);if(o&&o.to.line-o.from.line>=i){if(l&&g&&l.test(g.className))return;c=e(f.indicatorOpen)}}(c||g)&&a.setGutterMarker(b,f.gutter,c)}))}function g(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function h(a){var b=a.getViewport(),c=a.state.foldGutter;c&&(a.operation((function(){f(a,b.from,b.to)})),c.from=b.from,c.to=b.to)}function i(a,b,c){var e=a.state.foldGutter;if(e){var f=e.options;if(c==f.gutter){var g=d(a,b);g?g.clear():a.foldCode(m(b,0),f)}}}function j(a){var b=a.state.foldGutter;if(b){var c=b.options;b.from=b.to=0,clearTimeout(b.changeUpdate),b.changeUpdate=setTimeout((function(){h(a)}),c.foldOnChangeTimeSpan||600)}}function k(a){var b=a.state.foldGutter;if(b){var c=b.options;clearTimeout(b.changeUpdate),b.changeUpdate=setTimeout((function(){var c=a.getViewport();b.from==b.to||c.from-b.to>20||b.from-c.to>20?h(a):a.operation((function(){c.from<b.from&&(f(a,c.from,b.from),b.from=c.from),c.to>b.to&&(f(a,b.to,c.to),b.to=c.to)}))}),c.updateViewportTimeSpan||400)}}function l(a,b){var c=a.state.foldGutter;if(c){var d=b.line;d>=c.from&&d<c.to&&f(a,d,d+1)}}a.defineOption("foldGutter",!1,(function(d,e,f){f&&f!=a.Init&&(d.clearGutter(d.state.foldGutter.options.gutter),d.state.foldGutter=null,d.off("gutterClick",i),d.off("changes",j),d.off("viewportChange",k),d.off("fold",l),d.off("unfold",l),d.off("swapDoc",j)),e&&(d.state.foldGutter=new b(c(e)),h(d),d.on("gutterClick",i),d.on("changes",j),d.on("viewportChange",k),d.on("fold",l),d.on("unfold",l),d.on("swapDoc",j))}));var m=a.Pos})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(a,b){return a.line-b.line||a.ch-b.ch}function c(a,b,c,d){this.line=b,this.ch=c,this.cm=a,this.text=a.getLine(b),this.min=d?Math.max(d.from,a.firstLine()):a.firstLine(),this.max=d?Math.min(d.to-1,a.lastLine()):a.lastLine()}function d(a,b){var c=a.cm.getTokenTypeAt(m(a.line,b));return c&&/\btag\b/.test(c)}function e(a){if(!(a.line>=a.max))return a.ch=0,a.text=a.cm.getLine(++a.line),!0}function f(a){if(!(a.line<=a.min))return a.text=a.cm.getLine(--a.line),a.ch=a.text.length,!0}function g(a){for(;;){var b=a.text.indexOf(">",a.ch);if(-1==b){if(e(a))continue;return}{if(d(a,b+1)){var c=a.text.lastIndexOf("/",b),f=c>-1&&!/\S/.test(a.text.slice(c+1,b));return a.ch=b+1,f?"selfClose":"regular"}a.ch=b+1}}}function h(a){for(;;){var b=a.ch?a.text.lastIndexOf("<",a.ch-1):-1;if(-1==b){if(f(a))continue;return}if(d(a,b+1)){o.lastIndex=b,a.ch=b;var c=o.exec(a.text);if(c&&c.index==b)return c}else a.ch=b}}function i(a){for(;;){o.lastIndex=a.ch;var b=o.exec(a.text);if(!b){if(e(a))continue;return}{if(d(a,b.index+1))return a.ch=b.index+b[0].length,b;a.ch=b.index+1}}}function j(a){for(;;){var b=a.ch?a.text.lastIndexOf(">",a.ch-1):-1;if(-1==b){if(f(a))continue;return}{if(d(a,b+1)){var c=a.text.lastIndexOf("/",b),e=c>-1&&!/\S/.test(a.text.slice(c+1,b));return a.ch=b+1,e?"selfClose":"regular"}a.ch=b}}}function k(a,b){for(var c=[];;){var d,e=i(a),f=a.line,h=a.ch-(e?e[0].length:0);if(!e||!(d=g(a)))return;if("selfClose"!=d)if(e[1]){for(var j=c.length-1;j>=0;--j)if(c[j]==e[2]){c.length=j;break}if(j<0&&(!b||b==e[2]))return{tag:e[2],from:m(f,h),to:m(a.line,a.ch)}}else c.push(e[2])}}function l(a,b){for(var c=[];;){var d=j(a);if(!d)return;if("selfClose"!=d){var e=a.line,f=a.ch,g=h(a);if(!g)return;if(g[1])c.push(g[2]);else{for(var i=c.length-1;i>=0;--i)if(c[i]==g[2]){c.length=i;break}if(i<0&&(!b||b==g[2]))return{tag:g[2],from:m(a.line,a.ch),to:m(e,f)}}}else h(a)}}var m=a.Pos,n="A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",o=new RegExp("<(/?)(["+n+"][A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*)","g");a.registerHelper("fold","xml",(function(a,d){for(var e=new c(a,d.line,0);;){var f=i(e);if(!f||e.line!=d.line)return;var h=g(e);if(!h)return;if(!f[1]&&"selfClose"!=h){var j=m(e.line,e.ch),l=k(e,f[2]);return l&&b(l.from,j)>0?{from:j,to:l.from}:null}}})),a.findMatchingTag=function(a,d,e){var f=new c(a,d.line,d.ch,e);if(-1!=f.text.indexOf(">")||-1!=f.text.indexOf("<")){var i=g(f),j=i&&m(f.line,f.ch),n=i&&h(f);if(i&&n&&!(b(f,d)>0)){var o={from:m(f.line,f.ch),to:j,tag:n[2]};return"selfClose"==i?{open:o,close:null,at:"open"}:n[1]?{open:l(f,n[2]),close:o,at:"close"}:(f=new c(a,j.line,j.ch,e),{open:o,close:k(f,n[2]),at:"open"})}}},a.findEnclosingTag=function(a,b,d,e){for(var f=new c(a,b.line,b.ch,d);;){var g=l(f,e);if(!g)break;var h=new c(a,b.line,b.ch,d),i=k(h,g.tag);if(i)return{open:g,close:i}}},a.scanForClosingTag=function(a,b,d,e){return k(new c(a,b.line,b.ch,e?{from:0,to:e}:null),d)}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),"cjs"):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],(function(b){a(b,"amd")})):a(CodeMirror,"plain")})((function(a,b){function c(a,b){var c=b;return function(){0==--c&&a()}}function d(b,d,e){var f=a.modes[b],g=f&&f.dependencies;if(!g)return d();for(var h=[],i=0;i<g.length;++i)a.modes.hasOwnProperty(g[i])||h.push(g[i]);if(!h.length)return d();for(var j=c(d,h.length),i=0;i<h.length;++i)a.requireMode(h[i],j,e)}a.modeURL||(a.modeURL="../mode/%N/%N.js");var e={};a.requireMode=function(c,f,g){if("string"!=typeof c&&(c=c.name),a.modes.hasOwnProperty(c))return d(c,f,g);if(e.hasOwnProperty(c))return e[c].push(f);var h=g&&g.path?g.path(c):a.modeURL.replace(/%N/g,c);if(g&&g.loadMode)g.loadMode(h,(function(){d(c,f,g)}));else if("plain"==b){var i=document.createElement("script");i.src=h;var j=document.getElementsByTagName("script")[0],k=e[c]=[f];a.on(i,"load",(function(){d(c,(function(){for(var a=0;a<k.length;++a)k[a]()}),g)})),j.parentNode.insertBefore(i,j)}else"cjs"==b?(require(h),f()):"amd"==b&&requirejs([h],f)},a.autoLoadMode=function(b,c,d){a.modes.hasOwnProperty(c)||a.requireMode(c,(function(){b.setOption("mode",b.getOption("mode"))}),d)}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";a.multiplexingMode=function(b){function c(a,b,c,d){if("string"==typeof b){var e=a.indexOf(b,c);return d&&e>-1?e+b.length:e}var f=b.exec(c?a.slice(c):a);return f?f.index+c+(d?f[0].length:0):-1}var d=Array.prototype.slice.call(arguments,1);return{startState:function(){return{outer:a.startState(b),innerActive:null,inner:null,startingInner:!1}},copyState:function(c){return{outer:a.copyState(b,c.outer),innerActive:c.innerActive,inner:c.innerActive&&a.copyState(c.innerActive.mode,c.inner),startingInner:c.startingInner}},token:function(e,f){if(f.innerActive){var g=f.innerActive,h=e.string;if(!g.close&&e.sol())return f.innerActive=f.inner=null,this.token(e,f);var i=g.close&&!f.startingInner?c(h,g.close,e.pos,g.parseDelimiters):-1;if(i==e.pos&&!g.parseDelimiters)return e.match(g.close),f.innerActive=f.inner=null,g.delimStyle&&g.delimStyle+" "+g.delimStyle+"-close";i>-1&&(e.string=h.slice(0,i));var j=g.mode.token(e,f.inner);return i>-1?e.string=h:e.pos>e.start&&(f.startingInner=!1),i==e.pos&&g.parseDelimiters&&(f.innerActive=f.inner=null),g.innerStyle&&(j=j?j+" "+g.innerStyle:g.innerStyle),j}for(var k=1/0,h=e.string,l=0;l<d.length;++l){var m=d[l],i=c(h,m.open,e.pos);if(i==e.pos){m.parseDelimiters||e.match(m.open),f.startingInner=!!m.parseDelimiters,f.innerActive=m;var n=0;if(b.indent){var o=b.indent(f.outer,"","");o!==a.Pass&&(n=o)}return f.inner=a.startState(m.mode,n),m.delimStyle&&m.delimStyle+" "+m.delimStyle+"-open"}-1!=i&&i<k&&(k=i)}k!=1/0&&(e.string=h.slice(0,k));var p=b.token(e,f.outer);return k!=1/0&&(e.string=h),p},indent:function(c,d,e){var f=c.innerActive?c.innerActive.mode:b;return f.indent?f.indent(c.innerActive?c.inner:c.outer,d,e):a.Pass},blankLine:function(c){var e=c.innerActive?c.innerActive.mode:b;if(e.blankLine&&e.blankLine(c.innerActive?c.inner:c.outer),c.innerActive)"\n"===c.innerActive.close&&(c.innerActive=c.inner=null);else for(var f=0;f<d.length;++f){var g=d[f];"\n"===g.open&&(c.innerActive=g,c.inner=a.startState(g.mode,e.indent?e.indent(c.outer,"",""):0))}},electricChars:b.electricChars,innerMode:function(a){return a.inner?{state:a.inner,mode:a.innerActive.mode}:{state:a.outer,mode:b}}}}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(a,b){function c(a){clearTimeout(d.doRedraw),d.doRedraw=setTimeout((function(){d.redraw()}),a)}this.cm=a,this.options=b,this.buttonHeight=b.scrollButtonHeight||a.getOption("scrollButtonHeight"),this.annotations=[],this.doRedraw=this.doUpdate=null,this.div=a.getWrapperElement().appendChild(document.createElement("div")),this.div.style.cssText="position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none",this.computeScale();var d=this;a.on("refresh",this.resizeHandler=function(){clearTimeout(d.doUpdate),d.doUpdate=setTimeout((function(){d.computeScale()&&c(20)}),100)}),a.on("markerAdded",this.resizeHandler),a.on("markerCleared",this.resizeHandler),!1!==b.listenForChanges&&a.on("changes",this.changeHandler=function(){c(250)})}a.defineExtension("annotateScrollbar",(function(a){return"string"==typeof a&&(a={className:a}),new b(this,a)})),a.defineOption("scrollButtonHeight",0),b.prototype.computeScale=function(){var a=this.cm,b=(a.getWrapperElement().clientHeight-a.display.barHeight-2*this.buttonHeight)/a.getScrollerElement().scrollHeight;if(b!=this.hScale)return this.hScale=b,!0},b.prototype.update=function(a){this.annotations=a,this.redraw()},b.prototype.redraw=function(a){function b(a,b){if(i!=a.line){i=a.line,j=c.getLineHandle(a.line);var d=c.getLineHandleVisualStart(j);d!=j&&(i=c.getLineNumber(d),j=d)}return j.widgets&&j.widgets.length||g&&j.height>h?c.charCoords(a,"local")[b?"top":"bottom"]:c.heightAtLine(j,"local")+(b?0:j.height)}!1!==a&&this.computeScale();var c=this.cm,d=this.hScale,e=document.createDocumentFragment(),f=this.annotations,g=c.getOption("lineWrapping"),h=g&&1.5*c.defaultTextHeight(),i=null,j=null,k=c.lastLine();if(c.display.barWidth)for(var l,m=0;m<f.length;m++){var n=f[m];if(!(n.to.line>k)){for(var o=l||b(n.from,!0)*d,p=b(n.to,!1)*d;m<f.length-1&&!(f[m+1].to.line>k)&&!((l=b(f[m+1].from,!0)*d)>p+.9);)n=f[++m],p=b(n.to,!1)*d;if(p!=o){var q=Math.max(p-o,3),r=e.appendChild(document.createElement("div"));r.style.cssText="position: absolute; right: 0px; width: "+Math.max(c.display.barWidth-1,2)+"px; top: "+(o+this.buttonHeight)+"px; height: "+q+"px",r.className=this.options.className,n.id&&r.setAttribute("annotation-id",n.id)}}}this.div.textContent="",this.div.appendChild(e)},b.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler),this.cm.off("markerAdded",this.resizeHandler),this.cm.off("markerCleared",this.resizeHandler),this.changeHandler&&this.cm.off("changes",this.changeHandler),
this.div.parentNode.removeChild(this.div)}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(b,c,d){function e(b){var c=a.wheelEventPixels(b)["horizontal"==f.orientation?"x":"y"],d=f.pos;f.moveTo(f.pos+c),f.pos!=d&&a.e_preventDefault(b)}this.orientation=c,this.scroll=d,this.screen=this.total=this.size=1,this.pos=0,this.node=document.createElement("div"),this.node.className=b+"-"+c,this.inner=this.node.appendChild(document.createElement("div"));var f=this;a.on(this.inner,"mousedown",(function(b){function c(){a.off(document,"mousemove",d),a.off(document,"mouseup",c)}function d(a){if(1!=a.which)return c();f.moveTo(h+(a[e]-g)*(f.total/f.size))}if(1==b.which){a.e_preventDefault(b);var e="horizontal"==f.orientation?"pageX":"pageY",g=b[e],h=f.pos;a.on(document,"mousemove",d),a.on(document,"mouseup",c)}})),a.on(this.node,"click",(function(b){a.e_preventDefault(b);var c,d=f.inner.getBoundingClientRect();c="horizontal"==f.orientation?b.clientX<d.left?-1:b.clientX>d.right?1:0:b.clientY<d.top?-1:b.clientY>d.bottom?1:0,f.moveTo(f.pos+c*f.screen)})),a.on(this.node,"mousewheel",e),a.on(this.node,"DOMMouseScroll",e)}function c(a,c,d){this.addClass=a,this.horiz=new b(a,"horizontal",d),c(this.horiz.node),this.vert=new b(a,"vertical",d),c(this.vert.node),this.width=null}b.prototype.setPos=function(a,b){return a<0&&(a=0),a>this.total-this.screen&&(a=this.total-this.screen),!(!b&&a==this.pos)&&(this.pos=a,this.inner.style["horizontal"==this.orientation?"left":"top"]=a*(this.size/this.total)+"px",!0)},b.prototype.moveTo=function(a){this.setPos(a)&&this.scroll(a,this.orientation)};b.prototype.update=function(a,b,c){var d=this.screen!=b||this.total!=a||this.size!=c;d&&(this.screen=b,this.total=a,this.size=c);var e=this.screen*(this.size/this.total);e<10&&(this.size-=10-e,e=10),this.inner.style["horizontal"==this.orientation?"width":"height"]=e+"px",this.setPos(this.pos,d)},c.prototype.update=function(a){if(null==this.width){var b=window.getComputedStyle?window.getComputedStyle(this.horiz.node):this.horiz.node.currentStyle;b&&(this.width=parseInt(b.height))}var c=this.width||0,d=a.scrollWidth>a.clientWidth+1,e=a.scrollHeight>a.clientHeight+1;return this.vert.node.style.display=e?"block":"none",this.horiz.node.style.display=d?"block":"none",e&&(this.vert.update(a.scrollHeight,a.clientHeight,a.viewHeight-(d?c:0)),this.vert.node.style.bottom=d?c+"px":"0"),d&&(this.horiz.update(a.scrollWidth,a.clientWidth,a.viewWidth-(e?c:0)-a.barLeft),this.horiz.node.style.right=e?c+"px":"0",this.horiz.node.style.left=a.barLeft+"px"),{right:e?c:0,bottom:d?c:0}},c.prototype.setScrollTop=function(a){this.vert.setPos(a)},c.prototype.setScrollLeft=function(a){this.horiz.setPos(a)},c.prototype.clear=function(){var a=this.horiz.node.parentNode;a.removeChild(this.horiz.node),a.removeChild(this.vert.node)},a.scrollbarModel.simple=function(a,b){return new c("CodeMirror-simplescroll",a,b)},a.scrollbarModel.overlay=function(a,b){return new c("CodeMirror-overlayscroll",a,b)}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("./searchcursor"),require("../scroll/annotatescrollbar")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../scroll/annotatescrollbar"],a):a(CodeMirror)})((function(a){"use strict";function b(a,b,c,d){this.cm=a,this.options=d;var e={listenForChanges:!1};for(var f in d)e[f]=d[f];e.className||(e.className="CodeMirror-search-match"),this.annotation=a.annotateScrollbar(e),this.query=b,this.caseFold=c,this.gap={from:a.firstLine(),to:a.lastLine()+1},this.matches=[],this.update=null,this.findMatches(),this.annotation.update(this.matches);var g=this;a.on("change",this.changeHandler=function(a,b){g.onChange(b)})}function c(a,b,c){return a<=b?a:Math.max(b,a+c)}a.defineExtension("showMatchesOnScrollbar",(function(a,c,d){return"string"==typeof d&&(d={className:d}),d||(d={}),new b(this,a,c,d)}));b.prototype.findMatches=function(){if(this.gap){for(var b=0;b<this.matches.length;b++){var c=this.matches[b];if(c.from.line>=this.gap.to)break;c.to.line>=this.gap.from&&this.matches.splice(b--,1)}for(var d=this.cm.getSearchCursor(this.query,a.Pos(this.gap.from,0),{caseFold:this.caseFold,multiline:this.options.multiline}),e=this.options&&this.options.maxMatches||1e3;d.findNext();){var c={from:d.from(),to:d.to()};if(c.from.line>=this.gap.to)break;if(this.matches.splice(b++,0,c),this.matches.length>e)break}this.gap=null}},b.prototype.onChange=function(b){var d=b.from.line,e=a.changeEnd(b).line,f=e-b.to.line;if(this.gap?(this.gap.from=Math.min(c(this.gap.from,d,f),b.from.line),this.gap.to=Math.max(c(this.gap.to,d,f),b.from.line)):this.gap={from:b.from.line,to:e+1},f)for(var g=0;g<this.matches.length;g++){var h=this.matches[g],i=c(h.from.line,d,f);i!=h.from.line&&(h.from=a.Pos(i,h.from.ch));var j=c(h.to.line,d,f);j!=h.to.line&&(h.to=a.Pos(j,h.to.ch))}clearTimeout(this.update);var k=this;this.update=setTimeout((function(){k.updateAfterChange()}),250)},b.prototype.updateAfterChange=function(){this.findMatches(),this.annotation.update(this.matches)},b.prototype.clear=function(){this.cm.off("change",this.changeHandler),this.annotation.clear()}})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("./matchesonscrollbar")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./matchesonscrollbar"],a):a(CodeMirror)})((function(a){"use strict";function b(a){this.options={};for(var b in l)this.options[b]=(a&&a.hasOwnProperty(b)?a:l)[b];this.overlay=this.timeout=null,this.matchesonscroll=null,this.active=!1}function c(a){var b=a.state.matchHighlighter;(b.active||a.hasFocus())&&e(a,b)}function d(a){var b=a.state.matchHighlighter;b.active||(b.active=!0,e(a,b))}function e(a,b){clearTimeout(b.timeout),b.timeout=setTimeout((function(){h(a)}),b.options.delay)}function f(a,b,c,d){var e=a.state.matchHighlighter;if(a.addOverlay(e.overlay=k(b,c,d)),e.options.annotateScrollbar&&a.showMatchesOnScrollbar){var f=c?new RegExp((/\w/.test(b.charAt(0))?"\\b":"")+b.replace(/[\\\[.+*?(){|^$]/g,"\\$&")+(/\w/.test(b.charAt(b.length-1))?"\\b":"")):b;e.matchesonscroll=a.showMatchesOnScrollbar(f,!1,{className:"CodeMirror-selection-highlight-scrollbar"})}}function g(a){var b=a.state.matchHighlighter;b.overlay&&(a.removeOverlay(b.overlay),b.overlay=null,b.matchesonscroll&&(b.matchesonscroll.clear(),b.matchesonscroll=null))}function h(a){a.operation((function(){var b=a.state.matchHighlighter;if(g(a),!a.somethingSelected()&&b.options.showToken){for(var c=!0===b.options.showToken?/[\w$]/:b.options.showToken,d=a.getCursor(),e=a.getLine(d.line),h=d.ch,j=h;h&&c.test(e.charAt(h-1));)--h;for(;j<e.length&&c.test(e.charAt(j));)++j;return void(h<j&&f(a,e.slice(h,j),c,b.options.style))}var k=a.getCursor("from"),l=a.getCursor("to");if(k.line==l.line&&(!b.options.wordsOnly||i(a,k,l))){var m=a.getRange(k,l);b.options.trim&&(m=m.replace(/^\s+|\s+$/g,"")),m.length>=b.options.minChars&&f(a,m,!1,b.options.style)}}))}function i(a,b,c){if(null!==a.getRange(b,c).match(/^\w+$/)){if(b.ch>0){var d={line:b.line,ch:b.ch-1},e=a.getRange(d,b);if(null===e.match(/\W/))return!1}if(c.ch<a.getLine(b.line).length){var d={line:c.line,ch:c.ch+1},e=a.getRange(c,d);if(null===e.match(/\W/))return!1}return!0}return!1}function j(a,b){return!(a.start&&b.test(a.string.charAt(a.start-1))||a.pos!=a.string.length&&b.test(a.string.charAt(a.pos)))}function k(a,b,c){return{token:function(d){if(d.match(a)&&(!b||j(d,b)))return c;d.next(),d.skipTo(a.charAt(0))||d.skipToEnd()}}}var l={style:"matchhighlight",minChars:2,delay:100,wordsOnly:!1,annotateScrollbar:!1,showToken:!1,trim:!0};a.defineOption("highlightSelectionMatches",!1,(function(e,f,i){if(i&&i!=a.Init&&(g(e),clearTimeout(e.state.matchHighlighter.timeout),e.state.matchHighlighter=null,e.off("cursorActivity",c),e.off("focus",d)),f){var j=e.state.matchHighlighter=new b(f);e.hasFocus()?(j.active=!0,h(e)):e.on("focus",d),e.on("cursorActivity",c)}}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(a){var b=a.flags;return null!=b?b:(a.ignoreCase?"i":"")+(a.global?"g":"")+(a.multiline?"m":"")}function c(a,c){for(var d=b(a),e=d,f=0;f<c.length;f++)-1==e.indexOf(c.charAt(f))&&(e+=c.charAt(f));return d==e?a:new RegExp(a.source,e)}function d(a){return/\\s|\\n|\n|\\W|\\D|\[\^/.test(a.source)}function e(a,b,d){b=c(b,"g");for(var e=d.line,f=d.ch,g=a.lastLine();e<=g;e++,f=0){b.lastIndex=f;var h=a.getLine(e),i=b.exec(h);if(i)return{from:p(e,i.index),to:p(e,i.index+i[0].length),match:i}}}function f(a,b,f){if(!d(b))return e(a,b,f);b=c(b,"gm");for(var g,h=1,i=f.line,j=a.lastLine();i<=j;){for(var k=0;k<h&&!(i>j);k++){var l=a.getLine(i++);g=null==g?l:g+"\n"+l}h*=2,b.lastIndex=f.ch;var m=b.exec(g);if(m){var n=g.slice(0,m.index).split("\n"),o=m[0].split("\n"),q=f.line+n.length-1,r=n[n.length-1].length;return{from:p(q,r),to:p(q+o.length-1,1==o.length?r+o[0].length:o[o.length-1].length),match:m}}}}function g(a,b,c){for(var d,e=0;e<=a.length;){b.lastIndex=e;var f=b.exec(a);if(!f)break;var g=f.index+f[0].length;if(g>a.length-c)break;(!d||g>d.index+d[0].length)&&(d=f),e=f.index+1}return d}function h(a,b,d){b=c(b,"g");for(var e=d.line,f=d.ch,h=a.firstLine();e>=h;e--,f=-1){var i=a.getLine(e),j=g(i,b,f<0?0:i.length-f);if(j)return{from:p(e,j.index),to:p(e,j.index+j[0].length),match:j}}}function i(a,b,e){if(!d(b))return h(a,b,e);b=c(b,"gm");for(var f,i=1,j=a.getLine(e.line).length-e.ch,k=e.line,l=a.firstLine();k>=l;){for(var m=0;m<i&&k>=l;m++){var n=a.getLine(k--);f=null==f?n:n+"\n"+f}i*=2;var o=g(f,b,j);if(o){var q=f.slice(0,o.index).split("\n"),r=o[0].split("\n"),s=k+q.length,t=q[q.length-1].length;return{from:p(s,t),to:p(s+r.length-1,1==r.length?t+r[0].length:r[r.length-1].length),match:o}}}}function j(a,b,c,d){if(a.length==b.length)return c;for(var e=0,f=c+Math.max(0,a.length-b.length);;){if(e==f)return e;var g=e+f>>1,h=d(a.slice(0,g)).length;if(h==c)return g;h>c?f=g:e=g+1}}function k(a,b,c,d){if(!b.length)return null;var e=d?n:o,f=e(b).split(/\r|\n\r?/);a:for(var g=c.line,h=c.ch,i=a.lastLine()+1-f.length;g<=i;g++,h=0){var k=a.getLine(g).slice(h),l=e(k);if(1==f.length){var m=l.indexOf(f[0]);if(-1==m)continue a;var c=j(k,l,m,e)+h;return{from:p(g,j(k,l,m,e)+h),to:p(g,j(k,l,m+f[0].length,e)+h)}}var q=l.length-f[0].length;if(l.slice(q)==f[0]){for(var r=1;r<f.length-1;r++)if(e(a.getLine(g+r))!=f[r])continue a;var s=a.getLine(g+f.length-1),t=e(s),u=f[f.length-1];if(t.slice(0,u.length)==u)return{from:p(g,j(k,l,q,e)+h),to:p(g+f.length-1,j(s,t,u.length,e))}}}}function l(a,b,c,d){if(!b.length)return null;var e=d?n:o,f=e(b).split(/\r|\n\r?/);a:for(var g=c.line,h=c.ch,i=a.firstLine()-1+f.length;g>=i;g--,h=-1){var k=a.getLine(g);h>-1&&(k=k.slice(0,h));var l=e(k);if(1==f.length){var m=l.lastIndexOf(f[0]);if(-1==m)continue a;return{from:p(g,j(k,l,m,e)),to:p(g,j(k,l,m+f[0].length,e))}}var q=f[f.length-1];if(l.slice(0,q.length)==q){for(var r=1,c=g-f.length+1;r<f.length-1;r++)if(e(a.getLine(c+r))!=f[r])continue a;var s=a.getLine(g+1-f.length),t=e(s);if(t.slice(t.length-f[0].length)==f[0])return{from:p(g+1-f.length,j(s,t,s.length-f[0].length,e)),to:p(g,j(k,l,q.length,e))}}}}function m(a,b,d,g){this.atOccurrence=!1,this.doc=a,d=d?a.clipPos(d):p(0,0),this.pos={from:d,to:d};var j;"object"==typeof g?j=g.caseFold:(j=g,g=null),"string"==typeof b?(null==j&&(j=!1),this.matches=function(c,d){return(c?l:k)(a,b,d,j)}):(b=c(b,"gm"),g&&!1===g.multiline?this.matches=function(c,d){return(c?h:e)(a,b,d)}:this.matches=function(c,d){return(c?i:f)(a,b,d)})}var n,o,p=a.Pos;String.prototype.normalize?(n=function(a){return a.normalize("NFD").toLowerCase()},o=function(a){return a.normalize("NFD")}):(n=function(a){return a.toLowerCase()},o=function(a){return a}),m.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(b){for(var c=this.matches(b,this.doc.clipPos(b?this.pos.from:this.pos.to));c&&0==a.cmpPos(c.from,c.to);)b?c.from.ch?c.from=p(c.from.line,c.from.ch-1):c=c.from.line==this.doc.firstLine()?null:this.matches(b,this.doc.clipPos(p(c.from.line-1))):c.to.ch<this.doc.getLine(c.to.line).length?c.to=p(c.to.line,c.to.ch+1):c=c.to.line==this.doc.lastLine()?null:this.matches(b,p(c.to.line+1,0));if(c)return this.pos=c,this.atOccurrence=!0,this.pos.match||!0;var d=p(b?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:d,to:d},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(b,c){if(this.atOccurrence){var d=a.splitLines(b);this.doc.replaceRange(d,this.pos.from,this.pos.to,c),this.pos.to=p(this.pos.from.line+d.length-1,d[d.length-1].length+(1==d.length?this.pos.from.ch:0))}}},a.defineExtension("getSearchCursor",(function(a,b,c){return new m(this.doc,a,b,c)})),a.defineDocExtension("getSearchCursor",(function(a,b,c){return new m(this,a,b,c)})),a.defineExtension("selectMatches",(function(b,c){for(var d=[],e=this.getSearchCursor(b,this.getCursor("from"),c);e.findNext()&&!(a.cmpPos(e.to(),this.getCursor("to"))>0);)d.push({anchor:e.from(),head:e.to()});d.length&&this.setSelections(d,0)}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";function b(a){for(var b=0;b<a.state.activeLines.length;b++)a.removeLineClass(a.state.activeLines[b],"wrap",f),a.removeLineClass(a.state.activeLines[b],"background",g),a.removeLineClass(a.state.activeLines[b],"gutter",h)}function c(a,b){if(a.length!=b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return!1;return!0}function d(a,d){for(var e=[],i=0;i<d.length;i++){var j=d[i],k=a.getOption("styleActiveLine");if("object"==typeof k&&k.nonEmpty?j.anchor.line==j.head.line:j.empty()){var l=a.getLineHandleVisualStart(j.head.line);e[e.length-1]!=l&&e.push(l)}}c(a.state.activeLines,e)||a.operation((function(){b(a);for(var c=0;c<e.length;c++)a.addLineClass(e[c],"wrap",f),a.addLineClass(e[c],"background",g),a.addLineClass(e[c],"gutter",h);a.state.activeLines=e}))}function e(a,b){d(a,b.ranges)}var f="CodeMirror-activeline",g="CodeMirror-activeline-background",h="CodeMirror-activeline-gutter";a.defineOption("styleActiveLine",!1,(function(c,f,g){var h=g!=a.Init&&g;f!=h&&(h&&(c.off("beforeSelectionChange",e),b(c),delete c.state.activeLines),f&&(c.state.activeLines=[],d(c,c.listSelections()),c.on("beforeSelectionChange",e)))}))})),(function(a){"object"==typeof exports&&"object"==typeof module?a(require("../lib/codemirror")):"function"==typeof define&&define.amd?define(["../lib/codemirror"],a):a(CodeMirror)})((function(a){"use strict";a.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-encrypted","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["asc","pgp","sig"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h","ino"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp","cs"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists\.txt$/},{name:"CoffeeScript",mimes:["application/vnd.coffeescript","text/coffeescript","text/x-coffeescript"],mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded JavaScript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Esper",mime:"text/x-esper",mode:"sql"},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90","f95"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history)\.md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"],file:/^Jenkinsfile$/},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm","handlebars","hbs"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Pug",mime:"text/x-pug",mode:"pug",ext:["jade","pug"],alias:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"text/jinja2",mode:"jinja2",ext:["j2","jinja","jinja2"]},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb","wl","wls"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"mbox",mime:"application/mbox",mode:"mbox",ext:["mbox"]},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mimes:["application/n-triples","application/n-quads","text/n-triples"],mode:"ntriples",ext:["nt","nq"]},{name:"Objective-C",mime:"text/x-objectivec",mode:"clike",ext:["m"],alias:["objective-c","objc"]},{name:"Objective-C++",mime:"text/x-objectivec++",mode:"clike",ext:["mm"],alias:["objective-c++","objc++"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mimes:["text/x-php","application/x-httpd-php","application/x-httpd-php-open"],mode:"php",ext:["php","php3","php4","php5","php7","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"PostgreSQL",mime:"text/x-pgsql",mode:"sql"},{name:"PowerShell",mime:"application/x-powershell",mode:"powershell",ext:["ps1","psd1","psm1"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["BUILD","bzl","py","pyw"],file:/^(BUCK|BUILD)$/},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r","R"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"SAS",mime:"text/x-sas",mode:"sas",ext:["sas"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mimes:["text/x-sh","application/x-sh"],mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"SML",mime:"text/x-sml",mode:"mllike",ext:["sml","sig","fun","smackspec"]},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"SQLite",mime:"text/x-sqlite",mode:"sql"},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Stylus",mime:"text/x-styl",mode:"stylus",ext:["styl"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx","tex"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v","sv","svh"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"TypeScript-JSX",mime:"text/typescript-jsx",mode:"jsx",ext:["tsx"],alias:["tsx"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"Web IDL",mime:"text/x-webidl",mode:"webidl",ext:["webidl"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"Vue.js Component",mimes:["script/x-vue","text/x-vue"],mode:"vue",ext:["vue"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd","svg"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"Yacas",mime:"text/x-yacas",mode:"yacas",ext:["ys"]},{name:"YAML",mimes:["text/x-yaml","text/yaml"],mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]},{name:"WebAssembly",mime:"text/webassembly",mode:"wast",ext:["wat","wast"]}];for(var b=0;b<a.modeInfo.length;b++){var c=a.modeInfo[b];c.mimes&&(c.mime=c.mimes[0])}a.findModeByMIME=function(b){b=b.toLowerCase();for(var c=0;c<a.modeInfo.length;c++){var d=a.modeInfo[c];if(d.mime==b)return d;if(d.mimes)for(var e=0;e<d.mimes.length;e++)if(d.mimes[e]==b)return d}return/\+xml$/.test(b)?a.findModeByMIME("application/xml"):/\+json$/.test(b)?a.findModeByMIME("application/json"):void 0},a.findModeByExtension=function(b){b=b.toLowerCase();for(var c=0;c<a.modeInfo.length;c++){var d=a.modeInfo[c];if(d.ext)for(var e=0;e<d.ext.length;e++)if(d.ext[e]==b)return d}},a.findModeByFileName=function(b){for(var c=0;c<a.modeInfo.length;c++){var d=a.modeInfo[c];if(d.file&&d.file.test(b))return d}var e=b.lastIndexOf("."),f=e>-1&&b.substring(e+1,b.length);if(f)return a.findModeByExtension(f)},a.findModeByName=function(b){b=b.toLowerCase();for(var c=0;c<a.modeInfo.length;c++){var d=a.modeInfo[c];if(d.name.toLowerCase()==b)return d;if(d.alias)for(var e=0;e<d.alias.length;e++)if(d.alias[e].toLowerCase()==b)return d}}}));addons.js000060400000330046152455704320006363 0ustar00// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
    if (old == CodeMirror.Init) old = false;
    if (!old == !val) return;
    if (val) setFullscreen(cm);
    else setNormal(cm);
  });

  function setFullscreen(cm) {
    var wrap = cm.getWrapperElement();
    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
                                  width: wrap.style.width, height: wrap.style.height};
    wrap.style.width = "";
    wrap.style.height = "auto";
    wrap.className += " CodeMirror-fullscreen";
    document.documentElement.style.overflow = "hidden";
    cm.refresh();
  }

  function setNormal(cm) {
    var wrap = cm.getWrapperElement();
    wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
    document.documentElement.style.overflow = "";
    var info = cm.state.fullScreenRestore;
    wrap.style.width = info.width; wrap.style.height = info.height;
    window.scrollTo(info.scrollLeft, info.scrollTop);
    cm.refresh();
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function (mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function (CodeMirror) {
  CodeMirror.defineExtension("addPanel", function (node, options) {
    options = options || {};

    if (!this.state.panels) initPanels(this);

    var info = this.state.panels;
    var wrapper = info.wrapper;
    var cmWrapper = this.getWrapperElement();
    var replace = options.replace instanceof Panel && !options.replace.cleared;

    if (options.after instanceof Panel && !options.after.cleared) {
      wrapper.insertBefore(node, options.before.node.nextSibling);
    } else if (options.before instanceof Panel && !options.before.cleared) {
      wrapper.insertBefore(node, options.before.node);
    } else if (replace) {
      wrapper.insertBefore(node, options.replace.node);
      options.replace.clear(true);
    } else if (options.position == "bottom") {
      wrapper.appendChild(node);
    } else if (options.position == "before-bottom") {
      wrapper.insertBefore(node, cmWrapper.nextSibling);
    } else if (options.position == "after-top") {
      wrapper.insertBefore(node, cmWrapper);
    } else {
      wrapper.insertBefore(node, wrapper.firstChild);
    }

    var height = (options && options.height) || node.offsetHeight;

    var panel = new Panel(this, node, options, height);
    info.panels.push(panel);

    this.setSize();
    if (options.stable && isAtTop(this, node))
      this.scrollTo(null, this.getScrollInfo().top + height);

    return panel;
  });

  function Panel(cm, node, options, height) {
    this.cm = cm;
    this.node = node;
    this.options = options;
    this.height = height;
    this.cleared = false;
  }

  /* when skipRemove is true, clear() was called from addPanel().
   * Thus removePanels() should not be called (issue 5518) */
  Panel.prototype.clear = function (skipRemove) {
    if (this.cleared) return;
    this.cleared = true;
    var info = this.cm.state.panels;
    info.panels.splice(info.panels.indexOf(this), 1);
    this.cm.setSize();
    if (this.options.stable && isAtTop(this.cm, this.node))
      this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)
    info.wrapper.removeChild(this.node);
    if (info.panels.length == 0 && !skipRemove) removePanels(this.cm);
  };

  Panel.prototype.changed = function () {
    this.height = this.node.getBoundingClientRect().height;
    this.cm.setSize();
  };

  function initPanels(cm) {
    var wrap = cm.getWrapperElement()
    var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
    var height = parseInt(style.height);
    var info = cm.state.panels = {
      setHeight: wrap.style.height,
      panels: [],
      wrapper: document.createElement("div")
    };
    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
    wrap.parentNode.insertBefore(info.wrapper, wrap);
    info.wrapper.appendChild(wrap);
    cm.scrollTo(scrollPos.left, scrollPos.top)
    if (hasFocus) cm.focus();

    cm._setSize = cm.setSize;
    if (height != null) cm.setSize = function (width, newHeight) {
      if (!newHeight) newHeight = info.wrapper.offsetHeight;
      info.setHeight = newHeight;
      if (typeof newHeight != "number") {
        var px = /^(\d+\.?\d*)px$/.exec(newHeight);
        if (px) {
          newHeight = Number(px[1]);
        } else {
          info.wrapper.style.height = newHeight;
          newHeight = info.wrapper.offsetHeight;
        }
      }
      var editorheight = newHeight - info.panels
        .map(function (p) { return p.node.getBoundingClientRect().height; })
        .reduce(function (a, b) { return a + b; }, 0);
      cm._setSize(width, editorheight);
      height = newHeight;
    };
  }

  function removePanels(cm) {
    var info = cm.state.panels;
    cm.state.panels = null;

    var wrap = cm.getWrapperElement()
    var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
    info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
    cm.scrollTo(scrollPos.left, scrollPos.top)
    if (hasFocus) cm.focus();
    wrap.style.height = info.setHeight;
    cm.setSize = cm._setSize;
    cm.setSize();
  }

  function isAtTop(cm, dom) {
    for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)
      if (sibling == cm.getWrapperElement()) return true
    return false
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  var defaults = {
    pairs: "()[]{}''\"\"",
    closeBefore: ")]}'\":;>",
    triples: "",
    explode: "[]{}"
  };

  var Pos = CodeMirror.Pos;

  CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
    if (old && old != CodeMirror.Init) {
      cm.removeKeyMap(keyMap);
      cm.state.closeBrackets = null;
    }
    if (val) {
      ensureBound(getOption(val, "pairs"))
      cm.state.closeBrackets = val;
      cm.addKeyMap(keyMap);
    }
  });

  function getOption(conf, name) {
    if (name == "pairs" && typeof conf == "string") return conf;
    if (typeof conf == "object" && conf[name] != null) return conf[name];
    return defaults[name];
  }

  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
  function ensureBound(chars) {
    for (var i = 0; i < chars.length; i++) {
      var ch = chars.charAt(i), key = "'" + ch + "'"
      if (!keyMap[key]) keyMap[key] = handler(ch)
    }
  }
  ensureBound(defaults.pairs + "`")

  function handler(ch) {
    return function(cm) { return handleChar(cm, ch); };
  }

  function getConfig(cm) {
    var deflt = cm.state.closeBrackets;
    if (!deflt || deflt.override) return deflt;
    var mode = cm.getModeAt(cm.getCursor());
    return mode.closeBrackets || deflt;
  }

  function handleBackspace(cm) {
    var conf = getConfig(cm);
    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;

    var pairs = getOption(conf, "pairs");
    var ranges = cm.listSelections();
    for (var i = 0; i < ranges.length; i++) {
      if (!ranges[i].empty()) return CodeMirror.Pass;
      var around = charsAround(cm, ranges[i].head);
      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
    }
    for (var i = ranges.length - 1; i >= 0; i--) {
      var cur = ranges[i].head;
      cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
    }
  }

  function handleEnter(cm) {
    var conf = getConfig(cm);
    var explode = conf && getOption(conf, "explode");
    if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;

    var ranges = cm.listSelections();
    for (var i = 0; i < ranges.length; i++) {
      if (!ranges[i].empty()) return CodeMirror.Pass;
      var around = charsAround(cm, ranges[i].head);
      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
    }
    cm.operation(function() {
      var linesep = cm.lineSeparator() || "\n";
      cm.replaceSelection(linesep + linesep, null);
      moveSel(cm, -1)
      ranges = cm.listSelections();
      for (var i = 0; i < ranges.length; i++) {
        var line = ranges[i].head.line;
        cm.indentLine(line, null, true);
        cm.indentLine(line + 1, null, true);
      }
    });
  }

  function moveSel(cm, dir) {
    var newRanges = [], ranges = cm.listSelections(), primary = 0
    for (var i = 0; i < ranges.length; i++) {
      var range = ranges[i]
      if (range.head == cm.getCursor()) primary = i
      var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1}
      newRanges.push({anchor: pos, head: pos})
    }
    cm.setSelections(newRanges, primary)
  }

  function contractSelection(sel) {
    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
  }

  function handleChar(cm, ch) {
    var conf = getConfig(cm);
    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;

    var pairs = getOption(conf, "pairs");
    var pos = pairs.indexOf(ch);
    if (pos == -1) return CodeMirror.Pass;

    var closeBefore = getOption(conf,"closeBefore");

    var triples = getOption(conf, "triples");

    var identical = pairs.charAt(pos + 1) == ch;
    var ranges = cm.listSelections();
    var opening = pos % 2 == 0;

    var type;
    for (var i = 0; i < ranges.length; i++) {
      var range = ranges[i], cur = range.head, curType;
      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
      if (opening && !range.empty()) {
        curType = "surround";
      } else if ((identical || !opening) && next == ch) {
        if (identical && stringStartsAfter(cm, cur))
          curType = "both";
        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
          curType = "skipThree";
        else
          curType = "skip";
      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {
        if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;
        curType = "addFour";
      } else if (identical) {
        var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur)
        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";
        else return CodeMirror.Pass;
      } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) {
        curType = "both";
      } else {
        return CodeMirror.Pass;
      }
      if (!type) type = curType;
      else if (type != curType) return CodeMirror.Pass;
    }

    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
    var right = pos % 2 ? ch : pairs.charAt(pos + 1);
    cm.operation(function() {
      if (type == "skip") {
        moveSel(cm, 1)
      } else if (type == "skipThree") {
        moveSel(cm, 3)
      } else if (type == "surround") {
        var sels = cm.getSelections();
        for (var i = 0; i < sels.length; i++)
          sels[i] = left + sels[i] + right;
        cm.replaceSelections(sels, "around");
        sels = cm.listSelections().slice();
        for (var i = 0; i < sels.length; i++)
          sels[i] = contractSelection(sels[i]);
        cm.setSelections(sels);
      } else if (type == "both") {
        cm.replaceSelection(left + right, null);
        cm.triggerElectric(left + right);
        moveSel(cm, -1)
      } else if (type == "addFour") {
        cm.replaceSelection(left + left + left + left, "before");
        moveSel(cm, 1)
      }
    });
  }

  function charsAround(cm, pos) {
    var str = cm.getRange(Pos(pos.line, pos.ch - 1),
                          Pos(pos.line, pos.ch + 1));
    return str.length == 2 ? str : null;
  }

  function stringStartsAfter(cm, pos) {
    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))
    return /\bstring/.test(token.type) && token.start == pos.ch &&
      (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos)))
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

/**
 * Tag-closer extension for CodeMirror.
 *
 * This extension adds an "autoCloseTags" option that can be set to
 * either true to get the default behavior, or an object to further
 * configure its behavior.
 *
 * These are supported options:
 *
 * `whenClosing` (default true)
 *   Whether to autoclose when the '/' of a closing tag is typed.
 * `whenOpening` (default true)
 *   Whether to autoclose the tag when the final '>' of an opening
 *   tag is typed.
 * `dontCloseTags` (default is empty tags for HTML, none for XML)
 *   An array of tag names that should not be autoclosed.
 * `indentTags` (default is block tags for HTML, none for XML)
 *   An array of tag names that should, when opened, cause a
 *   blank line to be added inside the tag, and the blank line and
 *   closing line to be indented.
 * `emptyTags` (default is none)
 *   An array of XML tag names that should be autoclosed with '/>'.
 *
 * See demos/closetag.html for a usage example.
 */

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../fold/xml-fold"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
    if (old != CodeMirror.Init && old)
      cm.removeKeyMap("autoCloseTags");
    if (!val) return;
    var map = {name: "autoCloseTags"};
    if (typeof val != "object" || val.whenClosing !== false)
      map["'/'"] = function(cm) { return autoCloseSlash(cm); };
    if (typeof val != "object" || val.whenOpening !== false)
      map["'>'"] = function(cm) { return autoCloseGT(cm); };
    cm.addKeyMap(map);
  });

  var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
                       "source", "track", "wbr"];
  var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
                    "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];

  function autoCloseGT(cm) {
    if (cm.getOption("disableInput")) return CodeMirror.Pass;
    var ranges = cm.listSelections(), replacements = [];
    var opt = cm.getOption("autoCloseTags");
    for (var i = 0; i < ranges.length; i++) {
      if (!ranges[i].empty()) return CodeMirror.Pass;
      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
      var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)
      var tagName = tagInfo && tagInfo.name
      if (!tagName) return CodeMirror.Pass

      var html = inner.mode.configuration == "html";
      var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
      var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);

      if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
      var lowerTagName = tagName.toLowerCase();
      // Don't process the '>' at the end of an end-tag or self-closing tag
      if (!tagName ||
          tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
          tok.type == "tag" && tagInfo.close ||
          tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like <someTagName />
          dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
          closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))
        return CodeMirror.Pass;

      var emptyTags = typeof opt == "object" && opt.emptyTags;
      if (emptyTags && indexOf(emptyTags, tagName) > -1) {
        replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };
        continue;
      }

      var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
      replacements[i] = {indent: indent,
                         text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
                         newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
    }

    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose);
    for (var i = ranges.length - 1; i >= 0; i--) {
      var info = replacements[i];
      cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
      var sel = cm.listSelections().slice(0);
      sel[i] = {head: info.newPos, anchor: info.newPos};
      cm.setSelections(sel);
      if (!dontIndentOnAutoClose && info.indent) {
        cm.indentLine(info.newPos.line, null, true);
        cm.indentLine(info.newPos.line + 1, null, true);
      }
    }
  }

  function autoCloseCurrent(cm, typingSlash) {
    var ranges = cm.listSelections(), replacements = [];
    var head = typingSlash ? "/" : "</";
    var opt = cm.getOption("autoCloseTags");
    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnSlash);
    for (var i = 0; i < ranges.length; i++) {
      if (!ranges[i].empty()) return CodeMirror.Pass;
      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
      if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
                          tok.start != pos.ch - 1))
        return CodeMirror.Pass;
      // Kludge to get around the fact that we are not in XML mode
      // when completing in JS/CSS snippet in htmlmixed mode. Does not
      // work for other XML embedded languages (there is no general
      // way to go from a mixed mode to its current XML state).
      var replacement, mixed = inner.mode.name != "xml" && cm.getMode().name == "htmlmixed"
      if (mixed && inner.mode.name == "javascript") {
        replacement = head + "script";
      } else if (mixed && inner.mode.name == "css") {
        replacement = head + "style";
      } else {
        var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
        var top = context.length ? context[context.length - 1] : ""
        if (!context || (context.length && closingTagExists(cm, context, top, pos)))
          return CodeMirror.Pass;
        replacement = head + top
      }
      if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
      replacements[i] = replacement;
    }
    cm.replaceSelections(replacements);
    ranges = cm.listSelections();
    if (!dontIndentOnAutoClose) {
        for (var i = 0; i < ranges.length; i++)
            if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
                cm.indentLine(ranges[i].head.line);
    }
  }

  function autoCloseSlash(cm) {
    if (cm.getOption("disableInput")) return CodeMirror.Pass;
    return autoCloseCurrent(cm, true);
  }

  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };

  function indexOf(collection, elt) {
    if (collection.indexOf) return collection.indexOf(elt);
    for (var i = 0, e = collection.length; i < e; ++i)
      if (collection[i] == elt) return i;
    return -1;
  }

  // If xml-fold is loaded, we use its functionality to try and verify
  // whether a given tag is actually unclosed.
  function closingTagExists(cm, context, tagName, pos, newTag) {
    if (!CodeMirror.scanForClosingTag) return false;
    var end = Math.min(cm.lastLine() + 1, pos.line + 500);
    var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
    if (!nextClose || nextClose.tag != tagName) return false;
    // If the immediate wrapping context contains onCx instances of
    // the same tag, a closing tag only exists if there are at least
    // that many closing tags of that type following.
    var onCx = newTag ? 1 : 0
    for (var i = context.length - 1; i >= 0; i--) {
      if (context[i] == tagName) ++onCx
      else break
    }
    pos = nextClose.to;
    for (var i = 1; i < onCx; i++) {
      var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
      if (!next || next.tag != tagName) return false;
      pos = next.to;
    }
    return true;
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
    (document.documentMode == null || document.documentMode < 8);

  var Pos = CodeMirror.Pos;

  var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<", "<": ">>", ">": "<<"};

  function bracketRegex(config) {
    return config && config.bracketRegex || /[(){}[\]]/
  }

  function findMatchingBracket(cm, where, config) {
    var line = cm.getLineHandle(where.line), pos = where.ch - 1;
    var afterCursor = config && config.afterCursor
    if (afterCursor == null)
      afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)
    var re = bracketRegex(config)

    // A cursor is defined as between two characters, but in in vim command mode
    // (i.e. not insert mode), the cursor is visually represented as a
    // highlighted box on top of the 2nd character. Otherwise, we allow matches
    // from before or after the cursor.
    var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||
        re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];
    if (!match) return null;
    var dir = match.charAt(1) == ">" ? 1 : -1;
    if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));

    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config);
    if (found == null) return null;
    return {from: Pos(where.line, pos), to: found && found.pos,
            match: found && found.ch == match.charAt(0), forward: dir > 0};
  }

  // bracketRegex is used to specify which type of bracket to scan
  // should be a regexp, e.g. /[[\]]/
  //
  // Note: If "where" is on an open bracket, then this bracket is ignored.
  //
  // Returns false when no bracket was found, null when it reached
  // maxScanLines and gave up
  function scanForBracket(cm, where, dir, style, config) {
    var maxScanLen = (config && config.maxScanLineLength) || 10000;
    var maxScanLines = (config && config.maxScanLines) || 1000;

    var stack = [];
    var re = bracketRegex(config)
    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);
    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
      var line = cm.getLine(lineNo);
      if (!line) continue;
      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
      if (line.length > maxScanLen) continue;
      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
      for (; pos != end; pos += dir) {
        var ch = line.charAt(pos);
        if (re.test(ch) && (style === undefined ||
                            (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) {
          var match = matching[ch];
          if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
          else stack.pop();
        }
      }
    }
    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
  }

  function matchBrackets(cm, autoclear, config) {
    // Disable brace matching in long lines, since it'll cause hugely slow updates
    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000,
      highlightNonMatching = config && config.highlightNonMatching;
    var marks = [], ranges = cm.listSelections();
    for (var i = 0; i < ranges.length; i++) {
      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
      if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) {
        var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));
      }
    }

    if (marks.length) {
      // Kludge to work around the IE bug from issue #1193, where text
      // input stops going to the textarea whenever this fires.
      if (ie_lt8 && cm.state.focused) cm.focus();

      var clear = function() {
        cm.operation(function() {
          for (var i = 0; i < marks.length; i++) marks[i].clear();
        });
      };
      if (autoclear) setTimeout(clear, 800);
      else return clear;
    }
  }

  function doMatchBrackets(cm) {
    cm.operation(function() {
      if (cm.state.matchBrackets.currentlyHighlighted) {
        cm.state.matchBrackets.currentlyHighlighted();
        cm.state.matchBrackets.currentlyHighlighted = null;
      }
      cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
    });
  }

  function clearHighlighted(cm) {
    if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {
      cm.state.matchBrackets.currentlyHighlighted();
      cm.state.matchBrackets.currentlyHighlighted = null;
    }
  }

  CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
    if (old && old != CodeMirror.Init) {
      cm.off("cursorActivity", doMatchBrackets);
      cm.off("focus", doMatchBrackets)
      cm.off("blur", clearHighlighted)
      clearHighlighted(cm);
    }
    if (val) {
      cm.state.matchBrackets = typeof val == "object" ? val : {};
      cm.on("cursorActivity", doMatchBrackets);
      cm.on("focus", doMatchBrackets)
      cm.on("blur", clearHighlighted)
    }
  });

  CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
  CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig){
    // Backwards-compatibility kludge
    if (oldConfig || typeof config == "boolean") {
      if (!oldConfig) {
        config = config ? {strict: true} : null
      } else {
        oldConfig.strict = config
        config = oldConfig
      }
    }
    return findMatchingBracket(this, pos, config)
  });
  CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){
    return scanForBracket(this, pos, dir, style, config);
  });
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../fold/xml-fold"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
    if (old && old != CodeMirror.Init) {
      cm.off("cursorActivity", doMatchTags);
      cm.off("viewportChange", maybeUpdateMatch);
      clear(cm);
    }
    if (val) {
      cm.state.matchBothTags = typeof val == "object" && val.bothTags;
      cm.on("cursorActivity", doMatchTags);
      cm.on("viewportChange", maybeUpdateMatch);
      doMatchTags(cm);
    }
  });

  function clear(cm) {
    if (cm.state.tagHit) cm.state.tagHit.clear();
    if (cm.state.tagOther) cm.state.tagOther.clear();
    cm.state.tagHit = cm.state.tagOther = null;
  }

  function doMatchTags(cm) {
    cm.state.failedTagMatch = false;
    cm.operation(function() {
      clear(cm);
      if (cm.somethingSelected()) return;
      var cur = cm.getCursor(), range = cm.getViewport();
      range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);
      var match = CodeMirror.findMatchingTag(cm, cur, range);
      if (!match) return;
      if (cm.state.matchBothTags) {
        var hit = match.at == "open" ? match.open : match.close;
        if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"});
      }
      var other = match.at == "close" ? match.open : match.close;
      if (other)
        cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"});
      else
        cm.state.failedTagMatch = true;
    });
  }

  function maybeUpdateMatch(cm) {
    if (cm.state.failedTagMatch) doMatchTags(cm);
  }

  CodeMirror.commands.toMatchingTag = function(cm) {
    var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
    if (found) {
      var other = found.at == "close" ? found.open : found.close;
      if (other) cm.extendSelection(other.to, other.from);
    }
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.registerHelper("fold", "brace", function(cm, start) {
  var line = start.line, lineText = cm.getLine(line);
  var tokenType;

  function findOpening(openCh) {
    for (var at = start.ch, pass = 0;;) {
      var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
      if (found == -1) {
        if (pass == 1) break;
        pass = 1;
        at = lineText.length;
        continue;
      }
      if (pass == 1 && found < start.ch) break;
      tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
      if (!/^(comment|string)/.test(tokenType)) return found + 1;
      at = found - 1;
    }
  }

  var startBrace = findOpening("{"), startBracket = findOpening("[")
  var startToken, endToken, startCh
  if (startBrace != null && (startBracket == null || startBracket > startBrace)) {
    startCh = startBrace; startToken = "{"; endToken = "}"
  } else if (startBracket != null) {
    startCh = startBracket; startToken = "["; endToken = "]"
  } else {
    return
  }

  var count = 1, lastLine = cm.lastLine(), end, endCh;
  outer: for (var i = line; i <= lastLine; ++i) {
    var text = cm.getLine(i), pos = i == line ? startCh : 0;
    for (;;) {
      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
      if (nextOpen < 0) nextOpen = text.length;
      if (nextClose < 0) nextClose = text.length;
      pos = Math.min(nextOpen, nextClose);
      if (pos == text.length) break;
      if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
        if (pos == nextOpen) ++count;
        else if (!--count) { end = i; endCh = pos; break outer; }
      }
      ++pos;
    }
  }
  if (end == null || line == end) return;
  return {from: CodeMirror.Pos(line, startCh),
          to: CodeMirror.Pos(end, endCh)};
});

CodeMirror.registerHelper("fold", "import", function(cm, start) {
  function hasImport(line) {
    if (line < cm.firstLine() || line > cm.lastLine()) return null;
    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
    if (start.type != "keyword" || start.string != "import") return null;
    // Now find closing semicolon, return its position
    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
      var text = cm.getLine(i), semi = text.indexOf(";");
      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
    }
  }

  var startLine = start.line, has = hasImport(startLine), prev;
  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
    return null;
  for (var end = has.end;;) {
    var next = hasImport(end.line + 1);
    if (next == null) break;
    end = next.end;
  }
  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
});

CodeMirror.registerHelper("fold", "include", function(cm, start) {
  function hasInclude(line) {
    if (line < cm.firstLine() || line > cm.lastLine()) return null;
    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
    if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
  }

  var startLine = start.line, has = hasInclude(startLine);
  if (has == null || hasInclude(startLine - 1) != null) return null;
  for (var end = startLine;;) {
    var next = hasInclude(end + 1);
    if (next == null) break;
    ++end;
  }
  return {from: CodeMirror.Pos(startLine, has + 1),
          to: cm.clipPos(CodeMirror.Pos(end))};
});

});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function doFold(cm, pos, options, force) {
    if (options && options.call) {
      var finder = options;
      options = null;
    } else {
      var finder = getOption(cm, options, "rangeFinder");
    }
    if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
    var minSize = getOption(cm, options, "minFoldSize");

    function getRange(allowFolded) {
      var range = finder(cm, pos);
      if (!range || range.to.line - range.from.line < minSize) return null;
      var marks = cm.findMarksAt(range.from);
      for (var i = 0; i < marks.length; ++i) {
        if (marks[i].__isFold && force !== "fold") {
          if (!allowFolded) return null;
          range.cleared = true;
          marks[i].clear();
        }
      }
      return range;
    }

    var range = getRange(true);
    if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) {
      pos = CodeMirror.Pos(pos.line - 1, 0);
      range = getRange(false);
    }
    if (!range || range.cleared || force === "unfold") return;

    var myWidget = makeWidget(cm, options, range);
    CodeMirror.on(myWidget, "mousedown", function(e) {
      myRange.clear();
      CodeMirror.e_preventDefault(e);
    });
    var myRange = cm.markText(range.from, range.to, {
      replacedWith: myWidget,
      clearOnEnter: getOption(cm, options, "clearOnEnter"),
      __isFold: true
    });
    myRange.on("clear", function(from, to) {
      CodeMirror.signal(cm, "unfold", cm, from, to);
    });
    CodeMirror.signal(cm, "fold", cm, range.from, range.to);
  }

  function makeWidget(cm, options, range) {
    var widget = getOption(cm, options, "widget");

    if (typeof widget == "function") {
      widget = widget(range.from, range.to);
    }

    if (typeof widget == "string") {
      var text = document.createTextNode(widget);
      widget = document.createElement("span");
      widget.appendChild(text);
      widget.className = "CodeMirror-foldmarker";
    } else if (widget) {
      widget = widget.cloneNode(true)
    }
    return widget;
  }

  // Clumsy backwards-compatible interface
  CodeMirror.newFoldFunction = function(rangeFinder, widget) {
    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
  };

  // New-style interface
  CodeMirror.defineExtension("foldCode", function(pos, options, force) {
    doFold(this, pos, options, force);
  });

  CodeMirror.defineExtension("isFolded", function(pos) {
    var marks = this.findMarksAt(pos);
    for (var i = 0; i < marks.length; ++i)
      if (marks[i].__isFold) return true;
  });

  CodeMirror.commands.toggleFold = function(cm) {
    cm.foldCode(cm.getCursor());
  };
  CodeMirror.commands.fold = function(cm) {
    cm.foldCode(cm.getCursor(), null, "fold");
  };
  CodeMirror.commands.unfold = function(cm) {
    cm.foldCode(cm.getCursor(), null, "unfold");
  };
  CodeMirror.commands.foldAll = function(cm) {
    cm.operation(function() {
      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
        cm.foldCode(CodeMirror.Pos(i, 0), null, "fold");
    });
  };
  CodeMirror.commands.unfoldAll = function(cm) {
    cm.operation(function() {
      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
        cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold");
    });
  };

  CodeMirror.registerHelper("fold", "combine", function() {
    var funcs = Array.prototype.slice.call(arguments, 0);
    return function(cm, start) {
      for (var i = 0; i < funcs.length; ++i) {
        var found = funcs[i](cm, start);
        if (found) return found;
      }
    };
  });

  CodeMirror.registerHelper("fold", "auto", function(cm, start) {
    var helpers = cm.getHelpers(start, "fold");
    for (var i = 0; i < helpers.length; i++) {
      var cur = helpers[i](cm, start);
      if (cur) return cur;
    }
  });

  var defaultOptions = {
    rangeFinder: CodeMirror.fold.auto,
    widget: "\u2194",
    minFoldSize: 0,
    scanUp: false,
    clearOnEnter: true
  };

  CodeMirror.defineOption("foldOptions", null);

  function getOption(cm, options, name) {
    if (options && options[name] !== undefined)
      return options[name];
    var editorOptions = cm.options.foldOptions;
    if (editorOptions && editorOptions[name] !== undefined)
      return editorOptions[name];
    return defaultOptions[name];
  }

  CodeMirror.defineExtension("foldOption", function(options, name) {
    return getOption(this, options, name);
  });
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("./foldcode"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "./foldcode"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
    if (old && old != CodeMirror.Init) {
      cm.clearGutter(cm.state.foldGutter.options.gutter);
      cm.state.foldGutter = null;
      cm.off("gutterClick", onGutterClick);
      cm.off("changes", onChange);
      cm.off("viewportChange", onViewportChange);
      cm.off("fold", onFold);
      cm.off("unfold", onFold);
      cm.off("swapDoc", onChange);
    }
    if (val) {
      cm.state.foldGutter = new State(parseOptions(val));
      updateInViewport(cm);
      cm.on("gutterClick", onGutterClick);
      cm.on("changes", onChange);
      cm.on("viewportChange", onViewportChange);
      cm.on("fold", onFold);
      cm.on("unfold", onFold);
      cm.on("swapDoc", onChange);
    }
  });

  var Pos = CodeMirror.Pos;

  function State(options) {
    this.options = options;
    this.from = this.to = 0;
  }

  function parseOptions(opts) {
    if (opts === true) opts = {};
    if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
    if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
    if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
    return opts;
  }

  function isFolded(cm, line) {
    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));
    for (var i = 0; i < marks.length; ++i) {
      if (marks[i].__isFold) {
        var fromPos = marks[i].find(-1);
        if (fromPos && fromPos.line === line)
          return marks[i];
      }
    }
  }

  function marker(spec) {
    if (typeof spec == "string") {
      var elt = document.createElement("div");
      elt.className = spec + " CodeMirror-guttermarker-subtle";
      return elt;
    } else {
      return spec.cloneNode(true);
    }
  }

  function updateFoldInfo(cm, from, to) {
    var opts = cm.state.foldGutter.options, cur = from - 1;
    var minSize = cm.foldOption(opts, "minFoldSize");
    var func = cm.foldOption(opts, "rangeFinder");
    // we can reuse the built-in indicator element if its className matches the new state
    var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded);
    var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen);
    cm.eachLine(from, to, function(line) {
      ++cur;
      var mark = null;
      var old = line.gutterMarkers;
      if (old) old = old[opts.gutter];
      if (isFolded(cm, cur)) {
        if (clsFolded && old && clsFolded.test(old.className)) return;
        mark = marker(opts.indicatorFolded);
      } else {
        var pos = Pos(cur, 0);
        var range = func && func(cm, pos);
        if (range && range.to.line - range.from.line >= minSize) {
          if (clsOpen && old && clsOpen.test(old.className)) return;
          mark = marker(opts.indicatorOpen);
        }
      }
      if (!mark && !old) return;
      cm.setGutterMarker(line, opts.gutter, mark);
    });
  }

  // copied from CodeMirror/src/util/dom.js
  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }

  function updateInViewport(cm) {
    var vp = cm.getViewport(), state = cm.state.foldGutter;
    if (!state) return;
    cm.operation(function() {
      updateFoldInfo(cm, vp.from, vp.to);
    });
    state.from = vp.from; state.to = vp.to;
  }

  function onGutterClick(cm, line, gutter) {
    var state = cm.state.foldGutter;
    if (!state) return;
    var opts = state.options;
    if (gutter != opts.gutter) return;
    var folded = isFolded(cm, line);
    if (folded) folded.clear();
    else cm.foldCode(Pos(line, 0), opts);
  }

  function onChange(cm) {
    var state = cm.state.foldGutter;
    if (!state) return;
    var opts = state.options;
    state.from = state.to = 0;
    clearTimeout(state.changeUpdate);
    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
  }

  function onViewportChange(cm) {
    var state = cm.state.foldGutter;
    if (!state) return;
    var opts = state.options;
    clearTimeout(state.changeUpdate);
    state.changeUpdate = setTimeout(function() {
      var vp = cm.getViewport();
      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
        updateInViewport(cm);
      } else {
        cm.operation(function() {
          if (vp.from < state.from) {
            updateFoldInfo(cm, vp.from, state.from);
            state.from = vp.from;
          }
          if (vp.to > state.to) {
            updateFoldInfo(cm, state.to, vp.to);
            state.to = vp.to;
          }
        });
      }
    }, opts.updateViewportTimeSpan || 400);
  }

  function onFold(cm, from) {
    var state = cm.state.foldGutter;
    if (!state) return;
    var line = from.line;
    if (line >= state.from && line < state.to)
      updateFoldInfo(cm, line, line + 1);
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var Pos = CodeMirror.Pos;
  function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }

  var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
  var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
  var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");

  function Iter(cm, line, ch, range) {
    this.line = line; this.ch = ch;
    this.cm = cm; this.text = cm.getLine(line);
    this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();
    this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();
  }

  function tagAt(iter, ch) {
    var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));
    return type && /\btag\b/.test(type);
  }

  function nextLine(iter) {
    if (iter.line >= iter.max) return;
    iter.ch = 0;
    iter.text = iter.cm.getLine(++iter.line);
    return true;
  }
  function prevLine(iter) {
    if (iter.line <= iter.min) return;
    iter.text = iter.cm.getLine(--iter.line);
    iter.ch = iter.text.length;
    return true;
  }

  function toTagEnd(iter) {
    for (;;) {
      var gt = iter.text.indexOf(">", iter.ch);
      if (gt == -1) { if (nextLine(iter)) continue; else return; }
      if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }
      var lastSlash = iter.text.lastIndexOf("/", gt);
      var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
      iter.ch = gt + 1;
      return selfClose ? "selfClose" : "regular";
    }
  }
  function toTagStart(iter) {
    for (;;) {
      var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
      if (lt == -1) { if (prevLine(iter)) continue; else return; }
      if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }
      xmlTagStart.lastIndex = lt;
      iter.ch = lt;
      var match = xmlTagStart.exec(iter.text);
      if (match && match.index == lt) return match;
    }
  }

  function toNextTag(iter) {
    for (;;) {
      xmlTagStart.lastIndex = iter.ch;
      var found = xmlTagStart.exec(iter.text);
      if (!found) { if (nextLine(iter)) continue; else return; }
      if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }
      iter.ch = found.index + found[0].length;
      return found;
    }
  }
  function toPrevTag(iter) {
    for (;;) {
      var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
      if (gt == -1) { if (prevLine(iter)) continue; else return; }
      if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }
      var lastSlash = iter.text.lastIndexOf("/", gt);
      var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
      iter.ch = gt + 1;
      return selfClose ? "selfClose" : "regular";
    }
  }

  function findMatchingClose(iter, tag) {
    var stack = [];
    for (;;) {
      var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);
      if (!next || !(end = toTagEnd(iter))) return;
      if (end == "selfClose") continue;
      if (next[1]) { // closing tag
        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {
          stack.length = i;
          break;
        }
        if (i < 0 && (!tag || tag == next[2])) return {
          tag: next[2],
          from: Pos(startLine, startCh),
          to: Pos(iter.line, iter.ch)
        };
      } else { // opening tag
        stack.push(next[2]);
      }
    }
  }
  function findMatchingOpen(iter, tag) {
    var stack = [];
    for (;;) {
      var prev = toPrevTag(iter);
      if (!prev) return;
      if (prev == "selfClose") { toTagStart(iter); continue; }
      var endLine = iter.line, endCh = iter.ch;
      var start = toTagStart(iter);
      if (!start) return;
      if (start[1]) { // closing tag
        stack.push(start[2]);
      } else { // opening tag
        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {
          stack.length = i;
          break;
        }
        if (i < 0 && (!tag || tag == start[2])) return {
          tag: start[2],
          from: Pos(iter.line, iter.ch),
          to: Pos(endLine, endCh)
        };
      }
    }
  }

  CodeMirror.registerHelper("fold", "xml", function(cm, start) {
    var iter = new Iter(cm, start.line, 0);
    for (;;) {
      var openTag = toNextTag(iter)
      if (!openTag || iter.line != start.line) return
      var end = toTagEnd(iter)
      if (!end) return
      if (!openTag[1] && end != "selfClose") {
        var startPos = Pos(iter.line, iter.ch);
        var endPos = findMatchingClose(iter, openTag[2]);
        return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null
      }
    }
  });
  CodeMirror.findMatchingTag = function(cm, pos, range) {
    var iter = new Iter(cm, pos.line, pos.ch, range);
    if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
    var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
    var start = end && toTagStart(iter);
    if (!end || !start || cmp(iter, pos) > 0) return;
    var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
    if (end == "selfClose") return {open: here, close: null, at: "open"};

    if (start[1]) { // closing tag
      return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
    } else { // opening tag
      iter = new Iter(cm, to.line, to.ch, range);
      return {open: here, close: findMatchingClose(iter, start[2]), at: "open"};
    }
  };

  CodeMirror.findEnclosingTag = function(cm, pos, range, tag) {
    var iter = new Iter(cm, pos.line, pos.ch, range);
    for (;;) {
      var open = findMatchingOpen(iter, tag);
      if (!open) break;
      var forward = new Iter(cm, pos.line, pos.ch, range);
      var close = findMatchingClose(forward, open.tag);
      if (close) return {open: open, close: close};
    }
  };

  // Used by addon/edit/closetag.js
  CodeMirror.scanForClosingTag = function(cm, pos, name, end) {
    var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);
    return findMatchingClose(iter, name);
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), "cjs");
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); });
  else // Plain browser env
    mod(CodeMirror, "plain");
})(function(CodeMirror, env) {
  if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";

  var loading = {};
  function splitCallback(cont, n) {
    var countDown = n;
    return function() { if (--countDown == 0) cont(); };
  }
  function ensureDeps(mode, cont, options) {
    var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.dependencies;
    if (!deps) return cont();
    var missing = [];
    for (var i = 0; i < deps.length; ++i) {
      if (!CodeMirror.modes.hasOwnProperty(deps[i]))
        missing.push(deps[i]);
    }
    if (!missing.length) return cont();
    var split = splitCallback(cont, missing.length);
    for (var i = 0; i < missing.length; ++i)
      CodeMirror.requireMode(missing[i], split, options);
  }

  CodeMirror.requireMode = function(mode, cont, options) {
    if (typeof mode != "string") mode = mode.name;
    if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options);
    if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);

    var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode);
    if (options && options.loadMode) {
      options.loadMode(file, function() { ensureDeps(mode, cont, options) })
    } else if (env == "plain") {
      var script = document.createElement("script");
      script.src = file;
      var others = document.getElementsByTagName("script")[0];
      var list = loading[mode] = [cont];
      CodeMirror.on(script, "load", function() {
        ensureDeps(mode, function() {
          for (var i = 0; i < list.length; ++i) list[i]();
        }, options);
      });
      others.parentNode.insertBefore(script, others);
    } else if (env == "cjs") {
      require(file);
      cont();
    } else if (env == "amd") {
      requirejs([file], cont);
    }
  };

  CodeMirror.autoLoadMode = function(instance, mode, options) {
    if (!CodeMirror.modes.hasOwnProperty(mode))
      CodeMirror.requireMode(mode, function() {
        instance.setOption("mode", instance.getOption("mode"));
      }, options);
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
"use strict";

CodeMirror.multiplexingMode = function(outer /*, others */) {
  // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects
  var others = Array.prototype.slice.call(arguments, 1);

  function indexOf(string, pattern, from, returnEnd) {
    if (typeof pattern == "string") {
      var found = string.indexOf(pattern, from);
      return returnEnd && found > -1 ? found + pattern.length : found;
    }
    var m = pattern.exec(from ? string.slice(from) : string);
    return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;
  }

  return {
    startState: function() {
      return {
        outer: CodeMirror.startState(outer),
        innerActive: null,
        inner: null,
        startingInner: false
      };
    },

    copyState: function(state) {
      return {
        outer: CodeMirror.copyState(outer, state.outer),
        innerActive: state.innerActive,
        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner),
        startingInner: state.startingInner
      };
    },

    token: function(stream, state) {
      if (!state.innerActive) {
        var cutOff = Infinity, oldContent = stream.string;
        for (var i = 0; i < others.length; ++i) {
          var other = others[i];
          var found = indexOf(oldContent, other.open, stream.pos);
          if (found == stream.pos) {
            if (!other.parseDelimiters) stream.match(other.open);
            state.startingInner = !!other.parseDelimiters
            state.innerActive = other;

            // Get the outer indent, making sure to handle CodeMirror.Pass
            var outerIndent = 0;
            if (outer.indent) {
              var possibleOuterIndent = outer.indent(state.outer, "", "");
              if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;
            }

            state.inner = CodeMirror.startState(other.mode, outerIndent);
            return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open");
          } else if (found != -1 && found < cutOff) {
            cutOff = found;
          }
        }
        if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);
        var outerToken = outer.token(stream, state.outer);
        if (cutOff != Infinity) stream.string = oldContent;
        return outerToken;
      } else {
        var curInner = state.innerActive, oldContent = stream.string;
        if (!curInner.close && stream.sol()) {
          state.innerActive = state.inner = null;
          return this.token(stream, state);
        }
        var found = curInner.close && !state.startingInner ?
            indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
        if (found == stream.pos && !curInner.parseDelimiters) {
          stream.match(curInner.close);
          state.innerActive = state.inner = null;
          return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close");
        }
        if (found > -1) stream.string = oldContent.slice(0, found);
        var innerToken = curInner.mode.token(stream, state.inner);
        if (found > -1) stream.string = oldContent;
        else if (stream.pos > stream.start) state.startingInner = false

        if (found == stream.pos && curInner.parseDelimiters)
          state.innerActive = state.inner = null;

        if (curInner.innerStyle) {
          if (innerToken) innerToken = innerToken + " " + curInner.innerStyle;
          else innerToken = curInner.innerStyle;
        }

        return innerToken;
      }
    },

    indent: function(state, textAfter, line) {
      var mode = state.innerActive ? state.innerActive.mode : outer;
      if (!mode.indent) return CodeMirror.Pass;
      return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);
    },

    blankLine: function(state) {
      var mode = state.innerActive ? state.innerActive.mode : outer;
      if (mode.blankLine) {
        mode.blankLine(state.innerActive ? state.inner : state.outer);
      }
      if (!state.innerActive) {
        for (var i = 0; i < others.length; ++i) {
          var other = others[i];
          if (other.open === "\n") {
            state.innerActive = other;
            state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "", "") : 0);
          }
        }
      } else if (state.innerActive.close === "\n") {
        state.innerActive = state.inner = null;
      }
    },

    electricChars: outer.electricChars,

    innerMode: function(state) {
      return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};
    }
  };
};

});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineExtension("annotateScrollbar", function(options) {
    if (typeof options == "string") options = {className: options};
    return new Annotation(this, options);
  });

  CodeMirror.defineOption("scrollButtonHeight", 0);

  function Annotation(cm, options) {
    this.cm = cm;
    this.options = options;
    this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight");
    this.annotations = [];
    this.doRedraw = this.doUpdate = null;
    this.div = cm.getWrapperElement().appendChild(document.createElement("div"));
    this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none";
    this.computeScale();

    function scheduleRedraw(delay) {
      clearTimeout(self.doRedraw);
      self.doRedraw = setTimeout(function() { self.redraw(); }, delay);
    }

    var self = this;
    cm.on("refresh", this.resizeHandler = function() {
      clearTimeout(self.doUpdate);
      self.doUpdate = setTimeout(function() {
        if (self.computeScale()) scheduleRedraw(20);
      }, 100);
    });
    cm.on("markerAdded", this.resizeHandler);
    cm.on("markerCleared", this.resizeHandler);
    if (options.listenForChanges !== false)
      cm.on("changes", this.changeHandler = function() {
        scheduleRedraw(250);
      });
  }

  Annotation.prototype.computeScale = function() {
    var cm = this.cm;
    var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /
      cm.getScrollerElement().scrollHeight
    if (hScale != this.hScale) {
      this.hScale = hScale;
      return true;
    }
  };

  Annotation.prototype.update = function(annotations) {
    this.annotations = annotations;
    this.redraw();
  };

  Annotation.prototype.redraw = function(compute) {
    if (compute !== false) this.computeScale();
    var cm = this.cm, hScale = this.hScale;

    var frag = document.createDocumentFragment(), anns = this.annotations;

    var wrapping = cm.getOption("lineWrapping");
    var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;
    var curLine = null, curLineObj = null;

    function getY(pos, top) {
      if (curLine != pos.line) {
        curLine = pos.line
        curLineObj = cm.getLineHandle(pos.line)
        var visual = cm.getLineHandleVisualStart(curLineObj)
        if (visual != curLineObj) {
          curLine = cm.getLineNumber(visual)
          curLineObj = visual
        }
      }
      if ((curLineObj.widgets && curLineObj.widgets.length) ||
          (wrapping && curLineObj.height > singleLineH))
        return cm.charCoords(pos, "local")[top ? "top" : "bottom"];
      var topY = cm.heightAtLine(curLineObj, "local");
      return topY + (top ? 0 : curLineObj.height);
    }

    var lastLine = cm.lastLine()
    if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {
      var ann = anns[i];
      if (ann.to.line > lastLine) continue;
      var top = nextTop || getY(ann.from, true) * hScale;
      var bottom = getY(ann.to, false) * hScale;
      while (i < anns.length - 1) {
        if (anns[i + 1].to.line > lastLine) break;
        nextTop = getY(anns[i + 1].from, true) * hScale;
        if (nextTop > bottom + .9) break;
        ann = anns[++i];
        bottom = getY(ann.to, false) * hScale;
      }
      if (bottom == top) continue;
      var height = Math.max(bottom - top, 3);

      var elt = frag.appendChild(document.createElement("div"));
      elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: "
        + (top + this.buttonHeight) + "px; height: " + height + "px";
      elt.className = this.options.className;
      if (ann.id) {
        elt.setAttribute("annotation-id", ann.id);
      }
    }
    this.div.textContent = "";
    this.div.appendChild(frag);
  };

  Annotation.prototype.clear = function() {
    this.cm.off("refresh", this.resizeHandler);
    this.cm.off("markerAdded", this.resizeHandler);
    this.cm.off("markerCleared", this.resizeHandler);
    if (this.changeHandler) this.cm.off("changes", this.changeHandler);
    this.div.parentNode.removeChild(this.div);
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  function Bar(cls, orientation, scroll) {
    this.orientation = orientation;
    this.scroll = scroll;
    this.screen = this.total = this.size = 1;
    this.pos = 0;

    this.node = document.createElement("div");
    this.node.className = cls + "-" + orientation;
    this.inner = this.node.appendChild(document.createElement("div"));

    var self = this;
    CodeMirror.on(this.inner, "mousedown", function(e) {
      if (e.which != 1) return;
      CodeMirror.e_preventDefault(e);
      var axis = self.orientation == "horizontal" ? "pageX" : "pageY";
      var start = e[axis], startpos = self.pos;
      function done() {
        CodeMirror.off(document, "mousemove", move);
        CodeMirror.off(document, "mouseup", done);
      }
      function move(e) {
        if (e.which != 1) return done();
        self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));
      }
      CodeMirror.on(document, "mousemove", move);
      CodeMirror.on(document, "mouseup", done);
    });

    CodeMirror.on(this.node, "click", function(e) {
      CodeMirror.e_preventDefault(e);
      var innerBox = self.inner.getBoundingClientRect(), where;
      if (self.orientation == "horizontal")
        where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;
      else
        where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;
      self.moveTo(self.pos + where * self.screen);
    });

    function onWheel(e) {
      var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"];
      var oldPos = self.pos;
      self.moveTo(self.pos + moved);
      if (self.pos != oldPos) CodeMirror.e_preventDefault(e);
    }
    CodeMirror.on(this.node, "mousewheel", onWheel);
    CodeMirror.on(this.node, "DOMMouseScroll", onWheel);
  }

  Bar.prototype.setPos = function(pos, force) {
    if (pos < 0) pos = 0;
    if (pos > this.total - this.screen) pos = this.total - this.screen;
    if (!force && pos == this.pos) return false;
    this.pos = pos;
    this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
      (pos * (this.size / this.total)) + "px";
    return true
  };

  Bar.prototype.moveTo = function(pos) {
    if (this.setPos(pos)) this.scroll(pos, this.orientation);
  }

  var minButtonSize = 10;

  Bar.prototype.update = function(scrollSize, clientSize, barSize) {
    var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize
    if (sizeChanged) {
      this.screen = clientSize;
      this.total = scrollSize;
      this.size = barSize;
    }

    var buttonSize = this.screen * (this.size / this.total);
    if (buttonSize < minButtonSize) {
      this.size -= minButtonSize - buttonSize;
      buttonSize = minButtonSize;
    }
    this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
      buttonSize + "px";
    this.setPos(this.pos, sizeChanged);
  };

  function SimpleScrollbars(cls, place, scroll) {
    this.addClass = cls;
    this.horiz = new Bar(cls, "horizontal", scroll);
    place(this.horiz.node);
    this.vert = new Bar(cls, "vertical", scroll);
    place(this.vert.node);
    this.width = null;
  }

  SimpleScrollbars.prototype.update = function(measure) {
    if (this.width == null) {
      var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;
      if (style) this.width = parseInt(style.height);
    }
    var width = this.width || 0;

    var needsH = measure.scrollWidth > measure.clientWidth + 1;
    var needsV = measure.scrollHeight > measure.clientHeight + 1;
    this.vert.node.style.display = needsV ? "block" : "none";
    this.horiz.node.style.display = needsH ? "block" : "none";

    if (needsV) {
      this.vert.update(measure.scrollHeight, measure.clientHeight,
                       measure.viewHeight - (needsH ? width : 0));
      this.vert.node.style.bottom = needsH ? width + "px" : "0";
    }
    if (needsH) {
      this.horiz.update(measure.scrollWidth, measure.clientWidth,
                        measure.viewWidth - (needsV ? width : 0) - measure.barLeft);
      this.horiz.node.style.right = needsV ? width + "px" : "0";
      this.horiz.node.style.left = measure.barLeft + "px";
    }

    return {right: needsV ? width : 0, bottom: needsH ? width : 0};
  };

  SimpleScrollbars.prototype.setScrollTop = function(pos) {
    this.vert.setPos(pos);
  };

  SimpleScrollbars.prototype.setScrollLeft = function(pos) {
    this.horiz.setPos(pos);
  };

  SimpleScrollbars.prototype.clear = function() {
    var parent = this.horiz.node.parentNode;
    parent.removeChild(this.horiz.node);
    parent.removeChild(this.vert.node);
  };

  CodeMirror.scrollbarModel.simple = function(place, scroll) {
    return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll);
  };
  CodeMirror.scrollbarModel.overlay = function(place, scroll) {
    return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll);
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) {
    if (typeof options == "string") options = {className: options};
    if (!options) options = {};
    return new SearchAnnotation(this, query, caseFold, options);
  });

  function SearchAnnotation(cm, query, caseFold, options) {
    this.cm = cm;
    this.options = options;
    var annotateOptions = {listenForChanges: false};
    for (var prop in options) annotateOptions[prop] = options[prop];
    if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match";
    this.annotation = cm.annotateScrollbar(annotateOptions);
    this.query = query;
    this.caseFold = caseFold;
    this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};
    this.matches = [];
    this.update = null;

    this.findMatches();
    this.annotation.update(this.matches);

    var self = this;
    cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); });
  }

  var MAX_MATCHES = 1000;

  SearchAnnotation.prototype.findMatches = function() {
    if (!this.gap) return;
    for (var i = 0; i < this.matches.length; i++) {
      var match = this.matches[i];
      if (match.from.line >= this.gap.to) break;
      if (match.to.line >= this.gap.from) this.matches.splice(i--, 1);
    }
    var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline});
    var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES;
    while (cursor.findNext()) {
      var match = {from: cursor.from(), to: cursor.to()};
      if (match.from.line >= this.gap.to) break;
      this.matches.splice(i++, 0, match);
      if (this.matches.length > maxMatches) break;
    }
    this.gap = null;
  };

  function offsetLine(line, changeStart, sizeChange) {
    if (line <= changeStart) return line;
    return Math.max(changeStart, line + sizeChange);
  }

  SearchAnnotation.prototype.onChange = function(change) {
    var startLine = change.from.line;
    var endLine = CodeMirror.changeEnd(change).line;
    var sizeChange = endLine - change.to.line;
    if (this.gap) {
      this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line);
      this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line);
    } else {
      this.gap = {from: change.from.line, to: endLine + 1};
    }

    if (sizeChange) for (var i = 0; i < this.matches.length; i++) {
      var match = this.matches[i];
      var newFrom = offsetLine(match.from.line, startLine, sizeChange);
      if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch);
      var newTo = offsetLine(match.to.line, startLine, sizeChange);
      if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch);
    }
    clearTimeout(this.update);
    var self = this;
    this.update = setTimeout(function() { self.updateAfterChange(); }, 250);
  };

  SearchAnnotation.prototype.updateAfterChange = function() {
    this.findMatches();
    this.annotation.update(this.matches);
  };

  SearchAnnotation.prototype.clear = function() {
    this.cm.off("change", this.changeHandler);
    this.annotation.clear();
  };
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

// Highlighting text that matches the selection
//
// Defines an option highlightSelectionMatches, which, when enabled,
// will style strings that match the selection throughout the
// document.
//
// The option can be set to true to simply enable it, or to a
// {minChars, style, wordsOnly, showToken, delay} object to explicitly
// configure it. minChars is the minimum amount of characters that should be
// selected for the behavior to occur, and style is the token style to
// apply to the matches. This will be prefixed by "cm-" to create an
// actual CSS class name. If wordsOnly is enabled, the matches will be
// highlighted only if the selected text is a word. showToken, when enabled,
// will cause the current token to be highlighted when nothing is selected.
// delay is used to specify how much time to wait, in milliseconds, before
// highlighting the matches. If annotateScrollbar is enabled, the occurrences
// will be highlighted on the scrollbar via the matchesonscrollbar addon.

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("./matchesonscrollbar"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "./matchesonscrollbar"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  var defaults = {
    style: "matchhighlight",
    minChars: 2,
    delay: 100,
    wordsOnly: false,
    annotateScrollbar: false,
    showToken: false,
    trim: true
  }

  function State(options) {
    this.options = {}
    for (var name in defaults)
      this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]
    this.overlay = this.timeout = null;
    this.matchesonscroll = null;
    this.active = false;
  }

  CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) {
    if (old && old != CodeMirror.Init) {
      removeOverlay(cm);
      clearTimeout(cm.state.matchHighlighter.timeout);
      cm.state.matchHighlighter = null;
      cm.off("cursorActivity", cursorActivity);
      cm.off("focus", onFocus)
    }
    if (val) {
      var state = cm.state.matchHighlighter = new State(val);
      if (cm.hasFocus()) {
        state.active = true
        highlightMatches(cm)
      } else {
        cm.on("focus", onFocus)
      }
      cm.on("cursorActivity", cursorActivity);
    }
  });

  function cursorActivity(cm) {
    var state = cm.state.matchHighlighter;
    if (state.active || cm.hasFocus()) scheduleHighlight(cm, state)
  }

  function onFocus(cm) {
    var state = cm.state.matchHighlighter
    if (!state.active) {
      state.active = true
      scheduleHighlight(cm, state)
    }
  }

  function scheduleHighlight(cm, state) {
    clearTimeout(state.timeout);
    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);
  }

  function addOverlay(cm, query, hasBoundary, style) {
    var state = cm.state.matchHighlighter;
    cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));
    if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {
      var searchFor = hasBoundary ? new RegExp((/\w/.test(query.charAt(0)) ? "\\b" : "") +
                                               query.replace(/[\\\[.+*?(){|^$]/g, "\\$&") +
                                               (/\w/.test(query.charAt(query.length - 1)) ? "\\b" : "")) : query;
      state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false,
        {className: "CodeMirror-selection-highlight-scrollbar"});
    }
  }

  function removeOverlay(cm) {
    var state = cm.state.matchHighlighter;
    if (state.overlay) {
      cm.removeOverlay(state.overlay);
      state.overlay = null;
      if (state.matchesonscroll) {
        state.matchesonscroll.clear();
        state.matchesonscroll = null;
      }
    }
  }

  function highlightMatches(cm) {
    cm.operation(function() {
      var state = cm.state.matchHighlighter;
      removeOverlay(cm);
      if (!cm.somethingSelected() && state.options.showToken) {
        var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken;
        var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
        while (start && re.test(line.charAt(start - 1))) --start;
        while (end < line.length && re.test(line.charAt(end))) ++end;
        if (start < end)
          addOverlay(cm, line.slice(start, end), re, state.options.style);
        return;
      }
      var from = cm.getCursor("from"), to = cm.getCursor("to");
      if (from.line != to.line) return;
      if (state.options.wordsOnly && !isWord(cm, from, to)) return;
      var selection = cm.getRange(from, to)
      if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "")
      if (selection.length >= state.options.minChars)
        addOverlay(cm, selection, false, state.options.style);
    });
  }

  function isWord(cm, from, to) {
    var str = cm.getRange(from, to);
    if (str.match(/^\w+$/) !== null) {
        if (from.ch > 0) {
            var pos = {line: from.line, ch: from.ch - 1};
            var chr = cm.getRange(pos, from);
            if (chr.match(/\W/) === null) return false;
        }
        if (to.ch < cm.getLine(from.line).length) {
            var pos = {line: to.line, ch: to.ch + 1};
            var chr = cm.getRange(to, pos);
            if (chr.match(/\W/) === null) return false;
        }
        return true;
    } else return false;
  }

  function boundariesAround(stream, re) {
    return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
      (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
  }

  function makeOverlay(query, hasBoundary, style) {
    return {token: function(stream) {
      if (stream.match(query) &&
          (!hasBoundary || boundariesAround(stream, hasBoundary)))
        return style;
      stream.next();
      stream.skipTo(query.charAt(0)) || stream.skipToEnd();
    }};
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"))
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod)
  else // Plain browser env
    mod(CodeMirror)
})(function(CodeMirror) {
  "use strict"
  var Pos = CodeMirror.Pos

  function regexpFlags(regexp) {
    var flags = regexp.flags
    return flags != null ? flags : (regexp.ignoreCase ? "i" : "")
      + (regexp.global ? "g" : "")
      + (regexp.multiline ? "m" : "")
  }

  function ensureFlags(regexp, flags) {
    var current = regexpFlags(regexp), target = current
    for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)
      target += flags.charAt(i)
    return current == target ? regexp : new RegExp(regexp.source, target)
  }

  function maybeMultiline(regexp) {
    return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source)
  }

  function searchRegexpForward(doc, regexp, start) {
    regexp = ensureFlags(regexp, "g")
    for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {
      regexp.lastIndex = ch
      var string = doc.getLine(line), match = regexp.exec(string)
      if (match)
        return {from: Pos(line, match.index),
                to: Pos(line, match.index + match[0].length),
                match: match}
    }
  }

  function searchRegexpForwardMultiline(doc, regexp, start) {
    if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)

    regexp = ensureFlags(regexp, "gm")
    var string, chunk = 1
    for (var line = start.line, last = doc.lastLine(); line <= last;) {
      // This grows the search buffer in exponentially-sized chunks
      // between matches, so that nearby matches are fast and don't
      // require concatenating the whole document (in case we're
      // searching for something that has tons of matches), but at the
      // same time, the amount of retries is limited.
      for (var i = 0; i < chunk; i++) {
        if (line > last) break
        var curLine = doc.getLine(line++)
        string = string == null ? curLine : string + "\n" + curLine
      }
      chunk = chunk * 2
      regexp.lastIndex = start.ch
      var match = regexp.exec(string)
      if (match) {
        var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n")
        var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length
        return {from: Pos(startLine, startCh),
                to: Pos(startLine + inside.length - 1,
                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),
                match: match}
      }
    }
  }

  function lastMatchIn(string, regexp, endMargin) {
    var match, from = 0
    while (from <= string.length) {
      regexp.lastIndex = from
      var newMatch = regexp.exec(string)
      if (!newMatch) break
      var end = newMatch.index + newMatch[0].length
      if (end > string.length - endMargin) break
      if (!match || end > match.index + match[0].length)
        match = newMatch
      from = newMatch.index + 1
    }
    return match
  }

  function searchRegexpBackward(doc, regexp, start) {
    regexp = ensureFlags(regexp, "g")
    for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {
      var string = doc.getLine(line)
      var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)
      if (match)
        return {from: Pos(line, match.index),
                to: Pos(line, match.index + match[0].length),
                match: match}
    }
  }

  function searchRegexpBackwardMultiline(doc, regexp, start) {
    if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)
    regexp = ensureFlags(regexp, "gm")
    var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch
    for (var line = start.line, first = doc.firstLine(); line >= first;) {
      for (var i = 0; i < chunkSize && line >= first; i++) {
        var curLine = doc.getLine(line--)
        string = string == null ? curLine : curLine + "\n" + string
      }
      chunkSize *= 2

      var match = lastMatchIn(string, regexp, endMargin)
      if (match) {
        var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n")
        var startLine = line + before.length, startCh = before[before.length - 1].length
        return {from: Pos(startLine, startCh),
                to: Pos(startLine + inside.length - 1,
                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),
                match: match}
      }
    }
  }

  var doFold, noFold
  if (String.prototype.normalize) {
    doFold = function(str) { return str.normalize("NFD").toLowerCase() }
    noFold = function(str) { return str.normalize("NFD") }
  } else {
    doFold = function(str) { return str.toLowerCase() }
    noFold = function(str) { return str }
  }

  // Maps a position in a case-folded line back to a position in the original line
  // (compensating for codepoints increasing in number during folding)
  function adjustPos(orig, folded, pos, foldFunc) {
    if (orig.length == folded.length) return pos
    for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {
      if (min == max) return min
      var mid = (min + max) >> 1
      var len = foldFunc(orig.slice(0, mid)).length
      if (len == pos) return mid
      else if (len > pos) max = mid
      else min = mid + 1
    }
  }

  function searchStringForward(doc, query, start, caseFold) {
    // Empty string would match anything and never progress, so we
    // define it to match nothing instead.
    if (!query.length) return null
    var fold = caseFold ? doFold : noFold
    var lines = fold(query).split(/\r|\n\r?/)

    search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {
      var orig = doc.getLine(line).slice(ch), string = fold(orig)
      if (lines.length == 1) {
        var found = string.indexOf(lines[0])
        if (found == -1) continue search
        var start = adjustPos(orig, string, found, fold) + ch
        return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),
                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}
      } else {
        var cutFrom = string.length - lines[0].length
        if (string.slice(cutFrom) != lines[0]) continue search
        for (var i = 1; i < lines.length - 1; i++)
          if (fold(doc.getLine(line + i)) != lines[i]) continue search
        var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]
        if (endString.slice(0, lastLine.length) != lastLine) continue search
        return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),
                to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}
      }
    }
  }

  function searchStringBackward(doc, query, start, caseFold) {
    if (!query.length) return null
    var fold = caseFold ? doFold : noFold
    var lines = fold(query).split(/\r|\n\r?/)

    search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {
      var orig = doc.getLine(line)
      if (ch > -1) orig = orig.slice(0, ch)
      var string = fold(orig)
      if (lines.length == 1) {
        var found = string.lastIndexOf(lines[0])
        if (found == -1) continue search
        return {from: Pos(line, adjustPos(orig, string, found, fold)),
                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}
      } else {
        var lastLine = lines[lines.length - 1]
        if (string.slice(0, lastLine.length) != lastLine) continue search
        for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)
          if (fold(doc.getLine(start + i)) != lines[i]) continue search
        var top = doc.getLine(line + 1 - lines.length), topString = fold(top)
        if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search
        return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),
                to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}
      }
    }
  }

  function SearchCursor(doc, query, pos, options) {
    this.atOccurrence = false
    this.doc = doc
    pos = pos ? doc.clipPos(pos) : Pos(0, 0)
    this.pos = {from: pos, to: pos}

    var caseFold
    if (typeof options == "object") {
      caseFold = options.caseFold
    } else { // Backwards compat for when caseFold was the 4th argument
      caseFold = options
      options = null
    }

    if (typeof query == "string") {
      if (caseFold == null) caseFold = false
      this.matches = function(reverse, pos) {
        return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)
      }
    } else {
      query = ensureFlags(query, "gm")
      if (!options || options.multiline !== false)
        this.matches = function(reverse, pos) {
          return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)
        }
      else
        this.matches = function(reverse, pos) {
          return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)
        }
    }
  }

  SearchCursor.prototype = {
    findNext: function() {return this.find(false)},
    findPrevious: function() {return this.find(true)},

    find: function(reverse) {
      var result = this.matches(reverse, this.doc.clipPos(reverse ? this.pos.from : this.pos.to))

      // Implements weird auto-growing behavior on null-matches for
      // backwards-compatibility with the vim code (unfortunately)
      while (result && CodeMirror.cmpPos(result.from, result.to) == 0) {
        if (reverse) {
          if (result.from.ch) result.from = Pos(result.from.line, result.from.ch - 1)
          else if (result.from.line == this.doc.firstLine()) result = null
          else result = this.matches(reverse, this.doc.clipPos(Pos(result.from.line - 1)))
        } else {
          if (result.to.ch < this.doc.getLine(result.to.line).length) result.to = Pos(result.to.line, result.to.ch + 1)
          else if (result.to.line == this.doc.lastLine()) result = null
          else result = this.matches(reverse, Pos(result.to.line + 1, 0))
        }
      }

      if (result) {
        this.pos = result
        this.atOccurrence = true
        return this.pos.match || true
      } else {
        var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)
        this.pos = {from: end, to: end}
        return this.atOccurrence = false
      }
    },

    from: function() {if (this.atOccurrence) return this.pos.from},
    to: function() {if (this.atOccurrence) return this.pos.to},

    replace: function(newText, origin) {
      if (!this.atOccurrence) return
      var lines = CodeMirror.splitLines(newText)
      this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)
      this.pos.to = Pos(this.pos.from.line + lines.length - 1,
                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))
    }
  }

  CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
    return new SearchCursor(this.doc, query, pos, caseFold)
  })
  CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) {
    return new SearchCursor(this, query, pos, caseFold)
  })

  CodeMirror.defineExtension("selectMatches", function(query, caseFold) {
    var ranges = []
    var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold)
    while (cur.findNext()) {
      if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break
      ranges.push({anchor: cur.from(), head: cur.to()})
    }
    if (ranges.length)
      this.setSelections(ranges, 0)
  })
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";
  var WRAP_CLASS = "CodeMirror-activeline";
  var BACK_CLASS = "CodeMirror-activeline-background";
  var GUTT_CLASS = "CodeMirror-activeline-gutter";

  CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
    var prev = old == CodeMirror.Init ? false : old;
    if (val == prev) return
    if (prev) {
      cm.off("beforeSelectionChange", selectionChange);
      clearActiveLines(cm);
      delete cm.state.activeLines;
    }
    if (val) {
      cm.state.activeLines = [];
      updateActiveLines(cm, cm.listSelections());
      cm.on("beforeSelectionChange", selectionChange);
    }
  });

  function clearActiveLines(cm) {
    for (var i = 0; i < cm.state.activeLines.length; i++) {
      cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
      cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
      cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
    }
  }

  function sameArray(a, b) {
    if (a.length != b.length) return false;
    for (var i = 0; i < a.length; i++)
      if (a[i] != b[i]) return false;
    return true;
  }

  function updateActiveLines(cm, ranges) {
    var active = [];
    for (var i = 0; i < ranges.length; i++) {
      var range = ranges[i];
      var option = cm.getOption("styleActiveLine");
      if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
        continue
      var line = cm.getLineHandleVisualStart(range.head.line);
      if (active[active.length - 1] != line) active.push(line);
    }
    if (sameArray(cm.state.activeLines, active)) return;
    cm.operation(function() {
      clearActiveLines(cm);
      for (var i = 0; i < active.length; i++) {
        cm.addLineClass(active[i], "wrap", WRAP_CLASS);
        cm.addLineClass(active[i], "background", BACK_CLASS);
        cm.addLineClass(active[i], "gutter", GUTT_CLASS);
      }
      cm.state.activeLines = active;
    });
  }

  function selectionChange(cm, sel) {
    updateActiveLines(cm, sel.ranges);
  }
});

// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";

  CodeMirror.modeInfo = [
    {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]},
    {name: "PGP", mimes: ["application/pgp", "application/pgp-encrypted", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["asc", "pgp", "sig"]},
    {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]},
    {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i},
    {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]},
    {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h", "ino"]},
    {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]},
    {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]},
    {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp", "cs"]},
    {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]},
    {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]},
    {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]},
    {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/},
    {name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]},
    {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]},
    {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]},
    {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]},
    {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]},
    {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]},
    {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]},
    {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]},
    {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]},
    {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]},
    {name: "Django", mime: "text/x-django", mode: "django"},
    {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/},
    {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]},
    {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]},
    {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"},
    {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]},
    {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]},
    {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
    {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]},
    {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
    {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
    {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
    {name: "Esper", mime: "text/x-esper", mode: "sql"},
    {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]},
    {name: "FCL", mime: "text/x-fcl", mode: "fcl"},
    {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]},
    {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90", "f95"]},
    {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},
    {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},
    {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},
    {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i},
    {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},
    {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/},
    {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},
    {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},
    {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]},
    {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},
    {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},
    {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]},
    {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm", "handlebars", "hbs"], alias: ["xhtml"]},
    {name: "HTTP", mime: "message/http", mode: "http"},
    {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]},
    {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]},
    {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]},
    {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]},
    {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"],
     mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]},
    {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]},
    {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]},
    {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]},
    {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]},
    {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},
    {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]},
    {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},
    {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]},
    {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]},
    {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]},
    {name: "mIRC", mime: "text/mirc", mode: "mirc"},
    {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"},
    {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb", "wl", "wls"]},
    {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]},
    {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]},
    {name: "MS SQL", mime: "text/x-mssql", mode: "sql"},
    {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]},
    {name: "MySQL", mime: "text/x-mysql", mode: "sql"},
    {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i},
    {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]},
    {name: "NTriples", mimes: ["application/n-triples", "application/n-quads", "text/n-triples"],
     mode: "ntriples", ext: ["nt", "nq"]},
    {name: "Objective-C", mime: "text/x-objectivec", mode: "clike", ext: ["m"], alias: ["objective-c", "objc"]},
    {name: "Objective-C++", mime: "text/x-objectivec++", mode: "clike", ext: ["mm"], alias: ["objective-c++", "objc++"]},
    {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]},
    {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]},
    {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]},
    {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]},
    {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]},
    {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]},
    {name: "PHP", mimes: ["text/x-php", "application/x-httpd-php", "application/x-httpd-php-open"], mode: "php", ext: ["php", "php3", "php4", "php5", "php7", "phtml"]},
    {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]},
    {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]},
    {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]},
    {name: "PostgreSQL", mime: "text/x-pgsql", mode: "sql"},
    {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]},
    {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]},
    {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]},
    {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/},
    {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]},
    {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]},
    {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r", "R"], alias: ["rscript"]},
    {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]},
    {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"},
    {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]},
    {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]},
    {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]},
    {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]},
    {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]},
    {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]},
    {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]},
    {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]},
    {name: "Shell", mimes: ["text/x-sh", "application/x-sh"], mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/},
    {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]},
    {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]},
    {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]},
    {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]},
    {name: "Solr", mime: "text/x-solr", mode: "solr"},
    {name: "SML", mime: "text/x-sml", mode: "mllike", ext: ["sml", "sig", "fun", "smackspec"]},
    {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]},
    {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]},
    {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]},
    {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]},
    {name: "SQLite", mime: "text/x-sqlite", mode: "sql"},
    {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]},
    {name: "Stylus", mime: "text/x-styl", mode: "stylus", ext: ["styl"]},
    {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]},
    {name: "sTeX", mime: "text/x-stex", mode: "stex"},
    {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx", "tex"], alias: ["tex"]},
    {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v", "sv", "svh"]},
    {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]},
    {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]},
    {name: "TiddlyWiki", mime: "text/x-tiddlywiki", mode: "tiddlywiki"},
    {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"},
    {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]},
    {name: "Tornado", mime: "text/x-tornado", mode: "tornado"},
    {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]},
    {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]},
    {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]},
    {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]},
    {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]},
    {name: "TypeScript-JSX", mime: "text/typescript-jsx", mode: "jsx", ext: ["tsx"], alias: ["tsx"]},
    {name: "Twig", mime: "text/x-twig", mode: "twig"},
    {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]},
    {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]},
    {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]},
    {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]},
    {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]},
    {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]},
    {name: "Vue.js Component", mimes: ["script/x-vue", "text/x-vue"], mode: "vue", ext: ["vue"]},
    {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd", "svg"], alias: ["rss", "wsdl", "xsd"]},
    {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},
    {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]},
    {name: "YAML", mimes: ["text/x-yaml", "text/yaml"], mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]},
    {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
    {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
    {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]},
    {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]},
    {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]},
  ];
  // Ensure all modes have a mime property for backwards compatibility
  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
    var info = CodeMirror.modeInfo[i];
    if (info.mimes) info.mime = info.mimes[0];
  }

  CodeMirror.findModeByMIME = function(mime) {
    mime = mime.toLowerCase();
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.mime == mime) return info;
      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)
        if (info.mimes[j] == mime) return info;
    }
    if (/\+xml$/.test(mime)) return CodeMirror.findModeByMIME("application/xml")
    if (/\+json$/.test(mime)) return CodeMirror.findModeByMIME("application/json")
  };

  CodeMirror.findModeByExtension = function(ext) {
    ext = ext.toLowerCase();
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.ext) for (var j = 0; j < info.ext.length; j++)
        if (info.ext[j] == ext) return info;
    }
  };

  CodeMirror.findModeByFileName = function(filename) {
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.file && info.file.test(filename)) return info;
    }
    var dot = filename.lastIndexOf(".");
    var ext = dot > -1 && filename.substring(dot + 1, filename.length);
    if (ext) return CodeMirror.findModeByExtension(ext);
  };

  CodeMirror.findModeByName = function(name) {
    name = name.toLowerCase();
    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
      var info = CodeMirror.modeInfo[i];
      if (info.name.toLowerCase() == name) return info;
      if (info.alias) for (var j = 0; j < info.alias.length; j++)
        if (info.alias[j].toLowerCase() == name) return info;
    }
  };
});
addons.css000060400000004051152455704320006531 0ustar00.CodeMirror-fullscreen {
  position: fixed;
  top: 0; left: 0; right: 0; bottom: 0;
  height: auto;
  z-index: 9;
}

.CodeMirror-foldmarker {
  color: blue;
  text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
  font-family: arial;
  line-height: .3;
  cursor: pointer;
}
.CodeMirror-foldgutter {
  width: .7em;
}
.CodeMirror-foldgutter-open,
.CodeMirror-foldgutter-folded {
  cursor: pointer;
}
.CodeMirror-foldgutter-open:after {
  content: "\25BE";
}
.CodeMirror-foldgutter-folded:after {
  content: "\25B8";
}

.CodeMirror-search-match {
  background: gold;
  border-top: 1px solid orange;
  border-bottom: 1px solid orange;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  opacity: .5;
}

.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {
  position: absolute;
  background: #ccc;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  border: 1px solid #bbb;
  border-radius: 2px;
}

.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical {
  position: absolute;
  z-index: 6;
  background: #eee;
}

.CodeMirror-simplescroll-horizontal {
  bottom: 0; left: 0;
  height: 8px;
}
.CodeMirror-simplescroll-horizontal div {
  bottom: 0;
  height: 100%;
}

.CodeMirror-simplescroll-vertical {
  right: 0; top: 0;
  width: 8px;
}
.CodeMirror-simplescroll-vertical div {
  right: 0;
  width: 100%;
}


.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler {
  display: none;
}

.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
  position: absolute;
  background: #bcd;
  border-radius: 3px;
}

.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
  position: absolute;
  z-index: 6;
}

.CodeMirror-overlayscroll-horizontal {
  bottom: 0; left: 0;
  height: 6px;
}
.CodeMirror-overlayscroll-horizontal div {
  bottom: 0;
  height: 100%;
}

.CodeMirror-overlayscroll-vertical {
  right: 0; top: 0;
  width: 6px;
}
.CodeMirror-overlayscroll-vertical div {
  right: 0;
  width: 100%;
}
codemirror.css000060400000021022152455704320007423 0ustar00/* BASICS */

.CodeMirror {
  /* Set height, width, borders, and global font properties here */
  font-family: monospace;
  height: 300px;
  color: black;
  direction: ltr;
}

/* PADDING */

.CodeMirror-lines {
  padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
  padding: 0 4px; /* Horizontal padding of content */
}

.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  background-color: white; /* The little square between H and V scrollbars */
}

/* GUTTER */

.CodeMirror-gutters {
  border-right: 1px solid #ddd;
  background-color: #f7f7f7;
  white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
  padding: 0 3px 0 5px;
  min-width: 20px;
  text-align: right;
  color: #999;
  white-space: nowrap;
}

.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }

/* CURSOR */

.CodeMirror-cursor {
  border-left: 1px solid black;
  border-right: none;
  width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
  border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
  width: auto;
  border: 0 !important;
  background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
  z-index: 1;
}
.cm-fat-cursor-mark {
  background-color: rgba(20, 255, 20, 0.5);
  -webkit-animation: blink 1.06s steps(1) infinite;
  -moz-animation: blink 1.06s steps(1) infinite;
  animation: blink 1.06s steps(1) infinite;
}
.cm-animate-fat-cursor {
  width: auto;
  border: 0;
  -webkit-animation: blink 1.06s steps(1) infinite;
  -moz-animation: blink 1.06s steps(1) infinite;
  animation: blink 1.06s steps(1) infinite;
  background-color: #7e7;
}
@-moz-keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}
@-webkit-keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}
@keyframes blink {
  0% {}
  50% { background-color: transparent; }
  100% {}
}

/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}

.cm-tab { display: inline-block; text-decoration: inherit; }

.CodeMirror-rulers {
  position: absolute;
  left: 0; right: 0; top: -50px; bottom: 0;
  overflow: hidden;
}
.CodeMirror-ruler {
  border-left: 1px solid #ccc;
  top: 0; bottom: 0;
  position: absolute;
}

/* DEFAULT THEME */

.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}

.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}

.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}

.CodeMirror-composing { border-bottom: 2px solid; }

/* Default styles for common addons */

div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}

/* STOP */

/* The rest of this file contains styles related to the mechanics of
   the editor. You probably shouldn't touch them. */

.CodeMirror {
  position: relative;
  overflow: hidden;
  background: white;
}

.CodeMirror-scroll {
  overflow: scroll !important; /* Things will break if this is overridden */
  /* 50px is the magic margin used to hide the element's real scrollbars */
  /* See overflow: hidden in .CodeMirror */
  margin-bottom: -50px; margin-right: -50px;
  padding-bottom: 50px;
  height: 100%;
  outline: none; /* Prevent dragging from highlighting the element */
  position: relative;
}
.CodeMirror-sizer {
  position: relative;
  border-right: 50px solid transparent;
}

/* The fake, visible scrollbars. Used to force redraw during scrolling
   before actual scrolling happens, thus preventing shaking and
   flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  position: absolute;
  z-index: 6;
  display: none;
  outline: none;
}
.CodeMirror-vscrollbar {
  right: 0; top: 0;
  overflow-x: hidden;
  overflow-y: scroll;
}
.CodeMirror-hscrollbar {
  bottom: 0; left: 0;
  overflow-y: hidden;
  overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
  right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
  left: 0; bottom: 0;
}

.CodeMirror-gutters {
  position: absolute; left: 0; top: 0;
  min-height: 100%;
  z-index: 3;
}
.CodeMirror-gutter {
  white-space: normal;
  height: 100%;
  display: inline-block;
  vertical-align: top;
  margin-bottom: -50px;
}
.CodeMirror-gutter-wrapper {
  position: absolute;
  z-index: 4;
  background: none !important;
  border: none !important;
}
.CodeMirror-gutter-background {
  position: absolute;
  top: 0; bottom: 0;
  z-index: 4;
}
.CodeMirror-gutter-elt {
  position: absolute;
  cursor: default;
  z-index: 4;
}
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }

.CodeMirror-lines {
  cursor: text;
  min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
  /* Reset some styles that the rest of the page might have set */
  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
  border-width: 0;
  background: transparent;
  font-family: inherit;
  font-size: inherit;
  margin: 0;
  white-space: pre;
  word-wrap: normal;
  line-height: inherit;
  color: inherit;
  z-index: 2;
  position: relative;
  overflow: visible;
  -webkit-tap-highlight-color: transparent;
  -webkit-font-variant-ligatures: contextual;
  font-variant-ligatures: contextual;
}
.CodeMirror-wrap pre.CodeMirror-line,
.CodeMirror-wrap pre.CodeMirror-line-like {
  word-wrap: break-word;
  white-space: pre-wrap;
  word-break: normal;
}

.CodeMirror-linebackground {
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  z-index: 0;
}

.CodeMirror-linewidget {
  position: relative;
  z-index: 2;
  padding: 0.1px; /* Force widget margins to stay inside of the container */
}

.CodeMirror-widget {}

.CodeMirror-rtl pre { direction: rtl; }

.CodeMirror-code {
  outline: none;
}

/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}

.CodeMirror-measure {
  position: absolute;
  width: 100%;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

.CodeMirror-cursor {
  position: absolute;
  pointer-events: none;
}
.CodeMirror-measure pre { position: static; }

div.CodeMirror-cursors {
  visibility: hidden;
  position: relative;
  z-index: 3;
}
div.CodeMirror-dragcursors {
  visibility: visible;
}

.CodeMirror-focused div.CodeMirror-cursors {
  visibility: visible;
}

.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }

.cm-searching {
  background-color: #ffa;
  background-color: rgba(255, 255, 0, .4);
}

/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }

@media print {
  /* Hide the cursor when printing */
  .CodeMirror div.CodeMirror-cursors {
    visibility: hidden;
  }
}

/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }

/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }
addons.min.css000060400000003356152455704320007322 0ustar00.CodeMirror-fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:auto;z-index:9}.CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-folded,.CodeMirror-foldgutter-open{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"\25BE"}.CodeMirror-foldgutter-folded:after{content:"\25B8"}.CodeMirror-search-match{background:gold;border-top:1px solid orange;border-bottom:1px solid orange;-moz-box-sizing:border-box;box-sizing:border-box;opacity:.5}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}codemirror.min.js000060400000520664152455704320010051 0ustar00!(function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):(a=a||self,a.CodeMirror=b())})(this,(function(){"use strict";function a(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function b(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.firstChild);return a}function c(a,c){return b(a).appendChild(c)}function d(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f<b.length;++f)e.appendChild(b[f]);return e}function e(a,b,c,e){var f=d(a,b,c,e);return f.setAttribute("role","presentation"),f}function f(a,b){if(3==b.nodeType&&(b=b.parentNode),a.contains)return a.contains(b);do{if(11==b.nodeType&&(b=b.host),b==a)return!0}while(b=b.parentNode)}function g(){var a;try{a=document.activeElement}catch(b){a=document.body||null}for(;a&&a.shadowRoot&&a.shadowRoot.activeElement;)a=a.shadowRoot.activeElement;return a}function h(b,c){var d=b.className;a(c).test(d)||(b.className+=(d?" ":"")+c)}function i(b,c){for(var d=b.split(" "),e=0;e<d.length;e++)d[e]&&!a(d[e]).test(c)&&(c+=" "+d[e]);return c}function j(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function k(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||!1===c&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function l(a,b,c,d,e){null==b&&-1==(b=a.search(/[^\s\u00a0]/))&&(b=a.length);for(var f=d||0,g=e||0;;){var h=a.indexOf("\t",f);if(h<0||h>=b)return g+(b-f);g+=h-f,g+=c-g%c,f=h+1}}function m(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function n(a,b,c){for(var d=0,e=0;;){var f=a.indexOf("\t",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}}function o(a){for(;Vg.length<=a;)Vg.push(p(Vg)+" ");return Vg[a]}function p(a){return a[a.length-1]}function q(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function r(a,b,c){for(var d=0,e=c(b);d<a.length&&c(a[d])<=e;)d++;a.splice(d,0,b)}function s(){}function t(a,b){var c;return Object.create?c=Object.create(a):(s.prototype=a,c=new s),b&&k(b,c),c}function u(a){return/\w/.test(a)||a>"€"&&(a.toUpperCase()!=a.toLowerCase()||Wg.test(a))}function v(a,b){return b?!!(b.source.indexOf("\\w")>-1&&u(a))||b.test(a):u(a)}function w(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function x(a){return a.charCodeAt(0)>=768&&Xg.test(a)}function y(a,b,c){for(;(c<0?b>0:b<a.length)&&x(a.charAt(b));)b+=c;return b}function z(a,b,c){for(var d=b>c?-1:1;;){if(b==c)return b;var e=(b+c)/2,f=d<0?Math.ceil(e):Math.floor(e);if(f==b)return a(f)?b:c;a(f)?c=f:b=f+d}}function A(a,b,c,d){if(!a)return d(b,c,"ltr",0);for(var e=!1,f=0;f<a.length;++f){var g=a[f];(g.from<c&&g.to>b||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr",f),e=!0)}e||d(b,c,"ltr")}function B(a,b,c){var d;Yg=null;for(var e=0;e<a.length;++e){var f=a[e];if(f.from<b&&f.to>b)return e;f.to==b&&(f.from!=f.to&&"before"==c?d=e:Yg=e),f.from==b&&(f.from!=f.to&&"before"!=c?d=e:Yg=e)}return null!=d?d:Yg}function C(a,b){var c=a.order;return null==c&&(c=a.order=Zg(a.text,b)),c}function D(a,b){return a._handlers&&a._handlers[b]||$g}function E(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent("on"+b,c);else{var d=a._handlers,e=d&&d[b];if(e){var f=m(e,c);f>-1&&(d[b]=e.slice(0,f).concat(e.slice(f+1)))}}}function F(a,b){var c=D(a,b);if(c.length)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)}function G(a,b,c){return"string"==typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}}),F(a,c||b.type,a,b),M(b)||b.codemirrorIgnore}function H(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(var c=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]),d=0;d<b.length;++d)-1==m(c,b[d])&&c.push(b[d])}function I(a,b){return D(a,b).length>0}function J(a){a.prototype.on=function(a,b){_g(this,a,b)},a.prototype.off=function(a,b){E(this,a,b)}}function K(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function L(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function M(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.returnValue}function N(a){K(a),L(a)}function O(a){return a.target||a.srcElement}function P(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),Eg&&a.ctrlKey&&1==b&&(b=3),b}function Q(a){if(null==Og){var b=d("span","​");c(a,d("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(Og=b.offsetWidth<=1&&b.offsetHeight>2&&!(sg&&tg<8))}var e=Og?d("span","​"):d("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return e.setAttribute("cm-text",""),e}function R(a){if(null!=Pg)return Pg;var d=c(a,document.createTextNode("AخA")),e=Ig(d,0,1).getBoundingClientRect(),f=Ig(d,1,2).getBoundingClientRect();return b(a),!(!e||e.left==e.right)&&(Pg=f.right-e.right<3)}function S(a){if(null!=eh)return eh;var b=c(a,d("span","x")),e=b.getBoundingClientRect(),f=Ig(b,0,1).getBoundingClientRect();return eh=Math.abs(e.left-f.left)>1}function T(a,b){arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),fh[a]=b}function U(a,b){gh[a]=b}function V(a){if("string"==typeof a&&gh.hasOwnProperty(a))a=gh[a];else if(a&&"string"==typeof a.name&&gh.hasOwnProperty(a.name)){var b=gh[a.name];"string"==typeof b&&(b={name:b}),a=t(b,a),a.name=b.name}else{if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return V("application/xml");if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+json$/.test(a))return V("application/json")}return"string"==typeof a?{name:a}:a||{name:"null"}}function W(a,b){b=V(b);var c=fh[b.name];if(!c)return W(a,"text/plain");var d=c(a,b);if(hh.hasOwnProperty(b.name)){var e=hh[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var g in b.modeProps)d[g]=b.modeProps[g];return d}function X(a,b){k(b,hh.hasOwnProperty(a)?hh[a]:hh[a]={})}function Y(a,b){if(!0===b)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c}function Z(a,b){for(var c;a.innerMode&&(c=a.innerMode(b))&&c.mode!=a;)b=c.state,a=c.mode;return c||{mode:a,state:b}}function $(a,b,c){return!a.startState||a.startState(b,c)}function _(a,b){if((b-=a.first)<0||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(b<f){c=e;break}b-=f}return c.lines[b]}function aa(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,(function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e})),d}function ba(a,b,c){var d=[];return a.iter(b,c,(function(a){d.push(a.text)})),d}function ca(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function da(a){if(null==a.parent)return null;for(var b=a.parent,c=m(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function ea(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(b<f){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var g=0;g<a.lines.length;++g){var h=a.lines[g],i=h.height;if(b<i)break;b-=i}return c+g}function fa(a,b){return b>=a.first&&b<a.first+a.size}function ga(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function ha(a,b,c){if(void 0===c&&(c=null),!(this instanceof ha))return new ha(a,b,c);this.line=a,this.ch=b,this.sticky=c}function ia(a,b){return a.line-b.line||a.ch-b.ch}function ja(a,b){return a.sticky==b.sticky&&0==ia(a,b)}function ka(a){return ha(a.line,a.ch)}function la(a,b){return ia(a,b)<0?b:a}function ma(a,b){return ia(a,b)<0?a:b}function na(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function oa(a,b){if(b.line<a.first)return ha(a.first,0);var c=a.first+a.size-1;return b.line>c?ha(c,_(a,c).text.length):pa(b,_(a,b.line).text.length)}function pa(a,b){var c=a.ch;return null==c||c>b?ha(a.line,b):c<0?ha(a.line,0):a}function qa(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=oa(a,b[d]);return c}function ra(a,b,c,d){var e=[a.state.modeGen],f={};za(a,b.text,a.doc.mode,c,(function(a,b){return e.push(a,b)}),f,d);for(var g=c.state,h=0;h<a.state.overlays.length;++h)!(function(d){c.baseTokens=e;var h=a.state.overlays[d],i=1,j=0;c.state=!0,za(a,b.text,h.mode,c,(function(a,b){for(var c=i;j<a;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"overlay "+b),i=c+2;else for(;c<i;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"overlay "+b}}),f),c.state=g,c.baseTokens=null,c.baseTokenPos=1})(h);return{styles:e,classes:f.bgClass||f.textClass?f:null}}function sa(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=ta(a,da(b)),e=b.text.length>a.options.maxHighlightLength&&Y(a.doc.mode,d.state),f=ra(a,b,d);e&&(d.state=e),b.stateAfter=d.save(!e),b.styles=f.styles,f.classes?b.styleClasses=f.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.highlightFrontier&&(a.doc.modeFrontier=Math.max(a.doc.modeFrontier,++a.doc.highlightFrontier))}return b.styles}function ta(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return new kh(d,!0,b);var f=Aa(a,b,c),g=f>d.first&&_(d,f-1).stateAfter,h=g?kh.fromSaved(d,g,f):new kh(d,$(d.mode),f);return d.iter(f,b,(function(c){ua(a,c.text,h);var d=h.line;c.stateAfter=d==b-1||d%5==0||d>=e.viewFrom&&d<e.viewTo?h.save():null,h.nextLine()})),c&&(d.modeFrontier=h.line),h}function ua(a,b,c,d){var e=a.doc.mode,f=new ih(b,a.options.tabSize,c);for(f.start=f.pos=d||0,""==b&&va(e,c.state);!f.eol();)wa(e,f,c.state),f.start=f.pos}function va(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=Z(a,b);return c.mode.blankLine?c.mode.blankLine(c.state):void 0}}function wa(a,b,c,d){for(var e=0;e<10;e++){d&&(d[0]=Z(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function xa(a,b,c,d){var e,f=a.doc,g=f.mode;b=oa(f,b);var h,i=_(f,b.line),j=ta(a,b.line,c),k=new ih(i.text,a.options.tabSize,j);for(d&&(h=[]);(d||k.pos<b.ch)&&!k.eol();)k.start=k.pos,e=wa(g,k,j.state),d&&h.push(new lh(k,e,Y(f.mode,j.state)));return d?h:new lh(k,e,j.state)}function ya(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?"bgClass":"textClass";null==b[d]?b[d]=c[2]:new RegExp("(?:^|\\s)"+c[2]+"(?:$|\\s)").test(b[d])||(b[d]+=" "+c[2])}return a}function za(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var i,j=0,k=null,l=new ih(b,a.options.tabSize,d),m=a.options.addModeClass&&[null];for(""==b&&ya(va(c,d.state),f);!l.eol();){if(l.pos>a.options.maxHighlightLength?(h=!1,g&&ua(a,b,d,l.pos),l.pos=b.length,i=null):i=ya(wa(c,l,d.state,m),f),m){var n=m[0].name;n&&(i="m-"+(i?n+" "+i:n))}if(!h||k!=i){for(;j<l.start;)j=Math.min(l.start,j+5e3),e(j,k);k=i}l.start=l.pos}for(;j<l.pos;){var o=Math.min(l.pos,j+5e3);e(o,k),j=o}}function Aa(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e3:100),h=b;h>g;--h){if(h<=f.first)return f.first;var i=_(f,h-1),j=i.stateAfter;if(j&&(!c||h+(j instanceof jh?j.lookAhead:0)<=f.modeFrontier))return h;var k=l(i.text,null,a.options.tabSize);(null==e||d>k)&&(e=h-1,d=k)}return e}function Ba(a,b){if(a.modeFrontier=Math.min(a.modeFrontier,b),!(a.highlightFrontier<b-10)){for(var c=a.first,d=b-1;d>c;d--){var e=_(a,d).stateAfter;if(e&&(!(e instanceof jh)||d+e.lookAhead<b)){c=d+1;break}}a.highlightFrontier=Math.min(a.highlightFrontier,c)}}function Ca(){mh=!0}function Da(){nh=!0}function Ea(a,b,c){this.marker=a,this.from=b,this.to=c}function Fa(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function Ga(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function Ha(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.attachLine(a)}function Ia(a,b,c){var d;if(a)for(var e=0;e<a.length;++e){var f=a[e],g=f.marker,h=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);if(h||f.from==b&&"bookmark"==g.type&&(!c||!f.marker.insertLeft)){var i=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);(d||(d=[])).push(new Ea(g,f.from,i?null:f.to))}}return d}function Ja(a,b,c){var d;if(a)for(var e=0;e<a.length;++e){var f=a[e],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);(d||(d=[])).push(new Ea(g,i?null:f.from-b,null==f.to?null:f.to-b))}}return d}function Ka(a,b){if(b.full)return null;var c=fa(a,b.from.line)&&_(a,b.from.line).markedSpans,d=fa(a,b.to.line)&&_(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==ia(b.from,b.to),h=Ia(c,e,g),i=Ja(d,f,g),j=1==b.text.length,k=p(b.text).length+(j?e:0);if(h)for(var l=0;l<h.length;++l){var m=h[l];if(null==m.to){var n=Fa(i,m.marker);n?j&&(m.to=null==n.to?null:n.to+k):m.to=e}}if(i)for(var o=0;o<i.length;++o){var q=i[o];if(null!=q.to&&(q.to+=k),null==q.from){var r=Fa(h,q.marker);r||(q.from=k,j&&(h||(h=[])).push(q))}else q.from+=k,j&&(h||(h=[])).push(q)}h&&(h=La(h)),i&&i!=h&&(i=La(i));var s=[h];if(!j){var t,u=b.text.length-2;if(u>0&&h)for(var v=0;v<h.length;++v)null==h[v].to&&(t||(t=[])).push(new Ea(h[v].marker,null,null));for(var w=0;w<u;++w)s.push(t);s.push(i)}return s}function La(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&!1!==c.marker.clearWhenEmpty&&a.splice(b--,1)}return a.length?a:null}function Ma(a,b,c){var d=null;if(a.iter(b.line,c.line+1,(function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=m(d,c)||(d||(d=[])).push(c)}})),!d)return null;for(var e=[{from:b,to:c}],f=0;f<d.length;++f)for(var g=d[f],h=g.find(0),i=0;i<e.length;++i){var j=e[i];if(!(ia(j.to,h.from)<0||ia(j.from,h.to)>0)){var k=[i,1],l=ia(j.from,h.from),n=ia(j.to,h.to);(l<0||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(n>0||!g.inclusiveRight&&!n)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-3}}return e}function Na(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function Oa(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function Pa(a){return a.inclusiveLeft?-1:0}function Qa(a){return a.inclusiveRight?1:0}function Ra(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var d=a.find(),e=b.find(),f=ia(d.from,e.from)||Pa(a)-Pa(b);if(f)return-f;var g=ia(d.to,e.to)||Qa(a)-Qa(b);return g||b.id-a.id}function Sa(a,b){var c,d=nh&&a.markedSpans;if(d)for(var e=void 0,f=0;f<d.length;++f)e=d[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!c||Ra(c,e.marker)<0)&&(c=e.marker);return c}function Ta(a){return Sa(a,!0)}function Ua(a){return Sa(a,!1)}function Va(a,b){var c,d=nh&&a.markedSpans;if(d)for(var e=0;e<d.length;++e){var f=d[e];f.marker.collapsed&&(null==f.from||f.from<b)&&(null==f.to||f.to>b)&&(!c||Ra(c,f.marker)<0)&&(c=f.marker)}return c}function Wa(a,b,c,d,e){var f=_(a,b),g=nh&&f.markedSpans;if(g)for(var h=0;h<g.length;++h){var i=g[h];if(i.marker.collapsed){var j=i.marker.find(0),k=ia(j.from,c)||Pa(i.marker)-Pa(e),l=ia(j.to,d)||Qa(i.marker)-Qa(e);if(!(k>=0&&l<=0||k<=0&&l>=0)&&(k<=0&&(i.marker.inclusiveRight&&e.inclusiveLeft?ia(j.to,c)>=0:ia(j.to,c)>0)||k>=0&&(i.marker.inclusiveRight&&e.inclusiveLeft?ia(j.from,d)<=0:ia(j.from,d)<0)))return!0}}}function Xa(a){for(var b;b=Ta(a);)a=b.find(-1,!0).line;return a}function Ya(a){for(var b;b=Ua(a);)a=b.find(1,!0).line;return a}function Za(a){for(var b,c;b=Ua(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function $a(a,b){var c=_(a,b),d=Xa(c);return c==d?b:da(d)}function _a(a,b){if(b>a.lastLine())return b;var c,d=_(a,b);if(!ab(a,d))return b;for(;c=Ua(d);)d=c.find(1,!0).line;return da(d)+1}function ab(a,b){var c=nh&&b.markedSpans;if(c)for(var d=void 0,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed){if(null==d.from)return!0;if(!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&bb(a,b,d))return!0}}function bb(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return bb(a,d.line,Fa(d.line.markedSpans,c.marker))}if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var e=void 0,f=0;f<b.markedSpans.length;++f)if(e=b.markedSpans[f],e.marker.collapsed&&!e.marker.widgetNode&&e.from==c.to&&(null==e.to||e.to!=c.from)&&(e.marker.inclusiveLeft||c.marker.inclusiveRight)&&bb(a,b,e))return!0}function cb(a){a=Xa(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;b+=e.height}for(var f=c.parent;f;c=f,f=c.parent)for(var g=0;g<f.children.length;++g){var h=f.children[g];if(h==c)break;b+=h.height}return b}function db(a){if(0==a.height)return 0;for(var b,c=a.text.length,d=a;b=Ta(d);){var e=b.find(0,!0);d=e.from.line,c+=e.from.ch-e.to.ch}for(d=a;b=Ua(d);){var f=b.find(0,!0);c-=d.text.length-f.from.ch,d=f.to.line,c+=d.text.length-f.to.ch}return c}function eb(a){var b=a.display,c=a.doc;b.maxLine=_(c,c.first),b.maxLineLength=db(b.maxLine),b.maxLineChanged=!0,c.iter((function(a){var c=db(a);c>b.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)}))}function fb(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null),null!=a.order&&(a.order=null),Na(a),Oa(a,c);var e=d?d(a):1;e!=a.height&&ca(a,e)}function gb(a){a.parent=null,Na(a)}function hb(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?rh:qh;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function ib(a,b){var c=e("span",null,null,ug?"padding-right: .1px":null),d={pre:e("pre",[c],"CodeMirror-line"),content:c,col:0,pos:0,cm:a,trailingSpace:!1,splitSpaces:a.getOption("lineWrapping")};b.measure={};for(var f=0;f<=(b.rest?b.rest.length:0);f++){var g=f?b.rest[f-1]:b.line,h=void 0;d.pos=0,d.addToken=kb,R(a.display.measure)&&(h=C(g,a.doc.direction))&&(d.addToken=mb(d.addToken,h)),d.map=[];ob(g,d,sa(a,g,b!=a.display.externalMeasured&&da(g))),g.styleClasses&&(g.styleClasses.bgClass&&(d.bgClass=i(g.styleClasses.bgClass,d.bgClass||"")),g.styleClasses.textClass&&(d.textClass=i(g.styleClasses.textClass,d.textClass||""))),0==d.map.length&&d.map.push(0,0,d.content.appendChild(Q(a.display.measure))),0==f?(b.measure.map=d.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(d.map),(b.measure.caches||(b.measure.caches=[])).push({}))}if(ug){var j=d.content.lastChild;(/\bcm-tab\b/.test(j.className)||j.querySelector&&j.querySelector(".cm-tab"))&&(d.content.className="cm-tab-wrap-hack")}return F(a,"renderLine",a,b.line,d.pre),d.pre.className&&(d.textClass=i(d.pre.className,d.textClass||"")),d}function jb(a){var b=d("span","•","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b.setAttribute("aria-label",b.title),b}function kb(a,b,c,e,f,g,h){if(b){var i,j=a.splitSpaces?lb(b,a.trailingSpace):b,k=a.cm.state.specialChars,l=!1;if(k.test(b)){i=document.createDocumentFragment();for(var m=0;;){k.lastIndex=m;var n=k.exec(b),p=n?n.index-m:b.length-m;if(p){var q=document.createTextNode(j.slice(m,m+p));sg&&tg<9?i.appendChild(d("span",[q])):i.appendChild(q),a.map.push(a.pos,a.pos+p,q),a.col+=p,a.pos+=p}if(!n)break;m+=p+1;var r=void 0;if("\t"==n[0]){var s=a.cm.options.tabSize,t=s-a.col%s;r=i.appendChild(d("span",o(t),"cm-tab")),r.setAttribute("role","presentation"),r.setAttribute("cm-text","\t"),a.col+=t}else"\r"==n[0]||"\n"==n[0]?(r=i.appendChild(d("span","\r"==n[0]?"␍":"␤","cm-invalidchar")),r.setAttribute("cm-text",n[0]),a.col+=1):(r=a.cm.options.specialCharPlaceholder(n[0]),r.setAttribute("cm-text",n[0]),sg&&tg<9?i.appendChild(d("span",[r])):i.appendChild(r),a.col+=1);a.map.push(a.pos,a.pos+1,r),a.pos++}}else a.col+=b.length,i=document.createTextNode(j),a.map.push(a.pos,a.pos+b.length,i),sg&&tg<9&&(l=!0),a.pos+=b.length;if(a.trailingSpace=32==j.charCodeAt(b.length-1),c||e||f||l||g||h){var u=c||"";e&&(u+=e),f&&(u+=f);var v=d("span",[i],u,g);if(h)for(var w in h)h.hasOwnProperty(w)&&"style"!=w&&"class"!=w&&v.setAttribute(w,h[w]);return a.content.appendChild(v)}a.content.appendChild(i)}}function lb(a,b){if(a.length>1&&!/  /.test(a))return a;for(var c=b,d="",e=0;e<a.length;e++){var f=a.charAt(e);" "!=f||!c||e!=a.length-1&&32!=a.charCodeAt(e+1)||(f=" "),d+=f,c=" "==f}return d}function mb(a,b){return function(c,d,e,f,g,h,i){e=e?e+" cm-force-border":"cm-force-border";for(var j=c.pos,k=j+d.length;;){for(var l=void 0,m=0;m<b.length&&(l=b[m],!(l.to>j&&l.from<=j));m++);if(l.to>=k)return a(c,d,e,f,g,h,i);a(c,d.slice(0,l.to-j),e,f,null,h,i),f=null,d=d.slice(l.to-j),j=l.to}}}function nb(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e),!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id)),e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e)),a.pos+=b,a.trailingSpace=!1}function ob(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var g,h,i,j,k,l,m,n=e.length,o=0,p=1,q="",r=0;;){if(r==o){i=j=k=h="",m=null,l=null,r=1/0;for(var s=[],t=void 0,u=0;u<d.length;++u){var v=d[u],w=v.marker;if("bookmark"==w.type&&v.from==o&&w.widgetNode)s.push(w);else if(v.from<=o&&(null==v.to||v.to>o||w.collapsed&&v.to==o&&v.from==o)){if(null!=v.to&&v.to!=o&&r>v.to&&(r=v.to,j=""),w.className&&(i+=" "+w.className),w.css&&(h=(h?h+";":"")+w.css),w.startStyle&&v.from==o&&(k+=" "+w.startStyle),w.endStyle&&v.to==r&&(t||(t=[])).push(w.endStyle,v.to),w.title&&((m||(m={})).title=w.title),w.attributes)for(var x in w.attributes)(m||(m={}))[x]=w.attributes[x];w.collapsed&&(!l||Ra(l.marker,w)<0)&&(l=v)}else v.from>o&&r>v.from&&(r=v.from)}if(t)for(var y=0;y<t.length;y+=2)t[y+1]==r&&(j+=" "+t[y]);if(!l||l.from==o)for(var z=0;z<s.length;++z)nb(b,0,s[z]);if(l&&(l.from||0)==o){if(nb(b,(null==l.to?n+1:l.to)-o,l.marker,null==l.from),null==l.to)return;l.to==o&&(l=!1)}}if(o>=n)break;for(var A=Math.min(n,r);;){if(q){var B=o+q.length;if(!l){var C=B>A?q.slice(0,A-o):q;b.addToken(b,C,g?g+i:i,k,o+C.length==r?j:"",h,m)}if(B>=A){q=q.slice(A-o),o=A;break}o=B,k=""}q=e.slice(f,f=c[p++]),g=hb(c[p++],b.cm.options)}}else for(var D=1;D<c.length;D+=2)b.addToken(b,e.slice(f,f=c[D]),hb(c[D+1],b.cm.options))}function pb(a,b,c){this.line=b,this.rest=Za(b),this.size=this.rest?da(p(this.rest))-c+1:1,this.node=this.text=null,this.hidden=ab(a,b)}function qb(a,b,c){for(var d,e=[],f=b;f<c;f=d){var g=new pb(a.doc,_(a.doc,f),f);d=f+g.size,e.push(g)}return e}function rb(a){sh?sh.ops.push(a):a.ownsGroup=sh={ops:[a],delayedCallbacks:[]}}function sb(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c].call(null);for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++].call(null,e.cm)}}while(c<b.length)}function tb(a,b){var c=a.ownsGroup;if(c)try{sb(c)}finally{sh=null,b(c)}}function ub(a,b){var c=D(a,b);if(c.length){var d,e=Array.prototype.slice.call(arguments,2);sh?d=sh.delayedCallbacks:th?d=th:(d=th=[],setTimeout(vb,0));for(var f=0;f<c.length;++f)!(function(a){d.push((function(){return c[a].apply(null,e)}))})(f)}}function vb(){var a=th;th=null;for(var b=0;b<a.length;++b)a[b]()}function wb(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];"text"==f?Ab(a,b):"gutter"==f?Cb(a,b,c,d):"class"==f?Bb(a,b):"widget"==f&&Db(a,b,d)}b.changes=null}function xb(a){return a.node==a.text&&(a.node=d("div",null,null,"position: relative"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),sg&&tg<8&&(a.node.style.zIndex=2)),a.node}function yb(a,b){var c=b.bgClass?b.bgClass+" "+(b.line.bgClass||""):b.line.bgClass;if(c&&(c+=" CodeMirror-linebackground"),b.background)c?b.background.className=c:(b.background.parentNode.removeChild(b.background),b.background=null);else if(c){var e=xb(b);b.background=e.insertBefore(d("div",null,c),e.firstChild),a.display.input.setUneditable(b.background)}}function zb(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):ib(a,b)}function Ab(a,b){var c=b.text.className,d=zb(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,Bb(a,b)):c&&(b.text.className=c)}function Bb(a,b){yb(a,b),b.line.wrapClass?xb(b).className=b.line.wrapClass:b.node!=b.text&&(b.node.className="");var c=b.textClass?b.textClass+" "+(b.line.textClass||""):b.line.textClass;b.text.className=c||""}function Cb(a,b,c,e){if(b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null),b.gutterBackground&&(b.node.removeChild(b.gutterBackground),b.gutterBackground=null),b.line.gutterClass){var f=xb(b);b.gutterBackground=d("div",null,"CodeMirror-gutter-background "+b.line.gutterClass,"left: "+(a.options.fixedGutter?e.fixedPos:-e.gutterTotalWidth)+"px; width: "+e.gutterTotalWidth+"px"),a.display.input.setUneditable(b.gutterBackground),f.insertBefore(b.gutterBackground,b.text)}var g=b.line.gutterMarkers;if(a.options.lineNumbers||g){var h=xb(b),i=b.gutter=d("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?e.fixedPos:-e.gutterTotalWidth)+"px");if(a.display.input.setUneditable(i),h.insertBefore(i,b.text),b.line.gutterClass&&(i.className+=" "+b.line.gutterClass),!a.options.lineNumbers||g&&g["CodeMirror-linenumbers"]||(b.lineNumber=i.appendChild(d("div",ga(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+e.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),g)for(var j=0;j<a.display.gutterSpecs.length;++j){var k=a.display.gutterSpecs[j].className,l=g.hasOwnProperty(k)&&g[k];l&&i.appendChild(d("div",[l],"CodeMirror-gutter-elt","left: "+e.gutterLeft[k]+"px; width: "+e.gutterWidth[k]+"px"))}}}function Db(b,c,d){c.alignable&&(c.alignable=null);for(var e=a("CodeMirror-linewidget"),f=c.node.firstChild,g=void 0;f;f=g)g=f.nextSibling,e.test(f.className)&&c.node.removeChild(f);Fb(b,c,d)}function Eb(a,b,c,d){var e=zb(a,b);return b.text=b.node=e.pre,e.bgClass&&(b.bgClass=e.bgClass),e.textClass&&(b.textClass=e.textClass),Bb(a,b),Cb(a,b,c,d),Fb(a,b,d),b.node}function Fb(a,b,c){if(Gb(a,b.line,b,c,!0),b.rest)for(var d=0;d<b.rest.length;d++)Gb(a,b.rest[d],b,c,!1)}function Gb(a,b,c,e,f){if(b.widgets)for(var g=xb(c),h=0,i=b.widgets;h<i.length;++h){var j=i[h],k=d("div",[j.node],"CodeMirror-linewidget"+(j.className?" "+j.className:""));j.handleMouseEvents||k.setAttribute("cm-ignore-events","true"),Hb(j,k,c,e),a.display.input.setUneditable(k),f&&j.above?g.insertBefore(k,c.gutter||c.text):g.appendChild(k),ub(j,"redraw")}}function Hb(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).push(b);var e=d.wrapperWidth;b.style.left=d.fixedPos+"px",a.coverGutter||(e-=d.gutterTotalWidth,b.style.paddingLeft=d.gutterTotalWidth+"px"),b.style.width=e+"px"}a.coverGutter&&(b.style.zIndex=5,b.style.position="relative",a.noHScroll||(b.style.marginLeft=-d.gutterTotalWidth+"px"))}function Ib(a){if(null!=a.height)return a.height;var b=a.doc.cm;if(!b)return 0;if(!f(document.body,a.node)){var e="position: relative;";a.coverGutter&&(e+="margin-left: -"+b.display.gutters.offsetWidth+"px;"),a.noHScroll&&(e+="width: "+b.display.wrapper.clientWidth+"px;"),c(b.display.measure,d("div",[a.node],null,e))}return a.height=a.node.parentNode.offsetHeight}function Jb(a,b){for(var c=O(b);c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function Kb(a){return a.lineSpace.offsetTop}function Lb(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function Mb(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=c(a.measure,d("pre","x","CodeMirror-line-like")),e=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,f={left:parseInt(e.paddingLeft),right:parseInt(e.paddingRight)};return isNaN(f.left)||isNaN(f.right)||(a.cachedPaddingH=f),f}function Nb(a){return Qg-a.display.nativeBarWidth}function Ob(a){return a.display.scroller.clientWidth-Nb(a)-a.display.barWidth}function Pb(a){return a.display.scroller.clientHeight-Nb(a)-a.display.barHeight}function Qb(a,b,c){var d=a.options.lineWrapping,e=d&&Ob(a);if(!b.measure.heights||d&&b.measure.width!=e){var f=b.measure.heights=[];if(d){b.measure.width=e;for(var g=b.text.firstChild.getClientRects(),h=0;h<g.length-1;h++){var i=g[h],j=g[h+1];Math.abs(i.bottom-j.bottom)>2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function Rb(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(var e=0;e<a.rest.length;e++)if(da(a.rest[e])>c)return{map:a.measure.maps[e],cache:a.measure.caches[e],before:!0}}function Sb(a,b){b=Xa(b);var d=da(b),e=a.display.externalMeasured=new pb(a.doc,b,d);e.lineN=d;var f=e.built=ib(a,e);return e.text=f.pre,c(a.display.lineMeasure,f.pre),e}function Tb(a,b,c,d){return Wb(a,Vb(a,b),c,d)}function Ub(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[zc(a,b)];var c=a.display.externalMeasured;return c&&b>=c.lineN&&b<c.lineN+c.size?c:void 0}function Vb(a,b){var c=da(b),d=Ub(a,c);d&&!d.text?d=null:d&&d.changes&&(wb(a,d,c,uc(a)),a.curOp.forceUpdate=!0),d||(d=Sb(a,b));var e=Rb(d,b,c);return{line:b,view:d,rect:null,map:e.map,cache:e.cache,before:e.before,hasHeights:!1}}function Wb(a,b,c,d,e){b.before&&(c=-1);var f,g=c+(d||"");return b.cache.hasOwnProperty(g)?f=b.cache[g]:(b.rect||(b.rect=b.view.text.getBoundingClientRect()),b.hasHeights||(Qb(a,b.view,b.rect),b.hasHeights=!0),f=Zb(a,b,c,d),f.bogus||(b.cache[g]=f)),{left:f.left,right:f.right,top:e?f.rtop:f.top,bottom:e?f.rbottom:f.bottom}}function Xb(a,b,c){for(var d,e,f,g,h,i,j=0;j<a.length;j+=3)if(h=a[j],i=a[j+1],b<h?(e=0,f=1,g="left"):b<i?(e=b-h,f=e+1):(j==a.length-3||b==i&&a[j+3]>b)&&(f=i-h,e=f-1,b>=i&&(g="right")),null!=e){if(d=a[j+2],h==i&&c==(d.insertLeft?"left":"right")&&(g=c),"left"==c&&0==e)for(;j&&a[j-2]==a[j-3]&&a[j-1].insertLeft;)d=a[2+(j-=3)],g="left";if("right"==c&&e==i-h)for(;j<a.length-3&&a[j+3]==a[j+4]&&!a[j+5].insertLeft;)d=a[(j+=3)+2],g="right";break}return{node:d,start:e,end:f,collapse:g,coverStart:h,coverEnd:i}}function Yb(a,b){var c=uh;if("left"==b)for(var d=0;d<a.length&&(c=a[d]).left==c.right;d++);else for(var e=a.length-1;e>=0&&(c=a[e]).left==c.right;e--);return c}function Zb(a,b,c,d){var e,f=Xb(b.map,c,d),g=f.node,h=f.start,i=f.end,j=f.collapse;if(3==g.nodeType){for(var k=0;k<4;k++){for(;h&&x(b.line.text.charAt(f.coverStart+h));)--h;for(;f.coverStart+i<f.coverEnd&&x(b.line.text.charAt(f.coverStart+i));)++i;if(e=sg&&tg<9&&0==h&&i==f.coverEnd-f.coverStart?g.parentNode.getBoundingClientRect():Yb(Ig(g,h,i).getClientRects(),d),e.left||e.right||0==h)break;i=h,h-=1,j="right"}sg&&tg<11&&(e=$b(a.display.measure,e))}else{h>0&&(j=d="right");var l;e=a.options.lineWrapping&&(l=g.getClientRects()).length>1?l["right"==d?l.length-1:0]:g.getBoundingClientRect()}if(sg&&tg<9&&!h&&(!e||!e.left&&!e.right)){var m=g.parentNode.getClientRects()[0];e=m?{left:m.left,right:m.left+tc(a.display),top:m.top,bottom:m.bottom}:uh}for(var n=e.top-b.rect.top,o=e.bottom-b.rect.top,p=(n+o)/2,q=b.view.measure.heights,r=0;r<q.length-1&&!(p<q[r]);r++);var s=r?q[r-1]:0,t=q[r],u={left:("right"==j?e.right:e.left)-b.rect.left,right:("left"==j?e.left:e.right)-b.rect.left,top:s,bottom:t};return e.left||e.right||(u.bogus=!0),a.options.singleCursorHeightPerLine||(u.rtop=n,u.rbottom=o),u}function $b(a,b){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!S(a))return b;var c=screen.logicalXDPI/screen.deviceXDPI,d=screen.logicalYDPI/screen.deviceYDPI;return{left:b.left*c,right:b.right*c,top:b.top*d,bottom:b.bottom*d}}function _b(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,
a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function ac(a){a.display.externalMeasure=null,b(a.display.lineMeasure);for(var c=0;c<a.display.view.length;c++)_b(a.display.view[c])}function bc(a){ac(a),a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null,a.options.lineWrapping||(a.display.maxLineChanged=!0),a.display.lineNumChars=null}function cc(){return wg&&Cg?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function dc(){return wg&&Cg?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function ec(a){var b=0;if(a.widgets)for(var c=0;c<a.widgets.length;++c)a.widgets[c].above&&(b+=Ib(a.widgets[c]));return b}function fc(a,b,c,d,e){if(!e){var f=ec(b);c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=cb(b);if("local"==d?g+=Kb(a.display):g-=a.display.viewOffset,"page"==d||"window"==d){var h=a.display.lineSpace.getBoundingClientRect();g+=h.top+("window"==d?0:dc());var i=h.left+("window"==d?0:cc());c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function gc(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==c)d-=cc(),e-=dc();else if("local"==c||!c){var f=a.display.sizer.getBoundingClientRect();d+=f.left,e+=f.top}var g=a.display.lineSpace.getBoundingClientRect();return{left:d-g.left,top:e-g.top}}function hc(a,b,c,d,e){return d||(d=_(a.doc,b.line)),fc(a,d,Tb(a,d,b.ch,e),c)}function ic(a,b,c,d,e,f){function g(b,g){var h=Wb(a,e,b,g?"right":"left",f);return g?h.left=h.right:h.right=h.left,fc(a,d,h,c)}function h(a,b,c){var d=i[b],e=1==d.level;return g(c?a-1:a,e!=c)}d=d||_(a.doc,b.line),e||(e=Vb(a,d));var i=C(d,a.doc.direction),j=b.ch,k=b.sticky;if(j>=d.text.length?(j=d.text.length,k="before"):j<=0&&(j=0,k="after"),!i)return g("before"==k?j-1:j,"before"==k);var l=B(i,j,k),m=Yg,n=h(j,l,"before"==k);return null!=m&&(n.other=h(j,m,"before"!=k)),n}function jc(a,b){var c=0;b=oa(a.doc,b),a.options.lineWrapping||(c=tc(a.display)*b.ch);var d=_(a.doc,b.line),e=cb(d)+Kb(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function kc(a,b,c,d,e){var f=ha(a,b,c);return f.xRel=e,d&&(f.outside=d),f}function lc(a,b,c){var d=a.doc;if((c+=a.display.viewOffset)<0)return kc(d.first,0,null,-1,-1);var e=ea(d,c),f=d.first+d.size-1;if(e>f)return kc(d.first+d.size-1,_(d,f).text.length,null,1,1);b<0&&(b=0);for(var g=_(d,e);;){var h=pc(a,g,e,b,c),i=Va(g,h.ch+(h.xRel>0||h.outside>0?1:0));if(!i)return h;var j=i.find(1);if(j.line==e)return j;g=_(d,e=j.line)}}function mc(a,b,c,d){d-=ec(b);var e=b.text.length,f=z((function(b){return Wb(a,c,b-1).bottom<=d}),e,0);return e=z((function(b){return Wb(a,c,b).top>d}),f,e),{begin:f,end:e}}function nc(a,b,c,d){return c||(c=Vb(a,b)),mc(a,b,c,fc(a,b,Wb(a,c,d),"line").top)}function oc(a,b,c,d){return!(a.bottom<=c)&&(a.top>c||(d?a.left:a.right)>b)}function pc(a,b,c,d,e){e-=cb(b);var f=Vb(a,b),g=ec(b),h=0,i=b.text.length,j=!0,k=C(b,a.doc.direction);if(k){var l=(a.options.lineWrapping?rc:qc)(a,b,c,f,k,d,e);j=1!=l.level,h=j?l.from:l.to-1,i=j?l.to:l.from-1}var m,n,o=null,p=null,q=z((function(b){var c=Wb(a,f,b);return c.top+=g,c.bottom+=g,!!oc(c,d,e,!1)&&(c.top<=e&&c.left<=d&&(o=b,p=c),!0)}),h,i),r=!1;if(p){var s=d-p.left<p.right-d,t=s==j;q=o+(t?0:1),n=t?"after":"before",m=s?p.left:p.right}else{j||q!=i&&q!=h||q++,n=0==q?"after":q==b.text.length?"before":Wb(a,f,q-(j?1:0)).bottom+g<=e==j?"after":"before";var u=ic(a,ha(c,q,n),"line",b,f);m=u.left,r=e<u.top?-1:e>=u.bottom?1:0}return q=y(b.text,q,1),kc(c,q,n,r,d-m)}function qc(a,b,c,d,e,f,g){var h=z((function(h){var i=e[h],j=1!=i.level;return oc(ic(a,ha(c,j?i.to:i.from,j?"before":"after"),"line",b,d),f,g,!0)}),0,e.length-1),i=e[h];if(h>0){var j=1!=i.level,k=ic(a,ha(c,j?i.from:i.to,j?"after":"before"),"line",b,d);oc(k,f,g,!0)&&k.top>g&&(i=e[h-1])}return i}function rc(a,b,c,d,e,f,g){var h=mc(a,b,d,g),i=h.begin,j=h.end;/\s/.test(b.text.charAt(j-1))&&j--;for(var k=null,l=null,m=0;m<e.length;m++){var n=e[m];if(!(n.from>=j||n.to<=i)){var o=1!=n.level,p=Wb(a,d,o?Math.min(j,n.to)-1:Math.max(i,n.from)).right,q=p<f?f-p+1e9:p-f;(!k||l>q)&&(k=n,l=q)}}return k||(k=e[e.length-1]),k.from<i&&(k={from:i,to:k.to,level:k.level}),k.to>j&&(k={from:k.from,to:j,level:k.level}),k}function sc(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==ph){ph=d("pre",null,"CodeMirror-line-like");for(var e=0;e<49;++e)ph.appendChild(document.createTextNode("x")),ph.appendChild(d("br"));ph.appendChild(document.createTextNode("x"))}c(a.measure,ph);var f=ph.offsetHeight/50;return f>3&&(a.cachedTextHeight=f),b(a.measure),f||1}function tc(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=d("span","xxxxxxxxxx"),e=d("pre",[b],"CodeMirror-line-like");c(a.measure,e);var f=b.getBoundingClientRect(),g=(f.right-f.left)/10;return g>2&&(a.cachedCharWidth=g),g||10}function uc(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g){var h=a.display.gutterSpecs[g].className;c[h]=f.offsetLeft+f.clientLeft+e,d[h]=f.clientWidth}return{fixedPos:vc(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function vc(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function wc(a){var b=sc(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/tc(a.display)-3);return function(e){if(ab(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function xc(a){var b=a.doc,c=wc(a);b.iter((function(a){var b=c(a);b!=a.height&&ca(a,b)}))}function yc(a,b,c,d){var e=a.display;if(!c&&"true"==O(b).getAttribute("cm-not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(a){return null}var i,j=lc(a,f,g);if(d&&j.xRel>0&&(i=_(a.doc,j.line).text).length==j.ch){var k=l(i,i.length,a.options.tabSize)-i.length;j=ha(j.line,Math.max(0,Math.round((f-Mb(a.display).left)/tc(a.display))-k))}return j}function zc(a,b){if(b>=a.display.viewTo)return null;if((b-=a.display.viewFrom)<0)return null;for(var c=a.display.view,d=0;d<c.length;d++)if((b-=c[d].size)<0)return d}function Ac(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&c<e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)nh&&$a(a.doc,b)<e.viewTo&&Cc(a);else if(c<=e.viewFrom)nh&&_a(a.doc,c+d)>e.viewFrom?Cc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)Cc(a);else if(b<=e.viewFrom){var f=Dc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):Cc(a)}else if(c>=e.viewTo){var g=Dc(a,b,b,-1);g?(e.view=e.view.slice(0,g.index),e.viewTo=g.lineN):Cc(a)}else{var h=Dc(a,b,b,-1),i=Dc(a,c,c+d,1);h&&i?(e.view=e.view.slice(0,h.index).concat(qb(a,h.lineN,i.lineN)).concat(e.view.slice(i.index)),e.viewTo+=d):Cc(a)}var j=e.externalMeasured;j&&(c<j.lineN?j.lineN+=d:b<j.lineN+j.size&&(e.externalMeasured=null))}function Bc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;if(e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null),!(b<d.viewFrom||b>=d.viewTo)){var f=d.view[zc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==m(g,c)&&g.push(c)}}}function Cc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function Dc(a,b,c,d){var e,f=zc(a,b),g=a.display.view;if(!nh||c==a.doc.first+a.doc.size)return{index:f,lineN:c};for(var h=a.display.viewFrom,i=0;i<f;i++)h+=g[i].size;if(h!=b){if(d>0){if(f==g.length-1)return null;e=h+g[f].size-b,f++}else e=h-b;b+=e,c+=e}for(;$a(a.doc,c)!=c;){if(f==(d<0?0:g.length-1))return null;c+=d*g[f-(d<0?1:0)].size,f+=d}return{index:f,lineN:c}}function Ec(a,b,c){var d=a.display;0==d.view.length||b>=d.viewTo||c<=d.viewFrom?(d.view=qb(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=qb(a,b,d.viewFrom).concat(d.view):d.viewFrom<b&&(d.view=d.view.slice(zc(a,b))),d.viewFrom=b,d.viewTo<c?d.view=d.view.concat(qb(a,d.viewTo,c)):d.viewTo>c&&(d.view=d.view.slice(0,zc(a,c)))),d.viewTo=c}function Fc(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[d];e.hidden||e.node&&!e.changes||++c}return c}function Gc(a){a.display.input.showSelection(a.display.input.prepareSelection())}function Hc(a,b){void 0===b&&(b=!0);for(var c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++)if(b||g!=c.sel.primIndex){var h=c.sel.ranges[g];if(!(h.from().line>=a.display.viewTo||h.to().line<a.display.viewFrom)){var i=h.empty();(i||a.options.showCursorWhenSelecting)&&Ic(a,h.head,e),i||Kc(a,h,f)}}return d}function Ic(a,b,c){var e=ic(a,b,"div",null,null,!a.options.singleCursorHeightPerLine),f=c.appendChild(d("div"," ","CodeMirror-cursor"));if(f.style.left=e.left+"px",f.style.top=e.top+"px",f.style.height=Math.max(0,e.bottom-e.top)*a.options.cursorHeight+"px",e.other){var g=c.appendChild(d("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));g.style.display="",g.style.left=e.other.left+"px",g.style.top=e.other.top+"px",g.style.height=.85*(e.other.bottom-e.other.top)+"px"}}function Jc(a,b){return a.top-b.top||a.left-b.left}function Kc(a,b,c){function e(a,b,c,e){b<0&&(b=0),b=Math.round(b),e=Math.round(e),i.appendChild(d("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px;\n                             top: "+b+"px; width: "+(null==c?l-a:c)+"px;\n                             height: "+(e-b)+"px"))}function f(b,c,d){function f(c,d){return hc(a,ha(b,c),"div",n,d)}function g(b,c,d){var e=nc(a,n,null,b),g="ltr"==c==("after"==d)?"left":"right";return f("after"==d?e.begin:e.end-(/\s/.test(n.text.charAt(e.end-1))?2:1),g)[g]}var i,j,n=_(h,b),o=n.text.length,p=C(n,h.direction);return A(p,c||0,null==d?o:d,(function(a,b,h,n){var q="ltr"==h,r=f(a,q?"left":"right"),s=f(b-1,q?"right":"left"),t=null==c&&0==a,u=null==d&&b==o,v=0==n,w=!p||n==p.length-1;if(s.top-r.top<=3){var x=(m?t:u)&&v,y=(m?u:t)&&w,z=x?k:(q?r:s).left,A=y?l:(q?s:r).right;e(z,r.top,A-z,r.bottom)}else{var B,C,D,E;q?(B=m&&t&&v?k:r.left,C=m?l:g(a,h,"before"),D=m?k:g(b,h,"after"),E=m&&u&&w?l:s.right):(B=m?g(a,h,"before"):k,C=!m&&t&&v?l:r.right,D=!m&&u&&w?k:s.left,E=m?g(b,h,"after"):l),e(B,r.top,C-B,r.bottom),r.bottom<s.top&&e(k,r.bottom,null,s.top),e(D,s.top,E-D,s.bottom)}(!i||Jc(r,i)<0)&&(i=r),Jc(s,i)<0&&(i=s),(!j||Jc(r,j)<0)&&(j=r),Jc(s,j)<0&&(j=s)})),{start:i,end:j}}var g=a.display,h=a.doc,i=document.createDocumentFragment(),j=Mb(a.display),k=j.left,l=Math.max(g.sizerWidth,Ob(a)-g.sizer.offsetLeft)-j.right,m="ltr"==h.direction,n=b.from(),o=b.to();if(n.line==o.line)f(n.line,n.ch,o.ch);else{var p=_(h,n.line),q=_(h,o.line),r=Xa(p)==Xa(q),s=f(n.line,n.ch,r?p.text.length+1:null).end,t=f(o.line,r?0:null,o.ch).start;r&&(s.top<t.top-2?(e(s.right,s.top,null,s.bottom),e(k,t.top,t.left,t.bottom)):e(s.right,s.top,t.left-s.right,s.bottom)),s.bottom<t.top&&e(k,s.bottom,null,t.top)}c.appendChild(i)}function Lc(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility="",a.options.cursorBlinkRate>0?b.blinker=setInterval((function(){a.hasFocus()||Pc(a),b.cursorDiv.style.visibility=(c=!c)?"":"hidden"}),a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function Mc(a){a.hasFocus()||(a.display.input.focus(),a.state.focused||Oc(a))}function Nc(a){a.state.delayingBlurEvent=!0,setTimeout((function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,a.state.focused&&Pc(a))}),100)}function Oc(a,b){a.state.delayingBlurEvent&&!a.state.draggingText&&(a.state.delayingBlurEvent=!1),"nocursor"!=a.options.readOnly&&(a.state.focused||(F(a,"focus",a,b),a.state.focused=!0,h(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),ug&&setTimeout((function(){return a.display.input.reset(!0)}),20)),a.display.input.receivedFocus()),Lc(a))}function Pc(a,b){a.state.delayingBlurEvent||(a.state.focused&&(F(a,"blur",a,b),a.state.focused=!1,Lg(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout((function(){a.state.focused||(a.display.shift=!1)}),150))}function Qc(a){for(var b=a.display,c=b.lineDiv.offsetTop,d=0;d<b.view.length;d++){var e=b.view[d],f=a.options.lineWrapping,g=void 0,h=0;if(!e.hidden){if(sg&&tg<8){var i=e.node.offsetTop+e.node.offsetHeight;g=i-c,c=i}else{var j=e.node.getBoundingClientRect();g=j.bottom-j.top,!f&&e.text.firstChild&&(h=e.text.firstChild.getBoundingClientRect().right-j.left-1)}var k=e.line.height-g;if((k>.005||k<-.005)&&(ca(e.line,g),Rc(e.line),e.rest))for(var l=0;l<e.rest.length;l++)Rc(e.rest[l]);if(h>a.display.sizerWidth){var m=Math.ceil(h/tc(a.display));m>a.display.maxLineLength&&(a.display.maxLineLength=m,a.display.maxLine=e.line,a.display.maxLineChanged=!0)}}}}function Rc(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b){var c=a.widgets[b],d=c.node.parentNode;d&&(c.height=d.offsetHeight)}}function Sc(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-Kb(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=ea(b,d),g=ea(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;h<f?(f=h,g=ea(b,cb(_(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=ea(b,cb(_(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function Tc(a,b){if(!G(a,"scrollCursorIntoView")){var c=a.display,e=c.sizer.getBoundingClientRect(),f=null;if(b.top+e.top<0?f=!0:b.bottom+e.top>(window.innerHeight||document.documentElement.clientHeight)&&(f=!1),null!=f&&!Ag){var g=d("div","​",null,"position: absolute;\n                         top: "+(b.top-c.viewOffset-Kb(a.display))+"px;\n                         height: "+(b.bottom-b.top+Nb(a)+c.barHeight)+"px;\n                         left: "+b.left+"px; width: "+Math.max(2,b.right-b.left)+"px;");a.display.lineSpace.appendChild(g),g.scrollIntoView(f),a.display.lineSpace.removeChild(g)}}}function Uc(a,b,c,d){null==d&&(d=0);var e;a.options.lineWrapping||b!=c||(b=b.ch?ha(b.line,"before"==b.sticky?b.ch-1:b.ch,"after"):b,c="before"==b.sticky?ha(b.line,b.ch+1,"before"):b);for(var f=0;f<5;f++){var g=!1,h=ic(a,b),i=c&&c!=b?ic(a,c):h;e={left:Math.min(h.left,i.left),top:Math.min(h.top,i.top)-d,right:Math.max(h.left,i.left),bottom:Math.max(h.bottom,i.bottom)+d};var j=Wc(a,e),k=a.doc.scrollTop,l=a.doc.scrollLeft;if(null!=j.scrollTop&&(bd(a,j.scrollTop),Math.abs(a.doc.scrollTop-k)>1&&(g=!0)),null!=j.scrollLeft&&(dd(a,j.scrollLeft),Math.abs(a.doc.scrollLeft-l)>1&&(g=!0)),!g)break}return e}function Vc(a,b){var c=Wc(a,b);null!=c.scrollTop&&bd(a,c.scrollTop),null!=c.scrollLeft&&dd(a,c.scrollLeft)}function Wc(a,b){var c=a.display,d=sc(a.display);b.top<0&&(b.top=0);var e=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:c.scroller.scrollTop,f=Pb(a),g={};b.bottom-b.top>f&&(b.bottom=b.top+f);var h=a.doc.height+Lb(c),i=b.top<d,j=b.bottom>h-d;if(b.top<e)g.scrollTop=i?0:b.top;else if(b.bottom>e+f){var k=Math.min(b.top,(j?h:b.bottom)-f);k!=e&&(g.scrollTop=k)}var l=a.options.fixedGutter?0:c.gutters.offsetWidth,m=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:c.scroller.scrollLeft-l,n=Ob(a)-c.gutters.offsetWidth,o=b.right-b.left>n;return o&&(b.right=b.left+n),b.left<10?g.scrollLeft=0:b.left<m?g.scrollLeft=Math.max(0,b.left+l-(o?0:10)):b.right>n+m-3&&(g.scrollLeft=b.right+(o?0:10)-n),g}function Xc(a,b){null!=b&&(_c(a),a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+b)}function Yc(a){_c(a);var b=a.getCursor();a.curOp.scrollToPos={from:b,to:b,margin:a.options.cursorScrollMargin}}function Zc(a,b,c){null==b&&null==c||_c(a),null!=b&&(a.curOp.scrollLeft=b),null!=c&&(a.curOp.scrollTop=c)}function $c(a,b){_c(a),a.curOp.scrollToPos=b}function _c(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;ad(a,jc(a,b.from),jc(a,b.to),b.margin)}}function ad(a,b,c,d){var e=Wc(a,{left:Math.min(b.left,c.left),top:Math.min(b.top,c.top)-d,right:Math.max(b.right,c.right),bottom:Math.max(b.bottom,c.bottom)+d});Zc(a,e.scrollLeft,e.scrollTop)}function bd(a,b){Math.abs(a.doc.scrollTop-b)<2||(og||Bd(a,{top:b}),cd(a,b,!0),og&&Bd(a),ud(a,100))}function cd(a,b,c){b=Math.max(0,Math.min(a.display.scroller.scrollHeight-a.display.scroller.clientHeight,b)),(a.display.scroller.scrollTop!=b||c)&&(a.doc.scrollTop=b,a.display.scrollbars.setScrollTop(b),a.display.scroller.scrollTop!=b&&(a.display.scroller.scrollTop=b))}function dd(a,b,c,d){b=Math.max(0,Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth)),(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2)&&!d||(a.doc.scrollLeft=b,Fd(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function ed(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+Lb(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+Nb(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function fd(a,b){b||(b=ed(a));var c=a.display.barWidth,d=a.display.barHeight;gd(a,b);for(var e=0;e<4&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&Qc(a),gd(a,ed(a)),c=a.display.barWidth,d=a.display.barHeight}function gd(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",c.heightForcer.style.borderBottom=d.bottom+"px solid transparent",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function hd(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&Lg(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new xh[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),_g(b,"mousedown",(function(){a.state.focused&&setTimeout((function(){return a.display.input.focus()}),0)})),b.setAttribute("cm-not-content","true")},function(b,c){"horizontal"==c?dd(a,b):bd(a,b)},a),a.display.scrollbars.addClass&&h(a.display.wrapper,a.display.scrollbars.addClass)}function id(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++yh},rb(a.curOp)}function jd(a){var b=a.curOp;b&&tb(b,(function(a){for(var b=0;b<a.ops.length;b++)a.ops[b].cm.curOp=null;kd(a)}))}function kd(a){for(var b=a.ops,c=0;c<b.length;c++)ld(b[c]);for(var d=0;d<b.length;d++)md(b[d]);for(var e=0;e<b.length;e++)nd(b[e]);for(var f=0;f<b.length;f++)od(b[f]);for(var g=0;g<b.length;g++)pd(b[g])}function ld(a){var b=a.cm,c=b.display;wd(b),a.updateMaxLine&&eb(b),a.mustUpdate=a.viewChanged||a.forceUpdate||null!=a.scrollTop||a.scrollToPos&&(a.scrollToPos.from.line<c.viewFrom||a.scrollToPos.to.line>=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new zh(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function md(a){a.updatedDisplay=a.mustUpdate&&zd(a.cm,a.update)}function nd(a){var b=a.cm,c=b.display;a.updatedDisplay&&Qc(b),a.barMeasure=ed(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=Tb(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+Nb(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-Ob(b))),(a.updatedDisplay||a.selectionChanged)&&(a.preparedSelection=c.input.prepareSelection())}function od(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeft<b.doc.scrollLeft&&dd(b,Math.min(b.display.scroller.scrollLeft,a.maxScrollLeft),!0),b.display.maxLineChanged=!1);var c=a.focus&&a.focus==g();a.preparedSelection&&b.display.input.showSelection(a.preparedSelection,c),(a.updatedDisplay||a.startHeight!=b.doc.height)&&fd(b,a.barMeasure),a.updatedDisplay&&Ed(b,a.barMeasure),a.selectionChanged&&Lc(b),b.state.focused&&a.updateInput&&b.display.input.reset(a.typing),c&&Mc(a.cm)}function pd(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&Ad(b,a.update),null==c.wheelStartX||null==a.scrollTop&&null==a.scrollLeft&&!a.scrollToPos||(c.wheelStartX=c.wheelStartY=null),null!=a.scrollTop&&cd(b,a.scrollTop,a.forceScroll),null!=a.scrollLeft&&dd(b,a.scrollLeft,!0,!0),a.scrollToPos){Tc(b,Uc(b,oa(d,a.scrollToPos.from),oa(d,a.scrollToPos.to),a.scrollToPos.margin))}var e=a.maybeHiddenMarkers,f=a.maybeUnhiddenMarkers;if(e)for(var g=0;g<e.length;++g)e[g].lines.length||F(e[g],"hide");if(f)for(var h=0;h<f.length;++h)f[h].lines.length&&F(f[h],"unhide");c.wrapper.offsetHeight&&(d.scrollTop=b.display.scroller.scrollTop),a.changeObjs&&F(b,"changes",b,a.changeObjs),a.update&&a.update.finish()}function qd(a,b){if(a.curOp)return b();id(a);try{return b()}finally{jd(a)}}function rd(a,b){return function(){if(a.curOp)return b.apply(a,arguments);id(a);try{return b.apply(a,arguments)}finally{jd(a)}}}function sd(a){return function(){if(this.curOp)return a.apply(this,arguments);id(this);try{return a.apply(this,arguments)}finally{jd(this)}}}function td(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,arguments);id(b);try{return a.apply(this,arguments)}finally{jd(b)}}}function ud(a,b){a.doc.highlightFrontier<a.display.viewTo&&a.state.highlight.set(b,j(vd,a))}function vd(a){var b=a.doc;if(!(b.highlightFrontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=ta(a,b.highlightFrontier),e=[];b.iter(d.line,Math.min(b.first+b.size,a.display.viewTo+500),(function(f){if(d.line>=a.display.viewFrom){var g=f.styles,h=f.text.length>a.options.maxHighlightLength?Y(b.mode,d.state):null,i=ra(a,f,d,!0);h&&(d.state=h),f.styles=i.styles;var j=f.styleClasses,k=i.classes;k?f.styleClasses=k:j&&(f.styleClasses=null);for(var l=!g||g.length!=f.styles.length||j!=k&&(!j||!k||j.bgClass!=k.bgClass||j.textClass!=k.textClass),m=0;!l&&m<g.length;++m)l=g[m]!=f.styles[m];l&&e.push(d.line),f.stateAfter=d.save(),d.nextLine()}else f.text.length<=a.options.maxHighlightLength&&ua(a,f.text,d),f.stateAfter=d.line%5==0?d.save():null,d.nextLine();if(+new Date>c)return ud(a,a.options.workDelay),!0})),b.highlightFrontier=d.line,b.modeFrontier=Math.max(b.modeFrontier,d.line),e.length&&qd(a,(function(){for(var b=0;b<e.length;b++)Bc(a,e[b],"text")}))}}function wd(a){var b=a.display;!b.scrollbarsClipped&&b.scroller.offsetWidth&&(b.nativeBarWidth=b.scroller.offsetWidth-b.scroller.clientWidth,b.heightForcer.style.height=Nb(a)+"px",b.sizer.style.marginBottom=-b.nativeBarWidth+"px",b.sizer.style.borderRightWidth=Nb(a)+"px",b.scrollbarsClipped=!0)}function xd(a){if(a.hasFocus())return null;var b=g();if(!b||!f(a.display.lineDiv,b))return null;var c={activeElt:b};if(window.getSelection){var d=window.getSelection();d.anchorNode&&d.extend&&f(a.display.lineDiv,d.anchorNode)&&(c.anchorNode=d.anchorNode,c.anchorOffset=d.anchorOffset,c.focusNode=d.focusNode,c.focusOffset=d.focusOffset)}return c}function yd(a){if(a&&a.activeElt&&a.activeElt!=g()&&(a.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(a.activeElt.nodeName)&&a.anchorNode&&f(document.body,a.anchorNode)&&f(document.body,a.focusNode))){var b=window.getSelection(),c=document.createRange();c.setEnd(a.anchorNode,a.anchorOffset),c.collapse(!1),b.removeAllRanges(),b.addRange(c),b.extend(a.focusNode,a.focusOffset)}}function zd(a,c){var d=a.display,e=a.doc;if(c.editorIsHidden)return Cc(a),!1;if(!c.force&&c.visible.from>=d.viewFrom&&c.visible.to<=d.viewTo&&(null==d.updateLineNumbers||d.updateLineNumbers>=d.viewTo)&&d.renderedView==d.view&&0==Fc(a))return!1;Gd(a)&&(Cc(a),c.dims=uc(a));var f=e.first+e.size,g=Math.max(c.visible.from-a.options.viewportMargin,e.first),h=Math.min(f,c.visible.to+a.options.viewportMargin);d.viewFrom<g&&g-d.viewFrom<20&&(g=Math.max(e.first,d.viewFrom)),d.viewTo>h&&d.viewTo-h<20&&(h=Math.min(f,d.viewTo)),nh&&(g=$a(a.doc,g),h=_a(a.doc,h));var i=g!=d.viewFrom||h!=d.viewTo||d.lastWrapHeight!=c.wrapperHeight||d.lastWrapWidth!=c.wrapperWidth;Ec(a,g,h),d.viewOffset=cb(_(a.doc,d.viewFrom)),a.display.mover.style.top=d.viewOffset+"px";var j=Fc(a);if(!i&&0==j&&!c.force&&d.renderedView==d.view&&(null==d.updateLineNumbers||d.updateLineNumbers>=d.viewTo))return!1;var k=xd(a);return j>4&&(d.lineDiv.style.display="none"),Cd(a,d.updateLineNumbers,c.dims),j>4&&(d.lineDiv.style.display=""),d.renderedView=d.view,yd(k),b(d.cursorDiv),b(d.selectionDiv),d.gutters.style.height=d.sizer.style.minHeight=0,i&&(d.lastWrapHeight=c.wrapperHeight,d.lastWrapWidth=c.wrapperWidth,ud(a,400)),d.updateLineNumbers=null,!0}function Ad(a,b){for(var c=b.viewport,d=!0;;d=!1){if(d&&a.options.lineWrapping&&b.oldDisplayWidth!=Ob(a))d&&(b.visible=Sc(a.display,a.doc,c));else if(c&&null!=c.top&&(c={top:Math.min(a.doc.height+Lb(a.display)-Pb(a),c.top)}),b.visible=Sc(a.display,a.doc,c),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!zd(a,b))break;Qc(a);var e=ed(a);Gc(a),fd(a,e),Ed(a,e),b.force=!1}b.signal(a,"update",a),a.display.viewFrom==a.display.reportedViewFrom&&a.display.viewTo==a.display.reportedViewTo||(b.signal(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Bd(a,b){var c=new zh(a,b);if(zd(a,c)){Qc(a),Ad(a,c);var d=ed(a);Gc(a),fd(a,d),Ed(a,d),c.finish()}}function Cd(a,c,d){function e(b){var c=b.nextSibling;return ug&&Eg&&a.display.currentWheelTarget==b?b.style.display="none":b.parentNode.removeChild(b),c}for(var f=a.display,g=a.options.lineNumbers,h=f.lineDiv,i=h.firstChild,j=f.view,k=f.viewFrom,l=0;l<j.length;l++){var n=j[l];if(n.hidden);else if(n.node&&n.node.parentNode==h){for(;i!=n.node;)i=e(i);var o=g&&null!=c&&c<=k&&n.lineNumber;n.changes&&(m(n.changes,"gutter")>-1&&(o=!1),wb(a,n,k,d)),o&&(b(n.lineNumber),n.lineNumber.appendChild(document.createTextNode(ga(a.options,k)))),i=n.node.nextSibling}else{var p=Eb(a,n,k,d);h.insertBefore(p,i)}k+=n.size}for(;i;)i=e(i)}function Dd(a){var b=a.gutters.offsetWidth;a.sizer.style.marginLeft=b+"px"}function Ed(a,b){a.display.sizer.style.minHeight=b.docHeight+"px",a.display.heightForcer.style.top=b.docHeight+"px",a.display.gutters.style.height=b.docHeight+a.display.barHeight+Nb(a)+"px"}function Fd(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=vc(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&(c[g].gutter&&(c[g].gutter.style.left=f),c[g].gutterBackground&&(c[g].gutterBackground.style.left=f));var h=c[g].alignable;if(h)for(var i=0;i<h.length;i++)h[i].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+"px")}}function Gd(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=ga(a.options,b.first+b.size-1),e=a.display;if(c.length!=e.lineNumChars){var f=e.measure.appendChild(d("div",[d("div",c)],"CodeMirror-linenumber CodeMirror-gutter-elt")),g=f.firstChild.offsetWidth,h=f.offsetWidth-g;return e.lineGutter.style.width="",e.lineNumInnerWidth=Math.max(g,e.lineGutter.offsetWidth-h)+1,e.lineNumWidth=e.lineNumInnerWidth+h,e.lineNumChars=e.lineNumInnerWidth?c.length:-1,e.lineGutter.style.width=e.lineNumWidth+"px",Dd(a.display),!0}return!1}function Hd(a,b){for(var c=[],d=!1,e=0;e<a.length;e++){var f=a[e],g=null;if("string"!=typeof f&&(g=f.style,f=f.className),"CodeMirror-linenumbers"==f){if(!b)continue;d=!0}c.push({className:f,style:g})}return b&&!d&&c.push({className:"CodeMirror-linenumbers",style:null}),c}function Id(a){var c=a.gutters,e=a.gutterSpecs;b(c),a.lineGutter=null;for(var f=0;f<e.length;++f){var g=e[f],h=g.className,i=g.style,j=c.appendChild(d("div",null,"CodeMirror-gutter "+h));i&&(j.style.cssText=i),"CodeMirror-linenumbers"==h&&(a.lineGutter=j,j.style.width=(a.lineNumWidth||1)+"px")}c.style.display=e.length?"":"none",Dd(a)}function Jd(a){Id(a.display),Ac(a),Fd(a)}function Kd(a,b,c,f){var g=this;this.input=c,g.scrollbarFiller=d("div",null,"CodeMirror-scrollbar-filler"),g.scrollbarFiller.setAttribute("cm-not-content","true"),g.gutterFiller=d("div",null,"CodeMirror-gutter-filler"),g.gutterFiller.setAttribute("cm-not-content","true"),g.lineDiv=e("div",null,"CodeMirror-code"),g.selectionDiv=d("div",null,null,"position: relative; z-index: 1"),g.cursorDiv=d("div",null,"CodeMirror-cursors"),g.measure=d("div",null,"CodeMirror-measure"),g.lineMeasure=d("div",null,"CodeMirror-measure"),g.lineSpace=e("div",[g.measure,g.lineMeasure,g.selectionDiv,g.cursorDiv,g.lineDiv],null,"position: relative; outline: none");var h=e("div",[g.lineSpace],"CodeMirror-lines");g.mover=d("div",[h],null,"position: relative"),g.sizer=d("div",[g.mover],"CodeMirror-sizer"),g.sizerWidth=null,g.heightForcer=d("div",null,null,"position: absolute; height: "+Qg+"px; width: 1px;"),g.gutters=d("div",null,"CodeMirror-gutters"),g.lineGutter=null,g.scroller=d("div",[g.sizer,g.heightForcer,g.gutters],"CodeMirror-scroll"),g.scroller.setAttribute("tabIndex","-1"),g.wrapper=d("div",[g.scrollbarFiller,g.gutterFiller,g.scroller],"CodeMirror"),sg&&tg<8&&(g.gutters.style.zIndex=-1,g.scroller.style.paddingRight=0),ug||og&&Dg||(g.scroller.draggable=!0),a&&(a.appendChild?a.appendChild(g.wrapper):a(g.wrapper)),g.viewFrom=g.viewTo=b.first,g.reportedViewFrom=g.reportedViewTo=b.first,g.view=[],g.renderedView=null,g.externalMeasured=null,g.viewOffset=0,g.lastWrapHeight=g.lastWrapWidth=0,g.updateLineNumbers=null,g.nativeBarWidth=g.barHeight=g.barWidth=0,g.scrollbarsClipped=!1,g.lineNumWidth=g.lineNumInnerWidth=g.lineNumChars=null,g.alignWidgets=!1,g.cachedCharWidth=g.cachedTextHeight=g.cachedPaddingH=null,g.maxLine=null,g.maxLineLength=0,g.maxLineChanged=!1,g.wheelDX=g.wheelDY=g.wheelStartX=g.wheelStartY=null,g.shift=!1,g.selForContextMenu=null,g.activeTouch=null,g.gutterSpecs=Hd(f.gutters,f.lineNumbers),Id(g),c.init(g)}function Ld(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}}function Md(a){var b=Ld(a);return b.x*=Bh,b.y*=Bh,b}function Nd(a,b){var c=Ld(b),d=c.x,e=c.y,f=a.display,g=f.scroller,h=g.scrollWidth>g.clientWidth,i=g.scrollHeight>g.clientHeight;if(d&&h||e&&i){if(e&&Eg&&ug)a:for(var j=b.target,k=f.view;j!=g;j=j.parentNode)for(var l=0;l<k.length;l++)if(k[l].node==j){a.display.currentWheelTarget=j;break a}if(d&&!og&&!xg&&null!=Bh)return e&&i&&bd(a,Math.max(0,g.scrollTop+e*Bh)),dd(a,Math.max(0,g.scrollLeft+d*Bh)),(!e||e&&i)&&K(b),void(f.wheelStartX=null);if(e&&null!=Bh){var m=e*Bh,n=a.doc.scrollTop,o=n+f.wrapper.clientHeight;m<0?n=Math.max(0,n+m-50):o=Math.min(a.doc.height,o+m+50),Bd(a,{top:n,bottom:o})}Ah<20&&(null==f.wheelStartX?(f.wheelStartX=g.scrollLeft,f.wheelStartY=g.scrollTop,f.wheelDX=d,f.wheelDY=e,setTimeout((function(){if(null!=f.wheelStartX){var a=g.scrollLeft-f.wheelStartX,b=g.scrollTop-f.wheelStartY,c=b&&f.wheelDY&&b/f.wheelDY||a&&f.wheelDX&&a/f.wheelDX;f.wheelStartX=f.wheelStartY=null,c&&(Bh=(Bh*Ah+c)/(Ah+1),++Ah)}}),200)):(f.wheelDX+=d,f.wheelDY+=e))}}function Od(a,b,c){var d=a&&a.options.selectionsMayTouch,e=b[c];b.sort((function(a,b){return ia(a.from(),b.from())})),c=m(b,e)
;for(var f=1;f<b.length;f++){var g=b[f],h=b[f-1],i=ia(h.to(),g.from());if(d&&!g.empty()?i>0:i>=0){var j=ma(h.from(),g.from()),k=la(h.to(),g.to()),l=h.empty()?g.from()==g.head:h.from()==h.head;f<=c&&--c,b.splice(--f,2,new Dh(l?k:j,l?j:k))}}return new Ch(b,c)}function Pd(a,b){return new Ch([new Dh(a,b||a)],0)}function Qd(a){return a.text?ha(a.from.line+a.text.length-1,p(a.text).length+(1==a.text.length?a.from.ch:0)):a.to}function Rd(a,b){if(ia(a,b.from)<0)return a;if(ia(a,b.to)<=0)return Qd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=Qd(b).ch-b.to.ch),ha(c,d)}function Sd(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new Dh(Rd(e.anchor,b),Rd(e.head,b)))}return Od(a.cm,c,a.sel.primIndex)}function Td(a,b,c){return a.line==b.line?ha(c.line,a.ch-b.ch+c.ch):ha(c.line+(a.line-b.line),a.ch)}function Ud(a,b,c){for(var d=[],e=ha(a.first,0),f=e,g=0;g<b.length;g++){var h=b[g],i=Td(h.from,e,f),j=Td(Qd(h),e,f);if(e=h.to,f=j,"around"==c){var k=a.sel.ranges[g],l=ia(k.head,k.anchor)<0;d[g]=new Dh(l?j:i,l?i:j)}else d[g]=new Dh(i,i)}return new Ch(d,a.sel.primIndex)}function Vd(a){a.doc.mode=W(a.options,a.doc.modeOption),Wd(a)}function Wd(a){a.doc.iter((function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)})),a.doc.modeFrontier=a.doc.highlightFrontier=a.doc.first,ud(a,100),a.state.modeGen++,a.curOp&&Ac(a)}function Xd(a,b){return 0==b.from.ch&&0==b.to.ch&&""==p(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function Yd(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){fb(a,c,e,d),ub(a,"change",a,b)}function g(a,b){for(var c=[],f=a;f<b;++f)c.push(new oh(j[f],e(f),d));return c}var h=b.from,i=b.to,j=b.text,k=_(a,h.line),l=_(a,i.line),m=p(j),n=e(j.length-1),o=i.line-h.line;if(b.full)a.insert(0,g(0,j.length)),a.remove(j.length,a.size-j.length);else if(Xd(a,b)){var q=g(0,j.length-1);f(l,l.text,n),o&&a.remove(h.line,o),q.length&&a.insert(h.line,q)}else if(k==l)if(1==j.length)f(k,k.text.slice(0,h.ch)+m+k.text.slice(i.ch),n);else{var r=g(1,j.length-1);r.push(new oh(m+k.text.slice(i.ch),n,d)),f(k,k.text.slice(0,h.ch)+j[0],e(0)),a.insert(h.line+1,r)}else if(1==j.length)f(k,k.text.slice(0,h.ch)+j[0]+l.text.slice(i.ch),e(0)),a.remove(h.line+1,o);else{f(k,k.text.slice(0,h.ch)+j[0],e(0)),f(l,m+l.text.slice(i.ch),n);var s=g(1,j.length-1);o>1&&a.remove(h.line+1,o-1),a.insert(h.line+1,s)}ub(a,"change",a,b)}function Zd(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked.length;++g){var h=a.linked[g];if(h.doc!=e){var i=f&&h.sharedHist;c&&!i||(b(h.doc,i),d(h.doc,a,i))}}}d(a,null,!0)}function $d(a,b){if(b.cm)throw new Error("This document is already in use.");a.doc=b,b.cm=a,xc(a),Vd(a),_d(a),a.options.lineWrapping||eb(a),a.options.mode=b.modeOption,Ac(a)}function _d(a){("rtl"==a.doc.direction?h:Lg)(a.display.lineDiv,"CodeMirror-rtl")}function ae(a){qd(a,(function(){_d(a),Ac(a)}))}function be(a){this.done=[],this.undone=[],this.undoDepth=a?a.undoDepth:1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=a?a.maxGeneration:1}function ce(a,b){var c={from:ka(b.from),to:Qd(b),text:aa(a,b.from,b.to)};return je(a,c,b.from.line,b.to.line+1),Zd(a,(function(a){return je(a,c,b.from.line,b.to.line+1)}),!0),c}function de(a){for(;a.length;){if(!p(a).ranges)break;a.pop()}}function ee(a,b){return b?(de(a.done),p(a.done)):a.done.length&&!p(a.done).ranges?p(a.done):a.done.length>1&&!a.done[a.done.length-2].ranges?(a.done.pop(),p(a.done)):void 0}function fe(a,b,c,d){var e=a.history;e.undone.length=0;var f,g,h=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&e.lastModTime>h-(a.cm?a.cm.options.historyEventDelay:500)||"*"==b.origin.charAt(0)))&&(f=ee(e,e.lastOp==d)))g=p(f.changes),0==ia(b.from,b.to)&&0==ia(b.from,g.to)?g.to=Qd(b):f.changes.push(ce(a,b));else{var i=p(e.done);for(i&&i.ranges||ie(a.sel,e.done),f={changes:[ce(a,b)],generation:e.generation},e.done.push(f);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=h,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,g||F(a,"historyAdded")}function ge(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function he(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||ge(a,f,p(e.done),b))?e.done[e.done.length-1]=b:ie(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&!1!==d.clearRedo&&de(e.undone)}function ie(a,b){var c=p(b);c&&c.ranges&&c.equals(a)||b.push(a)}function je(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),(function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f}))}function ke(a){if(!a)return null;for(var b,c=0;c<a.length;++c)a[c].marker.explicitlyCleared?b||(b=a.slice(0,c)):b&&b.push(a[c]);return b?b.length?b:null:a}function le(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=[],e=0;e<b.text.length;++e)d.push(ke(c[e]));return d}function me(a,b){var c=le(a,b),d=Ka(a,b);if(!c)return d;if(!d)return c;for(var e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g)a:for(var h=0;h<g.length;++h){for(var i=g[h],j=0;j<f.length;++j)if(f[j].marker==i.marker)continue a;f.push(i)}else g&&(c[e]=g)}return c}function ne(a,b,c){for(var d=[],e=0;e<a.length;++e){var f=a[e];if(f.ranges)d.push(c?Ch.prototype.deepCopy.call(f):f);else{var g=f.changes,h=[];d.push({changes:h});for(var i=0;i<g.length;++i){var j=g[i],k=void 0;if(h.push({from:j.from,to:j.to,text:j.text}),b)for(var l in j)(k=l.match(/^spans_(\d+)$/))&&m(b,Number(k[1]))>-1&&(p(h)[l]=j[l],delete j[l])}}}return d}function oe(a,b,c,d){if(d){var e=a.anchor;if(c){var f=ia(b,e)<0;f!=ia(c,e)<0?(e=b,b=c):f!=ia(b,c)<0&&(b=c)}return new Dh(e,b)}return new Dh(c||b,b)}function pe(a,b,c,d,e){null==e&&(e=a.cm&&(a.cm.display.shift||a.extend)),ve(a,new Ch([oe(a.sel.primary(),b,c,e)],0),d)}function qe(a,b,c){for(var d=[],e=a.cm&&(a.cm.display.shift||a.extend),f=0;f<a.sel.ranges.length;f++)d[f]=oe(a.sel.ranges[f],b[f],null,e);ve(a,Od(a.cm,d,a.sel.primIndex),c)}function re(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,ve(a,Od(a.cm,e,a.sel.primIndex),d)}function se(a,b,c,d){ve(a,Pd(b,c),d)}function te(a,b,c){var d={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new Dh(oa(a,b[c].anchor),oa(a,b[c].head))},origin:c&&c.origin};return F(a,"beforeSelectionChange",a,d),a.cm&&F(a.cm,"beforeSelectionChange",a.cm,d),d.ranges!=b.ranges?Od(a.cm,d.ranges,d.ranges.length-1):b}function ue(a,b,c){var d=a.history.done,e=p(d);e&&e.ranges?(d[d.length-1]=b,we(a,b,c)):ve(a,b,c)}function ve(a,b,c){we(a,b,c),he(a,a.sel,a.cm?a.cm.curOp.id:NaN,c)}function we(a,b,c){(I(a,"beforeSelectionChange")||a.cm&&I(a.cm,"beforeSelectionChange"))&&(b=te(a,b,c)),xe(a,ze(a,b,c&&c.bias||(ia(b.primary().head,a.sel.primary().head)<0?-1:1),!0)),c&&!1===c.scroll||!a.cm||"nocursor"==a.cm.getOption("readOnly")||Yc(a.cm)}function xe(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=1,a.cm.curOp.selectionChanged=!0,H(a.cm)),ub(a,"cursorActivity",a))}function ye(a){xe(a,ze(a,a.sel,null,!1))}function ze(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=b.ranges.length==a.sel.ranges.length&&a.sel.ranges[f],i=Be(a,g.anchor,h&&h.anchor,c,d),j=Be(a,g.head,h&&h.head,c,d);(e||i!=g.anchor||j!=g.head)&&(e||(e=b.ranges.slice(0,f)),e[f]=new Dh(i,j))}return e?Od(a.cm,e,b.primIndex):b}function Ae(a,b,c,d,e){var f=_(a,b.line);if(f.markedSpans)for(var g=0;g<f.markedSpans.length;++g){var h=f.markedSpans[g],i=h.marker,j="selectLeft"in i?!i.selectLeft:i.inclusiveLeft,k="selectRight"in i?!i.selectRight:i.inclusiveRight;if((null==h.from||(j?h.from<=b.ch:h.from<b.ch))&&(null==h.to||(k?h.to>=b.ch:h.to>b.ch))){if(e&&(F(i,"beforeCursorEnter"),i.explicitlyCleared)){if(f.markedSpans){--g;continue}break}if(!i.atomic)continue;if(c){var l=i.find(d<0?1:-1),m=void 0;if((d<0?k:j)&&(l=Ce(a,l,-d,l&&l.line==b.line?f:null)),l&&l.line==b.line&&(m=ia(l,c))&&(d<0?m<0:m>0))return Ae(a,l,b,d,e)}var n=i.find(d<0?-1:1);return(d<0?j:k)&&(n=Ce(a,n,d,n.line==b.line?f:null)),n?Ae(a,n,b,d,e):null}}return b}function Be(a,b,c,d,e){var f=d||1,g=Ae(a,b,c,f,e)||!e&&Ae(a,b,c,f,!0)||Ae(a,b,c,-f,e)||!e&&Ae(a,b,c,-f,!0);return g||(a.cantEdit=!0,ha(a.first,0))}function Ce(a,b,c,d){return c<0&&0==b.ch?b.line>a.first?oa(a,ha(b.line-1)):null:c>0&&b.ch==(d||_(a,b.line)).text.length?b.line<a.first+a.size-1?ha(b.line+1,0):null:new ha(b.line,b.ch+c)}function De(a){a.setSelection(ha(a.firstLine(),0),ha(a.lastLine()),Sg)}function Ee(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){return d.canceled=!0}};return c&&(d.update=function(b,c,e,f){b&&(d.from=oa(a,b)),c&&(d.to=oa(a,c)),e&&(d.text=e),void 0!==f&&(d.origin=f)}),F(a,"beforeChange",a,d),a.cm&&F(a.cm,"beforeChange",a.cm,d),d.canceled?(a.cm&&(a.cm.curOp.updateInput=2),null):{from:d.from,to:d.to,text:d.text,origin:d.origin}}function Fe(a,b,c){if(a.cm){if(!a.cm.curOp)return rd(a.cm,Fe)(a,b,c);if(a.cm.state.suppressEdits)return}if(!(I(a,"beforeChange")||a.cm&&I(a.cm,"beforeChange"))||(b=Ee(a,b,!0))){var d=mh&&!c&&Ma(a,b.from,b.to);if(d)for(var e=d.length-1;e>=0;--e)Ge(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text,origin:b.origin});else Ge(a,b)}}function Ge(a,b){if(1!=b.text.length||""!=b.text[0]||0!=ia(b.from,b.to)){var c=Sd(a,b);fe(a,b,c,a.cm?a.cm.curOp.id:NaN),Je(a,b,c,Ka(a,b));var d=[];Zd(a,(function(a,c){c||-1!=m(d,a.history)||(Oe(a.history,b),d.push(a.history)),Je(a,b,null,Ka(a,b))}))}}function He(a,b,c){var d=a.cm&&a.cm.state.suppressEdits;if(!d||c){for(var e,f=a.history,g=a.sel,h="undo"==b?f.done:f.undone,i="undo"==b?f.undone:f.done,j=0;j<h.length&&(e=h[j],c?!e.ranges||e.equals(a.sel):e.ranges);j++);if(j!=h.length){for(f.lastOrigin=f.lastSelOrigin=null;;){if(e=h.pop(),!e.ranges){if(d)return void h.push(e);break}if(ie(e,i),c&&!e.equals(a.sel))return void ve(a,e,{clearRedo:!1});g=e}var k=[];ie(g,i),i.push({changes:k,generation:f.generation}),f.generation=e.generation||++f.maxGeneration;for(var l=I(a,"beforeChange")||a.cm&&I(a.cm,"beforeChange"),n=e.changes.length-1;n>=0;--n){var o=(function(c){var d=e.changes[c];if(d.origin=b,l&&!Ee(a,d,!1))return h.length=0,{};k.push(ce(a,d));var f=c?Sd(a,d):p(h);Je(a,d,f,me(a,d)),!c&&a.cm&&a.cm.scrollIntoView({from:d.from,to:Qd(d)});var g=[];Zd(a,(function(a,b){b||-1!=m(g,a.history)||(Oe(a.history,d),g.push(a.history)),Je(a,d,null,me(a,d))}))})(n);if(o)return o.v}}}}function Ie(a,b){if(0!=b&&(a.first+=b,a.sel=new Ch(q(a.sel.ranges,(function(a){return new Dh(ha(a.anchor.line+b,a.anchor.ch),ha(a.head.line+b,a.head.ch))})),a.sel.primIndex),a.cm)){Ac(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)Bc(a.cm,d,"gutter")}}function Je(a,b,c,d){if(a.cm&&!a.cm.curOp)return rd(a.cm,Je)(a,b,c,d);if(b.to.line<a.first)return void Ie(a,b.text.length-1-(b.to.line-b.from.line));if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);Ie(a,e),b={from:ha(a.first,0),to:ha(b.to.line+e,b.to.ch),text:[p(b.text)],origin:b.origin}}var f=a.lastLine();b.to.line>f&&(b={from:b.from,to:ha(f,_(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=aa(a,b.from,b.to),c||(c=Sd(a,b)),a.cm?Ke(a.cm,b,d):Yd(a,b,d),we(a,c,Sg),a.cantEdit&&Be(a,ha(a.firstLine(),0))&&(a.cantEdit=!1)}}function Ke(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=da(Xa(_(d,f.line))),d.iter(i,g.line+1,(function(a){if(a==e.maxLine)return h=!0,!0}))),d.sel.contains(b.from,b.to)>-1&&H(a),Yd(d,b,c,wc(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,(function(a){var b=db(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)})),h&&(a.curOp.updateMaxLine=!0)),Ba(d,f.line),ud(a,400);var j=b.text.length-(g.line-f.line)-1;b.full?Ac(a):f.line!=g.line||1!=b.text.length||Xd(a.doc,b)?Ac(a,f.line,g.line+1,j):Bc(a,f.line,"text");var k=I(a,"changes"),l=I(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&ub(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function Le(a,b,c,d,e){var f;d||(d=c),ia(d,c)<0&&(f=[d,c],c=f[0],d=f[1]),"string"==typeof b&&(b=a.splitLines(b)),Fe(a,{from:c,to:d,text:b,origin:e})}function Me(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function Ne(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)Me(f.ranges[h].anchor,b,c,d),Me(f.ranges[h].head,b,c,d)}else{for(var i=0;i<f.changes.length;++i){var j=f.changes[i];if(c<j.from.line)j.from=ha(j.from.line+d,j.from.ch),j.to=ha(j.to.line+d,j.to.ch);else if(b<=j.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function Oe(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;Ne(a.done,c,d,e),Ne(a.undone,c,d,e)}function Pe(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=_(a,na(a,b)):e=da(b),null==e?null:(d(f,e)&&a.cm&&Bc(a.cm,e,c),f)}function Qe(a){this.lines=a,this.parent=null;for(var b=0,c=0;c<a.length;++c)a[c].parent=this,b+=a[c].height;this.height=b}function Re(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d];b+=e.chunkSize(),c+=e.height,e.parent=this}this.size=b,this.height=c,this.parent=null}function Se(a,b,c){cb(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&Xc(a,c)}function Te(a,b,c,d){var e=new Eh(a,c,d),f=a.cm;return f&&e.noHScroll&&(f.display.alignWidgets=!0),Pe(a,b,"widget",(function(b){var c=b.widgets||(b.widgets=[]);if(null==e.insertAt?c.push(e):c.splice(Math.min(c.length,Math.max(0,e.insertAt)),0,e),e.line=b,f&&!ab(a,b)){var d=cb(b)<a.scrollTop;ca(b,b.height+Ib(e)),d&&Xc(f,e.height),f.curOp.forceUpdate=!0}return!0})),f&&ub(f,"lineWidgetAdded",f,e,"number"==typeof b?b:da(b)),e}function Ue(a,b,c,d,f){if(d&&d.shared)return Ve(a,b,c,d,f);if(a.cm&&!a.cm.curOp)return rd(a.cm,Ue)(a,b,c,d,f);var g=new Gh(a,f),h=ia(b,c);if(d&&k(d,g,!1),h>0||0==h&&!1!==g.clearWhenEmpty)return g;if(g.replacedWith&&(g.collapsed=!0,g.widgetNode=e("span",[g.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||g.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(g.widgetNode.insertLeft=!0)),g.collapsed){if(Wa(a,b.line,b,c,g)||b.line!=c.line&&Wa(a,c.line,b,c,g))throw new Error("Inserting collapsed marker partially overlapping an existing one");Da()}g.addToHistory&&fe(a,{from:b,to:c,origin:"markText"},a.sel,NaN);var i,j=b.line,l=a.cm;if(a.iter(j,c.line+1,(function(a){l&&g.collapsed&&!l.options.lineWrapping&&Xa(a)==l.display.maxLine&&(i=!0),g.collapsed&&j!=b.line&&ca(a,0),Ha(a,new Ea(g,j==b.line?b.ch:null,j==c.line?c.ch:null)),++j})),g.collapsed&&a.iter(b.line,c.line+1,(function(b){ab(a,b)&&ca(b,0)})),g.clearOnEnter&&_g(g,"beforeCursorEnter",(function(){return g.clear()})),g.readOnly&&(Ca(),(a.history.done.length||a.history.undone.length)&&a.clearHistory()),g.collapsed&&(g.id=++Fh,g.atomic=!0),l){if(i&&(l.curOp.updateMaxLine=!0),g.collapsed)Ac(l,b.line,c.line+1);else if(g.className||g.startStyle||g.endStyle||g.css||g.attributes||g.title)for(var m=b.line;m<=c.line;m++)Bc(l,m,"text");g.atomic&&ye(l.doc),ub(l,"markerAdded",l,g)}return g}function Ve(a,b,c,d,e){d=k(d),d.shared=!1;var f=[Ue(a,b,c,d,e)],g=f[0],h=d.widgetNode;return Zd(a,(function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Ue(a,oa(a,b),oa(a,c),d,e));for(var i=0;i<a.linked.length;++i)if(a.linked[i].isParent)return;g=p(f)})),new Hh(f,g)}function We(a){return a.findMarks(ha(a.first,0),a.clipPos(ha(a.lastLine())),(function(a){return a.parent}))}function Xe(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.clipPos(e.from),g=a.clipPos(e.to);if(ia(f,g)){var h=Ue(a,f,g,d.primary,d.primary.type);d.markers.push(h),h.parent=d}}}function Ye(a){for(var b=0;b<a.length;b++)!(function(b){var c=a[b],d=[c.primary.doc];Zd(c.primary.doc,(function(a){return d.push(a)}));for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==m(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}})(b)}function Ze(a){var b=this;if(af(b),!G(b,a)&&!Jb(b.display,a)){K(a),sg&&(Kh=+new Date);var c=yc(b,a,!0),d=a.dataTransfer.files;if(c&&!b.isReadOnly())if(d&&d.length&&window.FileReader&&window.File)for(var e=d.length,f=Array(e),g=0,h=function(){++g==e&&rd(b,(function(){c=oa(b.doc,c);var a={from:c,to:c,text:b.doc.splitLines(f.filter((function(a){return null!=a})).join(b.doc.lineSeparator())),origin:"paste"};Fe(b.doc,a),ue(b.doc,Pd(oa(b.doc,c),oa(b.doc,Qd(a))))}))()},i=0;i<d.length;i++)!(function(a,c){if(b.options.allowDropFileTypes&&-1==m(b.options.allowDropFileTypes,a.type))return void h();var d=new FileReader;d.onerror=function(){return h()},d.onload=function(){var a=d.result;if(/[\x00-\x08\x0e-\x1f]{2}/.test(a))return void h();f[c]=a,h()},d.readAsText(a)})(d[i],i);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),void setTimeout((function(){return b.display.input.focus()}),20);try{var j=a.dataTransfer.getData("Text");if(j){var k;if(b.state.draggingText&&!b.state.draggingText.copy&&(k=b.listSelections()),we(b.doc,Pd(c,c)),k)for(var l=0;l<k.length;++l)Le(b.doc,"",k[l].anchor,k[l].head,"drag");b.replaceSelection(j,"around","paste"),b.display.input.focus()}}catch(a){}}}}function $e(a,b){if(sg&&(!a.state.draggingText||+new Date-Kh<100))return void N(b);if(!G(a,b)&&!Jb(a.display,b)&&(b.dataTransfer.setData("Text",a.getSelection()),b.dataTransfer.effectAllowed="copyMove",b.dataTransfer.setDragImage&&!yg)){var c=d("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",xg&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop),b.dataTransfer.setDragImage(c,0,0),xg&&c.parentNode.removeChild(c)}}function _e(a,b){var e=yc(a,b);if(e){var f=document.createDocumentFragment();Ic(a,e,f),a.display.dragCursor||(a.display.dragCursor=d("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),a.display.lineSpace.insertBefore(a.display.dragCursor,a.display.cursorDiv)),c(a.display.dragCursor,f)}}function af(a){a.display.dragCursor&&(a.display.lineSpace.removeChild(a.display.dragCursor),a.display.dragCursor=null)}function bf(a){if(document.getElementsByClassName){for(var b=document.getElementsByClassName("CodeMirror"),c=[],d=0;d<b.length;d++){var e=b[d].CodeMirror;e&&c.push(e)}c.length&&c[0].operation((function(){for(var b=0;b<c.length;b++)a(c[b])}))}}function cf(){Lh||(df(),Lh=!0)}function df(){var a;_g(window,"resize",(function(){null==a&&(a=setTimeout((function(){a=null,bf(ef)}),100))})),_g(window,"blur",(function(){return bf(Pc)}))}function ef(a){var b=a.display;b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize()}function ff(a){var b=a.split(/-(?!$)/);a=b[b.length-1];for(var c,d,e,f,g=0;g<b.length-1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else{if(!/^s(hift)?$/i.test(h))throw new Error("Unrecognized modifier name: "+h);e=!0}}return c&&(a="Alt-"+a),d&&(a="Ctrl-"+a),f&&(a="Cmd-"+a),e&&(a="Shift-"+a),a}function gf(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=q(c.split(" "),ff),f=0;f<e.length;f++){var g=void 0,h=void 0;f==e.length-1?(h=e.join(" "),g=d):(h=e.slice(0,f+1).join(" "),g="...");var i=b[h];if(i){if(i!=g)throw new Error("Inconsistent bindings for "+h)}else b[h]=g}delete a[c]}for(var j in b)a[j]=b[j];return a}function hf(a,b,c,d){b=mf(b);var e=b.call?b.call(a,d):b[a];if(!1===e)return"nothing";if("..."===e)return"multi";if(null!=e&&c(e))return"handled";if(b.fallthrough){if("[object Array]"!=Object.prototype.toString.call(b.fallthrough))return hf(a,b.fallthrough,c,d);for(var f=0;f<b.fallthrough.length;f++){var g=hf(a,b.fallthrough[f],c,d);if(g)return g}}}function jf(a){var b="string"==typeof a?a:Mh[a.keyCode];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b}function kf(a,b,c){var d=a;return b.altKey&&"Alt"!=d&&(a="Alt-"+a),(Jg?b.metaKey:b.ctrlKey)&&"Ctrl"!=d&&(a="Ctrl-"+a),(Jg?b.ctrlKey:b.metaKey)&&"Mod"!=d&&(a="Cmd-"+a),!c&&b.shiftKey&&"Shift"!=d&&(a="Shift-"+a),a}function lf(a,b){if(xg&&34==a.keyCode&&a.char)return!1;var c=Mh[a.keyCode];return null!=c&&!a.altGraphKey&&(3==a.keyCode&&a.code&&(c=a.code),kf(c,a,b))}function mf(a){return"string"==typeof a?Qh[a]:a}function nf(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&ia(f.from,p(d).to)<=0;){var g=d.pop();if(ia(g.from,f.from)<0){f.from=g.from;break}}d.push(f)}qd(a,(function(){for(var b=d.length-1;b>=0;b--)Le(a.doc,"",d[b].from,d[b].to,"+delete");Yc(a)}))}function of(a,b,c){var d=y(a.text,b+c,c);return d<0||d>a.text.length?null:d}function pf(a,b,c){var d=of(a,b.ch,c);return null==d?null:new ha(b.line,d,c<0?"after":"before")}function qf(a,b,c,d,e){if(a){"rtl"==b.doc.direction&&(e=-e);var f=C(c,b.doc.direction);if(f){var g,h=e<0?p(f):f[0],i=e<0==(1==h.level),j=i?"after":"before";if(h.level>0||"rtl"==b.doc.direction){var k=Vb(b,c);g=e<0?c.text.length-1:0;var l=Wb(b,k,g).top;g=z((function(a){return Wb(b,k,a).top==l}),e<0==(1==h.level)?h.from:h.to-1,g),"before"==j&&(g=of(c,g,1))}else g=e<0?h.to:h.from;return new ha(d,g,j)}}return new ha(d,e<0?c.text.length:0,e<0?"before":"after")}function rf(a,b,c,d){var e=C(b,a.doc.direction);if(!e)return pf(b,c,d);c.ch>=b.text.length?(c.ch=b.text.length,c.sticky="before"):c.ch<=0&&(c.ch=0,c.sticky="after");var f=B(e,c.ch,c.sticky),g=e[f];if("ltr"==a.doc.direction&&g.level%2==0&&(d>0?g.to>c.ch:g.from<c.ch))return pf(b,c,d);var h,i=function(a,c){return of(b,a instanceof ha?a.ch:a,c)},j=function(c){return a.options.lineWrapping?(h=h||Vb(a,b),nc(a,b,h,c)):{begin:0,end:b.text.length}},k=j("before"==c.sticky?i(c,-1):c.ch);if("rtl"==a.doc.direction||1==g.level){var l=1==g.level==d<0,m=i(c,l?1:-1);if(null!=m&&(l?m<=g.to&&m<=k.end:m>=g.from&&m>=k.begin)){var n=l?"before":"after";return new ha(c.line,m,n)}}var o=function(a,b,d){for(var f=function(a,b){return b?new ha(c.line,i(a,1),"before"):new ha(c.line,a,"after")};a>=0&&a<e.length;a+=b){var g=e[a],h=b>0==(1!=g.level),j=h?d.begin:i(d.end,-1);if(g.from<=j&&j<g.to)return f(j,h);if(j=h?g.from:i(g.to,-1),d.begin<=j&&j<d.end)return f(j,h)}},p=o(f+d,d,k);if(p)return p;var q=d>0?k.end:i(k.begin,-1);return null==q||d>0&&q==b.text.length||!(p=o(d>0?0:e.length-1,d,j(q)))?null:p}function sf(a,b){var c=_(a.doc,b),d=Xa(c);return d!=c&&(b=da(d)),qf(!0,a,d,b,1)}function tf(a,b){var c=_(a.doc,b),d=Ya(c);return d!=c&&(b=da(d)),qf(!0,a,c,b,-1)}function uf(a,b){var c=sf(a,b.line),d=_(a.doc,c.line),e=C(d,a.doc.direction);if(!e||0==e[0].level){var f=Math.max(c.ch,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return ha(c.line,g?0:f,c.sticky)}return c}function vf(a,b,c){if("string"==typeof b&&!(b=Rh[b]))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{a.isReadOnly()&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Rg}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function wf(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=hf(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&hf(b,a.options.extraKeys,c,a)||hf(b,a.options.keyMap,c,a)}function xf(a,b,c,d){var e=a.state.keySeq;if(e){if(jf(b))return"handled";if(/\'$/.test(b)?a.state.keySeq=null:Sh.set(50,(function(){a.state.keySeq==e&&(a.state.keySeq=null,a.display.input.reset())})),yf(a,e+" "+b,c,d))return!0}return yf(a,b,c,d)}function yf(a,b,c,d){var e=wf(a,b,d);return"multi"==e&&(a.state.keySeq=b),"handled"==e&&ub(a,"keyHandled",a,b,c),"handled"!=e&&"multi"!=e||(K(c),Lc(a)),!!e}function zf(a,b){var c=lf(b,!0);return!!c&&(b.shiftKey&&!a.state.keySeq?xf(a,"Shift-"+c,b,(function(b){return vf(a,b,!0)}))||xf(a,c,b,(function(b){if("string"==typeof b?/^go[A-Z]/.test(b):b.motion)return vf(a,b)})):xf(a,c,b,(function(b){return vf(a,b)})))}function Af(a,b,c){return xf(a,"'"+c+"'",b,(function(b){return vf(a,b,!0)}))}function Bf(a){var b=this;if(!(a.target&&a.target!=b.display.input.getField()||(b.curOp.focus=g(),G(b,a)))){sg&&tg<11&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var d=zf(b,a);xg&&(Th=d?c:null,!d&&88==c&&!dh&&(Eg?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),og&&!Eg&&!d&&46==c&&a.shiftKey&&!a.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Cf(b)}}function Cf(a){function b(a){18!=a.keyCode&&a.altKey||(Lg(c,"CodeMirror-crosshair"),E(document,"keyup",b),E(document,"mouseover",b))}var c=a.display.lineDiv;h(c,"CodeMirror-crosshair"),_g(document,"keyup",b),_g(document,"mouseover",b)}function Df(a){16==a.keyCode&&(this.doc.sel.shift=!1),G(this,a)}function Ef(a){var b=this;if(!(a.target&&a.target!=b.display.input.getField()||Jb(b.display,a)||G(b,a)||a.ctrlKey&&!a.altKey||Eg&&a.metaKey)){var c=a.keyCode,d=a.charCode;if(xg&&c==Th)return Th=null,void K(a);if(!xg||a.which&&!(a.which<10)||!zf(b,a)){var e=String.fromCharCode(null==d?c:d);"\b"!=e&&(Af(b,a,e)||b.display.input.onKeyPress(a))}}}function Ff(a,b){var c=+new Date;return Wh&&Wh.compare(c,a,b)?(Vh=Wh=null,"triple"):Vh&&Vh.compare(c,a,b)?(Wh=new Uh(c,a,b),Vh=null,"double"):(Vh=new Uh(c,a,b),Wh=null,"single")}function Gf(a){var b=this,c=b.display;if(!(G(b,a)||c.activeTouch&&c.input.supportsTouch())){if(c.input.ensurePolled(),c.shift=a.shiftKey,Jb(c,a))return void(ug||(c.scroller.draggable=!1,setTimeout((function(){return c.scroller.draggable=!0}),100)));if(!Pf(b,a)){var d=yc(b,a),e=P(a),f=d?Ff(d,e):"single";window.focus(),1==e&&b.state.selectingText&&b.state.selectingText(a),d&&Hf(b,e,d,f,a)||(1==e?d?Jf(b,d,f,a):O(a)==c.scroller&&K(a):2==e?(d&&pe(b.doc,d),setTimeout((function(){return c.input.focus()}),20)):3==e&&(Kg?b.display.input.onContextMenu(a):Nc(b)))}}}function Hf(a,b,c,d,e){var f="Click";return"double"==d?f="Double"+f:"triple"==d&&(f="Triple"+f),f=(1==b?"Left":2==b?"Middle":"Right")+f,xf(a,kf(f,e),e,(function(b){if("string"==typeof b&&(b=Rh[b]),!b)return!1;var d=!1;try{a.isReadOnly()&&(a.state.suppressEdits=!0),d=b(a,c)!=Rg}finally{a.state.suppressEdits=!1}return d}))}function If(a,b,c){var d=a.getOption("configureMouse"),e=d?d(a,b,c):{};if(null==e.unit){var f=Fg?c.shiftKey&&c.metaKey:c.altKey;e.unit=f?"rectangle":"single"==b?"char":"double"==b?"word":"line"}return(null==e.extend||a.doc.extend)&&(e.extend=a.doc.extend||c.shiftKey),null==e.addNew&&(e.addNew=Eg?c.metaKey:c.ctrlKey),null==e.moveOnDrag&&(e.moveOnDrag=!(Eg?c.altKey:c.ctrlKey)),e}function Jf(a,b,c,d){sg?setTimeout(j(Mc,a),0):a.curOp.focus=g();var e,f=If(a,c,d),h=a.doc.sel;a.options.dragDrop&&ah&&!a.isReadOnly()&&"single"==c&&(e=h.contains(b))>-1&&(ia((e=h.ranges[e]).from(),b)<0||b.xRel>0)&&(ia(e.to(),b)>0||b.xRel<0)?Kf(a,d,b,f):Mf(a,d,b,f)}function Kf(a,b,c,d){var e=a.display,f=!1,g=rd(a,(function(b){ug&&(e.scroller.draggable=!1),a.state.draggingText=!1,a.state.delayingBlurEvent&&(a.hasFocus()?a.state.delayingBlurEvent=!1:Nc(a)),E(e.wrapper.ownerDocument,"mouseup",g),E(e.wrapper.ownerDocument,"mousemove",h),E(e.scroller,"dragstart",i),E(e.scroller,"drop",g),f||(K(b),d.addNew||pe(a.doc,c,null,null,d.extend),ug&&!yg||sg&&9==tg?setTimeout((function(){e.wrapper.ownerDocument.body.focus({preventScroll:!0}),e.input.focus()}),20):e.input.focus())})),h=function(a){f=f||Math.abs(b.clientX-a.clientX)+Math.abs(b.clientY-a.clientY)>=10},i=function(){return f=!0};ug&&(e.scroller.draggable=!0),a.state.draggingText=g,g.copy=!d.moveOnDrag,_g(e.wrapper.ownerDocument,"mouseup",g),_g(e.wrapper.ownerDocument,"mousemove",h),_g(e.scroller,"dragstart",i),_g(e.scroller,"drop",g),a.state.delayingBlurEvent=!0,setTimeout((function(){return e.input.focus()}),20),e.scroller.dragDrop&&e.scroller.dragDrop()}function Lf(a,b,c){if("char"==c)return new Dh(b,b);if("word"==c)return a.findWordAt(b);if("line"==c)return new Dh(ha(b.line,0),oa(a.doc,ha(b.line+1,0)));var d=c(a,b);return new Dh(d.from,d.to)}function Mf(a,b,c,d){function e(b){if(0!=ia(r,b))if(r=b,"rectangle"==d.unit){for(var e=[],f=a.options.tabSize,g=l(_(j,c.line).text,c.ch,f),h=l(_(j,b.line).text,b.ch,f),i=Math.min(g,h),p=Math.max(g,h),q=Math.min(c.line,b.line),s=Math.min(a.lastLine(),Math.max(c.line,b.line));q<=s;q++){var t=_(j,q).text,u=n(t,i,f);i==p?e.push(new Dh(ha(q,u),ha(q,u))):t.length>u&&e.push(new Dh(ha(q,u),ha(q,n(t,p,f))))}e.length||e.push(new Dh(c,c)),ve(j,Od(a,o.ranges.slice(0,m).concat(e),m),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var v,w=k,x=Lf(a,b,d.unit),y=w.anchor;ia(x.anchor,y)>0?(v=x.head,y=ma(w.from(),x.anchor)):(v=x.anchor,y=la(w.to(),x.head));var z=o.ranges.slice(0);z[m]=Nf(a,new Dh(oa(j,y),v)),ve(j,Od(a,z,m),Tg)}}function f(b){var c=++t,h=yc(a,b,!0,"rectangle"==d.unit);if(h)if(0!=ia(h,r)){a.curOp.focus=g(),e(h);var k=Sc(i,j);(h.line>=k.to||h.line<k.from)&&setTimeout(rd(a,(function(){t==c&&f(b)})),150)}else{var l=b.clientY<s.top?-20:b.clientY>s.bottom?20:0;l&&setTimeout(rd(a,(function(){t==c&&(i.scroller.scrollTop+=l,f(b))})),50)}}function h(b){a.state.selectingText=!1,t=1/0,b&&(K(b),i.input.focus()),E(i.wrapper.ownerDocument,"mousemove",u),E(i.wrapper.ownerDocument,"mouseup",v),j.history.lastSelOrigin=null}sg&&Nc(a);var i=a.display,j=a.doc;K(b);var k,m,o=j.sel,p=o.ranges;if(d.addNew&&!d.extend?(m=j.sel.contains(c),k=m>-1?p[m]:new Dh(c,c)):(k=j.sel.primary(),m=j.sel.primIndex),"rectangle"==d.unit)d.addNew||(k=new Dh(c,c)),c=yc(a,b,!0,!0),m=-1;else{var q=Lf(a,c,d.unit);k=d.extend?oe(k,q.anchor,q.head,d.extend):q}d.addNew?-1==m?(m=p.length,ve(j,Od(a,p.concat([k]),m),{scroll:!1,origin:"*mouse"})):p.length>1&&p[m].empty()&&"char"==d.unit&&!d.extend?(ve(j,Od(a,p.slice(0,m).concat(p.slice(m+1)),0),{scroll:!1,origin:"*mouse"}),o=j.sel):re(j,m,k,Tg):(m=0,ve(j,new Ch([k],0),Tg),o=j.sel);var r=c,s=i.wrapper.getBoundingClientRect(),t=0,u=rd(a,(function(a){0!==a.buttons&&P(a)?f(a):h(a)})),v=rd(a,h);a.state.selectingText=v,_g(i.wrapper.ownerDocument,"mousemove",u),_g(i.wrapper.ownerDocument,"mouseup",v)}function Nf(a,b){var c=b.anchor,d=b.head,e=_(a.doc,c.line);if(0==ia(c,d)&&c.sticky==d.sticky)return b;var f=C(e);if(!f)return b;var g=B(f,c.ch,c.sticky),h=f[g];if(h.from!=c.ch&&h.to!=c.ch)return b;var i=g+(h.from==c.ch==(1!=h.level)?0:1);if(0==i||i==f.length)return b;var j;if(d.line!=c.line)j=(d.line-c.line)*("ltr"==a.doc.direction?1:-1)>0;else{var k=B(f,d.ch,d.sticky),l=k-g||(d.ch-c.ch)*(1==h.level?-1:1);j=k==i-1||k==i?l<0:l>0}var m=f[i+(j?-1:0)],n=j==(1==m.level),o=n?m.from:m.to,p=n?"after":"before";return c.ch==o&&c.sticky==p?b:new Dh(new ha(c.line,o,p),d)}function Of(a,b,c,d){var e,f;if(b.touches)e=b.touches[0].clientX,f=b.touches[0].clientY;else try{e=b.clientX,f=b.clientY}catch(a){return!1}if(e>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&K(b);var g=a.display,h=g.lineDiv.getBoundingClientRect();if(f>h.bottom||!I(a,c))return M(b);f-=h.top-g.viewOffset;for(var i=0;i<a.display.gutterSpecs.length;++i){var j=g.gutters.childNodes[i];if(j&&j.getBoundingClientRect().right>=e){return F(a,c,a,ea(a.doc,f),a.display.gutterSpecs[i].className,b),M(b)}}}function Pf(a,b){return Of(a,b,"gutterClick",!0)}function Qf(a,b){Jb(a.display,b)||Rf(a,b)||G(a,b,"contextmenu")||Kg||a.display.input.onContextMenu(b)}function Rf(a,b){return!!I(a,"gutterContextMenu")&&Of(a,b,"gutterContextMenu",!1)}function Sf(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),bc(a)}function Tf(a,b,c){if(!b!=!(c&&c!=Xh)){var d=a.display.dragFunctions,e=b?_g:E;e(a.display.scroller,"dragstart",d.start),e(a.display.scroller,"dragenter",d.enter),e(a.display.scroller,"dragover",d.over),e(a.display.scroller,"dragleave",d.leave),e(a.display.scroller,"drop",d.drop)}}function Uf(a){a.options.lineWrapping?(h(a.display.wrapper,"CodeMirror-wrap"),
a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(Lg(a.display.wrapper,"CodeMirror-wrap"),eb(a)),xc(a),Ac(a),bc(a),setTimeout((function(){return fd(a)}),100)}function Vf(a,b){var c=this;if(!(this instanceof Vf))return new Vf(a,b);this.options=b=b?k(b):{},k(Yh,b,!1);var d=b.value;"string"==typeof d?d=new Jh(d,b.mode,null,b.lineSeparator,b.direction):b.mode&&(d.modeOption=b.mode),this.doc=d;var e=new Vf.inputStyles[b.inputStyle](this),f=this.display=new Kd(a,d,e,b);f.wrapper.CodeMirror=this,Sf(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),hd(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new Ng,keySeq:null,specialChars:null},b.autofocus&&!Dg&&f.input.focus(),sg&&tg<11&&setTimeout((function(){return c.display.input.reset(!0)}),20),Wf(this),cf(),id(this),this.curOp.forceUpdate=!0,$d(this,d),b.autofocus&&!Dg||this.hasFocus()?setTimeout((function(){c.hasFocus()&&!c.state.focused&&Oc(c)}),20):Pc(this);for(var g in Zh)Zh.hasOwnProperty(g)&&Zh[g](this,b[g],Xh);Gd(this),b.finishInit&&b.finishInit(this);for(var h=0;h<$h.length;++h)$h[h](this);jd(this),ug&&b.lineWrapping&&"optimizelegibility"==getComputedStyle(f.lineDiv).textRendering&&(f.lineDiv.style.textRendering="auto")}function Wf(a){function b(){e.activeTouch&&(f=setTimeout((function(){return e.activeTouch=null}),1e3),g=e.activeTouch,g.end=+new Date)}function c(a){if(1!=a.touches.length)return!1;var b=a.touches[0];return b.radiusX<=1&&b.radiusY<=1}function d(a,b){if(null==b.left)return!0;var c=b.left-a.left,d=b.top-a.top;return c*c+d*d>400}var e=a.display;_g(e.scroller,"mousedown",rd(a,Gf)),sg&&tg<11?_g(e.scroller,"dblclick",rd(a,(function(b){if(!G(a,b)){var c=yc(a,b);if(c&&!Pf(a,b)&&!Jb(a.display,b)){K(b);var d=a.findWordAt(c);pe(a.doc,d.anchor,d.head)}}}))):_g(e.scroller,"dblclick",(function(b){return G(a,b)||K(b)})),_g(e.scroller,"contextmenu",(function(b){return Qf(a,b)})),_g(e.input.getField(),"contextmenu",(function(b){e.scroller.contains(b.target)||Qf(a,b)}));var f,g={end:0};_g(e.scroller,"touchstart",(function(b){if(!G(a,b)&&!c(b)&&!Pf(a,b)){e.input.ensurePolled(),clearTimeout(f);var d=+new Date;e.activeTouch={start:d,moved:!1,prev:d-g.end<=300?g:null},1==b.touches.length&&(e.activeTouch.left=b.touches[0].pageX,e.activeTouch.top=b.touches[0].pageY)}})),_g(e.scroller,"touchmove",(function(){e.activeTouch&&(e.activeTouch.moved=!0)})),_g(e.scroller,"touchend",(function(c){var f=e.activeTouch;if(f&&!Jb(e,c)&&null!=f.left&&!f.moved&&new Date-f.start<300){var g,h=a.coordsChar(e.activeTouch,"page");g=!f.prev||d(f,f.prev)?new Dh(h,h):!f.prev.prev||d(f,f.prev.prev)?a.findWordAt(h):new Dh(ha(h.line,0),oa(a.doc,ha(h.line+1,0))),a.setSelection(g.anchor,g.head),a.focus(),K(c)}b()})),_g(e.scroller,"touchcancel",b),_g(e.scroller,"scroll",(function(){e.scroller.clientHeight&&(bd(a,e.scroller.scrollTop),dd(a,e.scroller.scrollLeft,!0),F(a,"scroll",a))})),_g(e.scroller,"mousewheel",(function(b){return Nd(a,b)})),_g(e.scroller,"DOMMouseScroll",(function(b){return Nd(a,b)})),_g(e.wrapper,"scroll",(function(){return e.wrapper.scrollTop=e.wrapper.scrollLeft=0})),e.dragFunctions={enter:function(b){G(a,b)||N(b)},over:function(b){G(a,b)||(_e(a,b),N(b))},start:function(b){return $e(a,b)},drop:rd(a,Ze),leave:function(b){G(a,b)||af(a)}};var h=e.input.getField();_g(h,"keyup",(function(b){return Df.call(a,b)})),_g(h,"keydown",rd(a,Bf)),_g(h,"keypress",rd(a,Ef)),_g(h,"focus",(function(b){return Oc(a,b)})),_g(h,"blur",(function(b){return Pc(a,b)}))}function Xf(a,b,c,d){var e,f=a.doc;null==c&&(c="add"),"smart"==c&&(f.mode.indent?e=ta(a,b).state:c="prev");var g=a.options.tabSize,h=_(f,b),i=l(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var j,k=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&((j=f.mode.indent(e,h.text.slice(k.length),h.text))==Rg||j>150)){if(!d)return;c="prev"}}else j=0,c="not";"prev"==c?j=b>f.first?l(_(f,b-1).text,null,g):0:"add"==c?j=i+a.options.indentUnit:"subtract"==c?j=i-a.options.indentUnit:"number"==typeof c&&(j=i+c),j=Math.max(0,j);var m="",n=0;if(a.options.indentWithTabs)for(var p=Math.floor(j/g);p;--p)n+=g,m+="\t";if(n<j&&(m+=o(j-n)),m!=k)return Le(f,m,ha(b,0),ha(b,k.length),"+input"),h.stateAfter=null,!0;for(var q=0;q<f.sel.ranges.length;q++){var r=f.sel.ranges[q];if(r.head.line==b&&r.head.ch<k.length){var s=ha(b,k.length);re(f,q,new Dh(s,s));break}}}function Yf(a){_h=a}function Zf(a,b,c,d,e){var f=a.doc;a.display.shift=!1,d||(d=f.sel);var g=+new Date-200,h="paste"==e||a.state.pasteIncoming>g,i=bh(b),j=null;if(h&&d.ranges.length>1)if(_h&&_h.text.join("\n")==b){if(d.ranges.length%_h.text.length==0){j=[];for(var k=0;k<_h.text.length;k++)j.push(f.splitLines(_h.text[k]))}}else i.length==d.ranges.length&&a.options.pasteLinesPerSelection&&(j=q(i,(function(a){return[a]})));for(var l=a.curOp.updateInput,m=d.ranges.length-1;m>=0;m--){var n=d.ranges[m],o=n.from(),r=n.to();n.empty()&&(c&&c>0?o=ha(o.line,o.ch-c):a.state.overwrite&&!h?r=ha(r.line,Math.min(_(f,r.line).text.length,r.ch+p(i).length)):h&&_h&&_h.lineWise&&_h.text.join("\n")==i.join("\n")&&(o=r=ha(o.line,0)));var s={from:o,to:r,text:j?j[m%j.length]:i,origin:e||(h?"paste":a.state.cutIncoming>g?"cut":"+input")};Fe(a.doc,s),ub(a,"inputRead",a,s)}b&&!h&&_f(a,b),Yc(a),a.curOp.updateInput<2&&(a.curOp.updateInput=l),a.curOp.typing=!0,a.state.pasteIncoming=a.state.cutIncoming=-1}function $f(a,b){var c=a.clipboardData&&a.clipboardData.getData("Text");if(c)return a.preventDefault(),b.isReadOnly()||b.options.disableInput||qd(b,(function(){return Zf(b,c,0,null,"paste")})),!0}function _f(a,b){if(a.options.electricChars&&a.options.smartIndent)for(var c=a.doc.sel,d=c.ranges.length-1;d>=0;d--){var e=c.ranges[d];if(!(e.head.ch>100||d&&c.ranges[d-1].head.line==e.head.line)){var f=a.getModeAt(e.head),g=!1;if(f.electricChars){for(var h=0;h<f.electricChars.length;h++)if(b.indexOf(f.electricChars.charAt(h))>-1){g=Xf(a,e.head.line,"smart");break}}else f.electricInput&&f.electricInput.test(_(a.doc,e.head.line).text.slice(0,e.head.ch))&&(g=Xf(a,e.head.line,"smart"));g&&ub(a,"electricInput",a,e.head.line)}}}function ag(a){for(var b=[],c=[],d=0;d<a.doc.sel.ranges.length;d++){var e=a.doc.sel.ranges[d].head.line,f={anchor:ha(e,0),head:ha(e+1,0)};c.push(f),b.push(a.getRange(f.anchor,f.head))}return{text:b,ranges:c}}function bg(a,b,c,d){a.setAttribute("autocorrect",c?"":"off"),a.setAttribute("autocapitalize",d?"":"off"),a.setAttribute("spellcheck",!!b)}function cg(){var a=d("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),b=d("div",[a],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return ug?a.style.width="1000px":a.setAttribute("wrap","off"),Bg&&(a.style.border="1px solid black"),bg(a),b}function dg(a,b,c,d,e){function f(){var c=b.line+k;return!(c<a.first||c>=a.first+a.size)&&(b=new ha(c,b.ch,b.sticky),j=_(a,c))}function g(g){var h;if("codepoint"==d){var i=j.text.charCodeAt(b.ch+(c>0?0:-1));if(isNaN(i))h=null;else{var l=c>0?i>=55296&&i<56320:i>=56320&&i<57343;h=new ha(b.line,Math.max(0,Math.min(j.text.length,b.ch+c*(l?2:1))),-c)}}else h=e?rf(a.cm,j,b,c):pf(j,b,c);if(null==h){if(g||!f())return!1;b=qf(e,a.cm,j,b.line,k)}else b=h;return!0}var h=b,i=c,j=_(a,b.line),k=e&&"rtl"==a.direction?-c:c;if("char"==d||"codepoint"==d)g();else if("column"==d)g(!0);else if("word"==d||"group"==d)for(var l=null,m="group"==d,n=a.cm&&a.cm.getHelper(b,"wordChars"),o=!0;!(c<0)||g(!o);o=!1){var p=j.text.charAt(b.ch)||"\n",q=v(p,n)?"w":m&&"\n"==p?"n":!m||/\s/.test(p)?null:"p";if(!m||o||q||(q="s"),l&&l!=q){c<0&&(c=1,g(),b.sticky="after");break}if(q&&(l=q),c>0&&!g(!o))break}var r=Be(a,b,h,i,!0);return ja(h,r)&&(r.hitSide=!0),r}function eg(a,b,c,d){var e,f=a.doc,g=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),i=Math.max(h-.5*sc(a.display),3);e=(c>0?b.bottom:b.top)+c*i}else"line"==d&&(e=c>0?b.bottom+3:b.top-3);for(var j;j=lc(a,g,e),j.outside;){if(c<0?e<=0:e>=f.height){j.hitSide=!0;break}e+=5*c}return j}function fg(a,b){var c=Ub(a,b.line);if(!c||c.hidden)return null;var d=_(a.doc,b.line),e=Rb(c,d,b.line),f=C(d,a.doc.direction),g="left";if(f){g=B(f,b.ch)%2?"right":"left"}var h=Xb(e.map,b.ch,g);return h.offset="right"==h.collapse?h.end:h.start,h}function gg(a){for(var b=a;b;b=b.parentNode)if(/CodeMirror-gutter-wrapper/.test(b.className))return!0;return!1}function hg(a,b){return b&&(a.bad=!0),a}function ig(a,b,c,d,e){function f(a){return function(b){return b.id==a}}function g(){k&&(j+=l,m&&(j+=l),k=m=!1)}function h(a){a&&(g(),j+=a)}function i(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(c)return void h(c);var j,n=b.getAttribute("cm-marker");if(n){var o=a.findMarks(ha(d,0),ha(e+1,0),f(+n));return void(o.length&&(j=o[0].find(0))&&h(aa(a.doc,j.from,j.to).join(l)))}if("false"==b.getAttribute("contenteditable"))return;var p=/^(pre|div|p|li|table|br)$/i.test(b.nodeName);if(!/^br$/i.test(b.nodeName)&&0==b.textContent.length)return;p&&g();for(var q=0;q<b.childNodes.length;q++)i(b.childNodes[q]);/^(pre|p)$/i.test(b.nodeName)&&(m=!0),p&&(k=!0)}else 3==b.nodeType&&h(b.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "))}for(var j="",k=!1,l=a.doc.lineSeparator(),m=!1;i(b),b!=c;)b=b.nextSibling,m=!1;return j}function jg(a,b,c){var d;if(b==a.display.lineDiv){if(!(d=a.display.lineDiv.childNodes[c]))return hg(a.clipPos(ha(a.display.viewTo-1)),!0);b=null,c=0}else for(d=b;;d=d.parentNode){if(!d||d==a.display.lineDiv)return null;if(d.parentNode&&d.parentNode==a.display.lineDiv)break}for(var e=0;e<a.display.view.length;e++){var f=a.display.view[e];if(f.node==d)return kg(f,b,c)}}function kg(a,b,c){function d(b,c,d){for(var e=-1;e<(l?l.length:0);e++)for(var f=e<0?k.map:l[e],g=0;g<f.length;g+=3){var h=f[g+2];if(h==b||h==c){var i=da(e<0?a.line:a.rest[e]),j=f[g]+d;return(d<0||h!=b)&&(j=f[g+(d?1:0)]),ha(i,j)}}}var e=a.text.firstChild,g=!1;if(!b||!f(e,b))return hg(ha(da(a.line),0),!0);if(b==e&&(g=!0,b=e.childNodes[c],c=0,!b)){var h=a.rest?p(a.rest):a.line;return hg(ha(da(h),h.text.length),g)}var i=3==b.nodeType?b:null,j=b;for(i||1!=b.childNodes.length||3!=b.firstChild.nodeType||(i=b.firstChild,c&&(c=i.nodeValue.length));j.parentNode!=e;)j=j.parentNode;var k=a.measure,l=k.maps,m=d(i,j,c);if(m)return hg(m,g);for(var n=j.nextSibling,o=i?i.nodeValue.length-c:0;n;n=n.nextSibling){if(m=d(n,n.firstChild,0))return hg(ha(m.line,m.ch-o),g);o+=n.textContent.length}for(var q=j.previousSibling,r=c;q;q=q.previousSibling){if(m=d(q,q.firstChild,-1))return hg(ha(m.line,m.ch+r),g);r+=q.textContent.length}}function lg(a,b){function c(){a.value=i.getValue()}if(b=b?k(b):{},b.value=a.value,!b.tabindex&&a.tabIndex&&(b.tabindex=a.tabIndex),!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder),null==b.autofocus){var d=g();b.autofocus=d==a||null!=a.getAttribute("autofocus")&&d==document.body}var e;if(a.form&&(_g(a.form,"submit",c),!b.leaveSubmitMethodAlone)){var f=a.form;e=f.submit;try{var h=f.submit=function(){c(),f.submit=e,f.submit(),f.submit=h}}catch(a){}}b.finishInit=function(d){d.save=c,d.getTextArea=function(){return a},d.toTextArea=function(){d.toTextArea=isNaN,c(),a.parentNode.removeChild(d.getWrapperElement()),a.style.display="",a.form&&(E(a.form,"submit",c),b.leaveSubmitMethodAlone||"function"!=typeof a.form.submit||(a.form.submit=e))}},a.style.display="none";var i=Vf((function(b){return a.parentNode.insertBefore(b,a.nextSibling)}),b);return i}var mg=navigator.userAgent,ng=navigator.platform,og=/gecko\/\d/i.test(mg),pg=/MSIE \d/.test(mg),qg=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(mg),rg=/Edge\/(\d+)/.exec(mg),sg=pg||qg||rg,tg=sg&&(pg?document.documentMode||6:+(rg||qg)[1]),ug=!rg&&/WebKit\//.test(mg),vg=ug&&/Qt\/\d+\.\d+/.test(mg),wg=!rg&&/Chrome\//.test(mg),xg=/Opera\//.test(mg),yg=/Apple Computer/.test(navigator.vendor),zg=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(mg),Ag=/PhantomJS/.test(mg),Bg=yg&&(/Mobile\/\w+/.test(mg)||navigator.maxTouchPoints>2),Cg=/Android/.test(mg),Dg=Bg||Cg||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(mg),Eg=Bg||/Mac/.test(ng),Fg=/\bCrOS\b/.test(mg),Gg=/win/i.test(ng),Hg=xg&&mg.match(/Version\/(\d*\.\d*)/);Hg&&(Hg=Number(Hg[1])),Hg&&Hg>=15&&(xg=!1,ug=!0);var Ig,Jg=Eg&&(vg||xg&&(null==Hg||Hg<12.11)),Kg=og||sg&&tg>=9,Lg=function(b,c){var d=b.className,e=a(c).exec(d);if(e){var f=d.slice(e.index+e[0].length);b.className=d.slice(0,e.index)+(f?e[1]+f:"")}};Ig=document.createRange?function(a,b,c,d){var e=document.createRange();return e.setEnd(d||a,c),e.setStart(a,b),e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(a){return d}return d.collapse(!0),d.moveEnd("character",c),d.moveStart("character",b),d};var Mg=function(a){a.select()};Bg?Mg=function(a){a.selectionStart=0,a.selectionEnd=a.value.length}:sg&&(Mg=function(a){try{a.select()}catch(a){}});var Ng=function(){this.id=null,this.f=null,this.time=0,this.handler=j(this.onTimeout,this)};Ng.prototype.onTimeout=function(a){a.id=0,a.time<=+new Date?a.f():setTimeout(a.handler,a.time-+new Date)},Ng.prototype.set=function(a,b){this.f=b;var c=+new Date+a;(!this.id||c<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,a),this.time=c)};var Og,Pg,Qg=50,Rg={toString:function(){return"CodeMirror.Pass"}},Sg={scroll:!1},Tg={origin:"*mouse"},Ug={origin:"+move"},Vg=[""],Wg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,Xg=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,Yg=null,Zg=(function(){function a(a){return a<=247?c.charAt(a):1424<=a&&a<=1524?"R":1536<=a&&a<=1785?d.charAt(a-1536):1774<=a&&a<=2220?"r":8192<=a&&a<=8203?"w":8204==a?"b":"L"}function b(a,b,c){this.level=a,this.from=b,this.to=c}var c="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",d="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",e=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,f=/[stwN]/,g=/[LRr]/,h=/[Lb1n]/,i=/[1n]/;return function(c,d){var j="ltr"==d?"L":"R";if(0==c.length||"ltr"==d&&!e.test(c))return!1;for(var k=c.length,l=[],m=0;m<k;++m)l.push(a(c.charCodeAt(m)));for(var n=0,o=j;n<k;++n){var q=l[n];"m"==q?l[n]=o:o=q}for(var r=0,s=j;r<k;++r){var t=l[r];"1"==t&&"r"==s?l[r]="n":g.test(t)&&(s=t,"r"==t&&(l[r]="R"))}for(var u=1,v=l[0];u<k-1;++u){var w=l[u];"+"==w&&"1"==v&&"1"==l[u+1]?l[u]="1":","!=w||v!=l[u+1]||"1"!=v&&"n"!=v||(l[u]=v),v=w}for(var x=0;x<k;++x){var y=l[x];if(","==y)l[x]="N";else if("%"==y){var z=void 0;for(z=x+1;z<k&&"%"==l[z];++z);for(var A=x&&"!"==l[x-1]||z<k&&"1"==l[z]?"1":"N",B=x;B<z;++B)l[B]=A;x=z-1}}for(var C=0,D=j;C<k;++C){var E=l[C];"L"==D&&"1"==E?l[C]="L":g.test(E)&&(D=E)}for(var F=0;F<k;++F)if(f.test(l[F])){var G=void 0;for(G=F+1;G<k&&f.test(l[G]);++G);for(var H="L"==(F?l[F-1]:j),I="L"==(G<k?l[G]:j),J=H==I?H?"L":"R":j,K=F;K<G;++K)l[K]=J;F=G-1}for(var L,M=[],N=0;N<k;)if(h.test(l[N])){var O=N;for(++N;N<k&&h.test(l[N]);++N);M.push(new b(0,O,N))}else{var P=N,Q=M.length,R="rtl"==d?1:0;for(++N;N<k&&"L"!=l[N];++N);for(var S=P;S<N;)if(i.test(l[S])){P<S&&(M.splice(Q,0,new b(1,P,S)),Q+=R);var T=S;for(++S;S<N&&i.test(l[S]);++S);M.splice(Q,0,new b(2,T,S)),Q+=R,P=S}else++S;P<N&&M.splice(Q,0,new b(1,P,N))}return"ltr"==d&&(1==M[0].level&&(L=c.match(/^\s+/))&&(M[0].from=L[0].length,M.unshift(new b(0,0,L[0].length))),1==p(M).level&&(L=c.match(/\s+$/))&&(p(M).to-=L[0].length,M.push(new b(0,k-L[0].length,k)))),"rtl"==d?M.reverse():M}})(),$g=[],_g=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a._handlers||(a._handlers={});d[b]=(d[b]||$g).concat(c)}},ah=(function(){if(sg&&tg<9)return!1;var a=d("div");return"draggable"in a||"dragDrop"in a})(),bh=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;b<=d;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},ch=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(a){return!1}}:function(a){var b;try{b=a.ownerDocument.selection.createRange()}catch(a){}return!(!b||b.parentElement()!=a)&&0!=b.compareEndPoints("StartToEnd",b)},dh=(function(){var a=d("div");return"oncopy"in a||(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)})(),eh=null,fh={},gh={},hh={},ih=function(a,b,c){this.pos=this.start=0,this.string=a,this.tabSize=b||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=c};ih.prototype.eol=function(){return this.pos>=this.string.length},ih.prototype.sol=function(){return this.pos==this.lineStart},ih.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},ih.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},ih.prototype.eat=function(a){var b=this.string.charAt(this.pos);if("string"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},ih.prototype.eatWhile=function(a){for(var b=this.pos;this.eat(a););return this.pos>b},ih.prototype.eatSpace=function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},ih.prototype.skipToEnd=function(){this.pos=this.string.length},ih.prototype.skipTo=function(a){var b=this.string.indexOf(a,this.pos);if(b>-1)return this.pos=b,!0},ih.prototype.backUp=function(a){this.pos-=a},ih.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=l(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?l(this.string,this.lineStart,this.tabSize):0)},ih.prototype.indentation=function(){return l(this.string,null,this.tabSize)-(this.lineStart?l(this.string,this.lineStart,this.tabSize):0)},ih.prototype.match=function(a,b,c){if("string"!=typeof a){var d=this.string.slice(this.pos).match(a);return d&&d.index>0?null:(d&&!1!==b&&(this.pos+=d[0].length),d)}var e=function(a){return c?a.toLowerCase():a};if(e(this.string.substr(this.pos,a.length))==e(a))return!1!==b&&(this.pos+=a.length),!0},ih.prototype.current=function(){return this.string.slice(this.start,this.pos)},ih.prototype.hideFirstChars=function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}},ih.prototype.lookAhead=function(a){var b=this.lineOracle;return b&&b.lookAhead(a)},ih.prototype.baseToken=function(){var a=this.lineOracle;return a&&a.baseToken(this.pos)};var jh=function(a,b){this.state=a,this.lookAhead=b},kh=function(a,b,c,d){this.state=b,this.doc=a,this.line=c,this.maxLookAhead=d||0,this.baseTokens=null,this.baseTokenPos=1};kh.prototype.lookAhead=function(a){var b=this.doc.getLine(this.line+a);return null!=b&&a>this.maxLookAhead&&(this.maxLookAhead=a),b},kh.prototype.baseToken=function(a){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=a;)this.baseTokenPos+=2;var b=this.baseTokens[this.baseTokenPos+1];return{type:b&&b.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-a}},kh.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},kh.fromSaved=function(a,b,c){return b instanceof jh?new kh(a,Y(a.mode,b.state),c,b.lookAhead):new kh(a,Y(a.mode,b),c)},kh.prototype.save=function(a){var b=!1!==a?Y(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new jh(b,this.maxLookAhead):b};var lh=function(a,b,c){this.start=a.start,this.end=a.pos,this.string=a.current(),this.type=b||null,this.state=c},mh=!1,nh=!1,oh=function(a,b,c){this.text=a,Oa(this,b),this.height=c?c(this):1};oh.prototype.lineNo=function(){return da(this)},J(oh);var ph,qh={},rh={},sh=null,th=null,uh={left:0,right:0,top:0,bottom:0},vh=function(a,b,c){this.cm=c;var e=this.vert=d("div",[d("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),f=this.horiz=d("div",[d("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e.tabIndex=f.tabIndex=-1,a(e),a(f),_g(e,"scroll",(function(){e.clientHeight&&b(e.scrollTop,"vertical")})),_g(f,"scroll",(function(){f.clientWidth&&b(f.scrollLeft,"horizontal")})),this.checkedZeroWidth=!1,sg&&tg<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};vh.prototype.update=function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=Math.max(0,a.scrollWidth-a.clientWidth+f)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&a.clientHeight>0&&(0==d&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:c?d:0,bottom:b?d:0}},vh.prototype.setScrollLeft=function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},vh.prototype.setScrollTop=function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},vh.prototype.zeroWidthHack=function(){var a=Eg&&!zg?"12px":"18px";this.horiz.style.height=this.vert.style.width=a,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new Ng,this.disableVert=new Ng},vh.prototype.enableZeroWidthBar=function(a,b,c){function d(){var e=a.getBoundingClientRect();("vert"==c?document.elementFromPoint(e.right-1,(e.top+e.bottom)/2):document.elementFromPoint((e.right+e.left)/2,e.bottom-1))!=a?a.style.pointerEvents="none":b.set(1e3,d)}a.style.pointerEvents="auto",b.set(1e3,d)},vh.prototype.clear=function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)};var wh=function(){};wh.prototype.update=function(){return{bottom:0,right:0}},wh.prototype.setScrollLeft=function(){},wh.prototype.setScrollTop=function(){},wh.prototype.clear=function(){};var xh={native:vh,null:wh},yh=0,zh=function(a,b,c){var d=a.display;this.viewport=b,this.visible=Sc(d,a.doc,b),this.editorIsHidden=!d.wrapper.offsetWidth,this.wrapperHeight=d.wrapper.clientHeight,this.wrapperWidth=d.wrapper.clientWidth,this.oldDisplayWidth=Ob(a),this.force=c,this.dims=uc(a),this.events=[]};zh.prototype.signal=function(a,b){I(a,b)&&this.events.push(arguments)},zh.prototype.finish=function(){for(var a=0;a<this.events.length;a++)F.apply(null,this.events[a])};var Ah=0,Bh=null;sg?Bh=-.53:og?Bh=15:wg?Bh=-.7:yg&&(Bh=-1/3);var Ch=function(a,b){this.ranges=a,this.primIndex=b};Ch.prototype.primary=function(){return this.ranges[this.primIndex]},Ch.prototype.equals=function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(!ja(c.anchor,d.anchor)||!ja(c.head,d.head))return!1}return!0},Ch.prototype.deepCopy=function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new Dh(ka(this.ranges[b].anchor),ka(this.ranges[b].head));return new Ch(a,this.primIndex)},Ch.prototype.somethingSelected=function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},Ch.prototype.contains=function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(ia(b,d.from())>=0&&ia(a,d.to())<=0)return c}return-1};var Dh=function(a,b){this.anchor=a,this.head=b};Dh.prototype.from=function(){return ma(this.anchor,this.head)},Dh.prototype.to=function(){return la(this.anchor,this.head)},Dh.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},Qe.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;c<d;++c){var e=this.lines[c];this.height-=e.height,gb(e),ub(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;d<b.length;++d)b[d].parent=this},iterN:function(a,b,c){for(var d=a+b;a<d;++a)if(c(this.lines[a]))return!0}},Re.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(a<e){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Qe))){var h=[];this.collapse(h),this.children=[new Qe(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<=f){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(var g=e.lines.length%25+25,h=g;h<e.lines.length;){var i=new Qe(e.lines.slice(h,h+=25));e.height-=i.height,this.children.splice(++d,0,i),i.parent=this}e.lines=e.lines.slice(0,g),this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new Re(b);if(a.parent){a.size-=c.size,a.height-=c.height;var d=m(a.parent.children,a);a.parent.children.splice(d+1,0,c)}else{var e=new Re(a.children);e.parent=a,a.children=[e,c],a=e}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<f){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var Eh=function(a,b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.doc=a,this.node=b};Eh.prototype.clear=function(){var a=this.doc.cm,b=this.line.widgets,c=this.line,d=da(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=Ib(this);ca(c,Math.max(0,c.height-f)),a&&(qd(a,(function(){Se(a,c,-f),Bc(a,d,"widget")})),ub(a,"lineWidgetCleared",a,this,d))}},Eh.prototype.changed=function(){var a=this,b=this.height,c=this.doc.cm,d=this.line;this.height=null;var e=Ib(this)-b;e&&(ab(this.doc,d)||ca(d,d.height+e),c&&qd(c,(function(){c.curOp.forceUpdate=!0,Se(c,d,e),ub(c,"lineWidgetChanged",c,a,da(d))})))},J(Eh);var Fh=0,Gh=function(a,b){this.lines=[],this.type=b,this.doc=a,this.id=++Fh};Gh.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&id(a),I(this,"clear")){var c=this.find();c&&ub(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;f<this.lines.length;++f){var g=this.lines[f],h=Fa(g.markedSpans,this);a&&!this.collapsed?Bc(a,da(g),"text"):a&&(null!=h.to&&(e=da(g)),null!=h.from&&(d=da(g))),g.markedSpans=Ga(g.markedSpans,h),null==h.from&&this.collapsed&&!ab(this.doc,g)&&a&&ca(g,sc(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(var i=0;i<this.lines.length;++i){var j=Xa(this.lines[i]),k=db(j);k>a.display.maxLineLength&&(a.display.maxLine=j,a.display.maxLineLength=k,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&Ac(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ye(a.doc)),a&&ub(a,"markerCleared",a,this,d,e),b&&jd(a),this.parent&&this.parent.clear()}},Gh.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=Fa(f.markedSpans,this);if(null!=g.from&&(c=ha(b?f:da(f),g.from),-1==a))return c;if(null!=g.to&&(d=ha(b?f:da(f),g.to),1==a))return d}return c&&{from:c,to:d}},Gh.prototype.changed=function(){var a=this,b=this.find(-1,!0),c=this,d=this.doc.cm;b&&d&&qd(d,(function(){var e=b.line,f=da(b.line),g=Ub(d,f);if(g&&(_b(g),d.curOp.selectionChanged=d.curOp.forceUpdate=!0),d.curOp.updateMaxLine=!0,!ab(c.doc,e)&&null!=c.height){var h=c.height;c.height=null;var i=Ib(c)-h;i&&ca(e,e.height+i)}ub(d,"markerChanged",d,a)}))},Gh.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=m(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)},Gh.prototype.detachLine=function(a){if(this.lines.splice(m(this.lines,a),1),!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;(b.maybeHiddenMarkers||(b.maybeHiddenMarkers=[])).push(this)}},J(Gh);var Hh=function(a,b){this.markers=a,this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Hh.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();ub(this,"clear")}},Hh.prototype.find=function(a,b){return this.primary.find(a,b)},J(Hh);var Ih=0,Jh=function(a,b,c,d,e){if(!(this instanceof Jh))return new Jh(a,b,c,d,e);null==c&&(c=0),Re.call(this,[new Qe([new oh("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=c;var f=ha(c,0);this.sel=Pd(f),this.history=new be(null),this.id=++Ih,this.modeOption=b,this.lineSep=d,this.direction="rtl"==e?"rtl":"ltr",this.extend=!1,"string"==typeof a&&(a=this.splitLines(a)),Yd(this,{from:f,to:f,text:a}),ve(this,Pd(f),Sg)};Jh.prototype=t(Re.prototype,{constructor:Jh,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},
remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=ba(this,this.first,this.first+this.size);return!1===a?b:b.join(a||this.lineSeparator())},setValue:td((function(a){var b=ha(this.first,0),c=this.first+this.size-1;Fe(this,{from:b,to:ha(c,_(this,c).text.length),text:this.splitLines(a),origin:"setValue",full:!0},!0),this.cm&&Zc(this.cm,0,0),ve(this,Pd(b),Sg)})),replaceRange:function(a,b,c,d){b=oa(this,b),c=c?oa(this,c):b,Le(this,a,b,c,d)},getRange:function(a,b,c){var d=aa(this,oa(this,a),oa(this,b));return!1===c?d:d.join(c||this.lineSeparator())},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},getLineHandle:function(a){if(fa(this,a))return _(this,a)},getLineNumber:function(a){return da(a)},getLineHandleVisualStart:function(a){return"number"==typeof a&&(a=_(this,a)),Xa(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return oa(this,a)},getCursor:function(a){var b=this.sel.primary();return null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||"to"==a||!1===a?b.to():b.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:td((function(a,b,c){se(this,oa(this,"number"==typeof a?ha(a,b||0):a),null,c)})),setSelection:td((function(a,b,c){se(this,oa(this,a),oa(this,b||a),c)})),extendSelection:td((function(a,b,c){pe(this,oa(this,a),b&&oa(this,b),c)})),extendSelections:td((function(a,b){qe(this,qa(this,a),b)})),extendSelectionsBy:td((function(a,b){qe(this,qa(this,q(this.sel.ranges,a)),b)})),setSelections:td((function(a,b,c){if(a.length){for(var d=[],e=0;e<a.length;e++)d[e]=new Dh(oa(this,a[e].anchor),oa(this,a[e].head||a[e].anchor));null==b&&(b=Math.min(a.length-1,this.sel.primIndex)),ve(this,Od(this.cm,d,b),c)}})),addSelection:td((function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new Dh(oa(this,a),oa(this,b||a))),ve(this,Od(this.cm,d,d.length-1),c)})),getSelection:function(a){for(var b,c=this.sel.ranges,d=0;d<c.length;d++){var e=aa(this,c[d].from(),c[d].to());b=b?b.concat(e):e}return!1===a?b:b.join(a||this.lineSeparator())},getSelections:function(a){for(var b=[],c=this.sel.ranges,d=0;d<c.length;d++){var e=aa(this,c[d].from(),c[d].to());!1!==a&&(e=e.join(a||this.lineSeparator())),b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||"+input")},replaceSelections:td((function(a,b,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:this.splitLines(a[f]),origin:c}}for(var h=b&&"end"!=b&&Ud(this,d,b),i=d.length-1;i>=0;i--)Fe(this,d[i]);h?ue(this,h):this.cm&&Yc(this.cm)})),undo:td((function(){He(this,"undo")})),redo:td((function(){He(this,"redo")})),undoSelection:td((function(){He(this,"undo",!0)})),redoSelection:td((function(){He(this,"redo",!0)})),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(var e=0;e<a.undone.length;e++)a.undone[e].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){var a=this;this.history=new be(this.history),Zd(this,(function(b){return b.history=a.history}),!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(a){return a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},getHistory:function(){return{done:ne(this.history.done),undone:ne(this.history.undone)}},setHistory:function(a){var b=this.history=new be(this.history);b.done=ne(a.done.slice(0),null,!0),b.undone=ne(a.undone.slice(0),null,!0)},setGutterMarker:td((function(a,b,c){return Pe(this,a,"gutter",(function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&w(d)&&(a.gutterMarkers=null),!0}))})),clearGutter:td((function(a){var b=this;this.iter((function(c){c.gutterMarkers&&c.gutterMarkers[a]&&Pe(b,c,"gutter",(function(){return c.gutterMarkers[a]=null,w(c.gutterMarkers)&&(c.gutterMarkers=null),!0}))}))})),lineInfo:function(a){var b;if("number"==typeof a){if(!fa(this,a))return null;if(b=a,!(a=_(this,a)))return null}else if(null==(b=da(a)))return null;return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},addLineClass:td((function(b,c,d){return Pe(this,b,"gutter"==c?"gutter":"class",(function(b){var e="text"==c?"textClass":"background"==c?"bgClass":"gutter"==c?"gutterClass":"wrapClass";if(b[e]){if(a(d).test(b[e]))return!1;b[e]+=" "+d}else b[e]=d;return!0}))})),removeLineClass:td((function(b,c,d){return Pe(this,b,"gutter"==c?"gutter":"class",(function(b){var e="text"==c?"textClass":"background"==c?"bgClass":"gutter"==c?"gutterClass":"wrapClass",f=b[e];if(!f)return!1;if(null==d)b[e]=null;else{var g=f.match(a(d));if(!g)return!1;var h=g.index+g[0].length;b[e]=f.slice(0,g.index)+(g.index&&h!=f.length?" ":"")+f.slice(h)||null}return!0}))})),addLineWidget:td((function(a,b,c){return Te(this,a,b,c)})),removeLineWidget:function(a){a.clear()},markText:function(a,b,c){return Ue(this,oa(this,a),oa(this,b),c,c&&c.type||"range")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared,handleMouseEvents:b&&b.handleMouseEvents};return a=oa(this,a),Ue(this,a,a,c,"bookmark")},findMarksAt:function(a){a=oa(this,a);var b=[],c=_(this,a.line).markedSpans;if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=oa(this,a),b=oa(this,b);var d=[],e=a.line;return this.iter(a.line,b.line+1,(function(f){var g=f.markedSpans;if(g)for(var h=0;h<g.length;h++){var i=g[h];null!=i.to&&e==a.line&&a.ch>=i.to||null==i.from&&e!=a.line||null!=i.from&&e==b.line&&i.from>=b.ch||c&&!c(i.marker)||d.push(i.marker.parent||i.marker)}++e})),d},getAllMarks:function(){var a=[];return this.iter((function(b){var c=b.markedSpans;if(c)for(var d=0;d<c.length;++d)null!=c[d].from&&a.push(c[d].marker)})),a},posFromIndex:function(a){var b,c=this.first,d=this.lineSeparator().length;return this.iter((function(e){var f=e.text.length+d;if(f>a)return b=a,!0;a-=f,++c})),oa(this,ha(c,b))},indexFromPos:function(a){a=oa(this,a);var b=a.ch;if(a.line<this.first||a.ch<0)return 0;var c=this.lineSeparator().length;return this.iter(this.first,a.line,(function(a){b+=a.text.length+c})),b},copy:function(a){var b=new Jh(ba(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return b.scrollTop=this.scrollTop,b.scrollLeft=this.scrollLeft,b.sel=this.sel,b.extend=!1,a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory())),b},linkedDoc:function(a){a||(a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from),null!=a.to&&a.to<c&&(c=a.to);var d=new Jh(ba(this,b,c),a.mode||this.modeOption,b,this.lineSep,this.direction);return a.sharedHist&&(d.history=this.history),(this.linked||(this.linked=[])).push({doc:d,sharedHist:a.sharedHist}),d.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}],Xe(d,We(this)),d},unlinkDoc:function(a){if(a instanceof Vf&&(a=a.doc),this.linked)for(var b=0;b<this.linked.length;++b){var c=this.linked[b];if(c.doc==a){this.linked.splice(b,1),a.unlinkDoc(this),Ye(We(this));break}}if(a.history==this.history){var d=[a.id];Zd(a,(function(a){return d.push(a.id)}),!0),a.history=new be(null),a.history.done=ne(this.history.done,d),a.history.undone=ne(this.history.undone,d)}},iterLinkedDocs:function(a){Zd(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(a){return this.lineSep?a.split(this.lineSep):bh(a)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:td((function(a){"rtl"!=a&&(a="ltr"),a!=this.direction&&(this.direction=a,this.iter((function(a){return a.order=null})),this.cm&&ae(this.cm))}))}),Jh.prototype.eachLine=Jh.prototype.iter;for(var Kh=0,Lh=!1,Mh={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},Nh=0;Nh<10;Nh++)Mh[Nh+48]=Mh[Nh+96]=String(Nh);for(var Oh=65;Oh<=90;Oh++)Mh[Oh]=String.fromCharCode(Oh);for(var Ph=1;Ph<=12;Ph++)Mh[Ph+111]=Mh[Ph+63235]="F"+Ph;var Qh={};Qh.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Qh.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Qh.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Qh.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Qh.default=Eg?Qh.macDefault:Qh.pcDefault;var Rh={selectAll:De,singleSelection:function(a){return a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Sg)},killLine:function(a){return nf(a,(function(b){if(b.empty()){var c=_(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:ha(b.head.line+1,0)}:{from:b.head,to:ha(b.head.line,c)}}return{from:b.from(),to:b.to()}}))},deleteLine:function(a){return nf(a,(function(b){return{from:ha(b.from().line,0),to:oa(a.doc,ha(b.to().line+1,0))}}))},delLineLeft:function(a){return nf(a,(function(a){return{from:ha(a.from().line,0),to:a.from()}}))},delWrappedLineLeft:function(a){return nf(a,(function(b){var c=a.charCoords(b.head,"div").top+5;return{from:a.coordsChar({left:0,top:c},"div"),to:b.from()}}))},delWrappedLineRight:function(a){return nf(a,(function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div");return{from:b.from(),to:d}}))},undo:function(a){return a.undo()},redo:function(a){return a.redo()},undoSelection:function(a){return a.undoSelection()},redoSelection:function(a){return a.redoSelection()},goDocStart:function(a){return a.extendSelection(ha(a.firstLine(),0))},goDocEnd:function(a){return a.extendSelection(ha(a.lastLine()))},goLineStart:function(a){return a.extendSelectionsBy((function(b){return sf(a,b.head.line)}),{origin:"+move",bias:1})},goLineStartSmart:function(a){return a.extendSelectionsBy((function(b){return uf(a,b.head)}),{origin:"+move",bias:1})},goLineEnd:function(a){return a.extendSelectionsBy((function(b){return tf(a,b.head.line)}),{origin:"+move",bias:-1})},goLineRight:function(a){return a.extendSelectionsBy((function(b){var c=a.cursorCoords(b.head,"div").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div")}),Ug)},goLineLeft:function(a){return a.extendSelectionsBy((function(b){var c=a.cursorCoords(b.head,"div").top+5;return a.coordsChar({left:0,top:c},"div")}),Ug)},goLineLeftSmart:function(a){return a.extendSelectionsBy((function(b){var c=a.cursorCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return d.ch<a.getLine(d.line).search(/\S/)?uf(a,b.head):d}),Ug)},goLineUp:function(a){return a.moveV(-1,"line")},goLineDown:function(a){return a.moveV(1,"line")},goPageUp:function(a){return a.moveV(-1,"page")},goPageDown:function(a){return a.moveV(1,"page")},goCharLeft:function(a){return a.moveH(-1,"char")},goCharRight:function(a){return a.moveH(1,"char")},goColumnLeft:function(a){return a.moveH(-1,"column")},goColumnRight:function(a){return a.moveH(1,"column")},goWordLeft:function(a){return a.moveH(-1,"word")},goGroupRight:function(a){return a.moveH(1,"group")},goGroupLeft:function(a){return a.moveH(-1,"group")},goWordRight:function(a){return a.moveH(1,"word")},delCharBefore:function(a){return a.deleteH(-1,"codepoint")},delCharAfter:function(a){return a.deleteH(1,"char")},delWordBefore:function(a){return a.deleteH(-1,"word")},delWordAfter:function(a){return a.deleteH(1,"word")},delGroupBefore:function(a){return a.deleteH(-1,"group")},delGroupAfter:function(a){return a.deleteH(1,"group")},indentAuto:function(a){return a.indentSelection("smart")},indentMore:function(a){return a.indentSelection("add")},indentLess:function(a){return a.indentSelection("subtract")},insertTab:function(a){return a.replaceSelection("\t")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),g=l(a.getLine(f.line),f.ch,d);b.push(o(d-g%d))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.execCommand("insertTab")},transposeChars:function(a){return qd(a,(function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++)if(b[d].empty()){var e=b[d].head,f=_(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new ha(e.line,e.ch-1)),e.ch>0)e=new ha(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),ha(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=_(a.doc,e.line-1).text;g&&(e=new ha(e.line,1),a.replaceRange(f.charAt(0)+a.doc.lineSeparator()+g.charAt(g.length-1),ha(e.line-1,g.length-1),e,"+transpose"))}c.push(new Dh(e,e))}a.setSelections(c)}))},newlineAndIndent:function(a){return qd(a,(function(){for(var b=a.listSelections(),c=b.length-1;c>=0;c--)a.replaceRange(a.doc.lineSeparator(),b[c].anchor,b[c].head,"+input");b=a.listSelections();for(var d=0;d<b.length;d++)a.indentLine(b[d].from().line,null,!0);Yc(a)}))},openLine:function(a){return a.replaceSelection("\n","start")},toggleOverwrite:function(a){return a.toggleOverwrite()}},Sh=new Ng,Th=null,Uh=function(a,b,c){this.time=a,this.pos=b,this.button=c};Uh.prototype.compare=function(a,b,c){return this.time+400>a&&0==ia(b,this.pos)&&c==this.button};var Vh,Wh,Xh={toString:function(){return"CodeMirror.Init"}},Yh={},Zh={};Vf.defaults=Yh,Vf.optionHandlers=Zh;var $h=[];Vf.defineInitHook=function(a){return $h.push(a)};var _h=null,ai=function(a){this.cm=a,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new Ng,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};ai.prototype.init=function(a){function b(a){for(var b=a.target;b;b=b.parentNode){if(b==g)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(b.className))break}return!1}function c(a){if(b(a)&&!G(f,a)){if(f.somethingSelected())Yf({lineWise:!1,text:f.getSelections()}),"cut"==a.type&&f.replaceSelection("",null,"cut");else{if(!f.options.lineWiseCopyCut)return;var c=ag(f);Yf({lineWise:!0,text:c.text}),"cut"==a.type&&f.operation((function(){f.setSelections(c.ranges,0,Sg),f.replaceSelection("",null,"cut")}))}if(a.clipboardData){a.clipboardData.clearData();var d=_h.text.join("\n");if(a.clipboardData.setData("Text",d),a.clipboardData.getData("Text")==d)return void a.preventDefault()}var h=cg(),i=h.firstChild;f.display.lineSpace.insertBefore(h,f.display.lineSpace.firstChild),i.value=_h.text.join("\n");var j=document.activeElement;Mg(i),setTimeout((function(){f.display.lineSpace.removeChild(h),j.focus(),j==g&&e.showPrimarySelection()}),50)}}var d=this,e=this,f=e.cm,g=e.div=a.lineDiv;g.contentEditable=!0,bg(g,f.options.spellcheck,f.options.autocorrect,f.options.autocapitalize),_g(g,"paste",(function(a){!b(a)||G(f,a)||$f(a,f)||tg<=11&&setTimeout(rd(f,(function(){return d.updateFromDOM()})),20)})),_g(g,"compositionstart",(function(a){d.composing={data:a.data,done:!1}})),_g(g,"compositionupdate",(function(a){d.composing||(d.composing={data:a.data,done:!1})})),_g(g,"compositionend",(function(a){d.composing&&(a.data!=d.composing.data&&d.readFromDOMSoon(),d.composing.done=!0)})),_g(g,"touchstart",(function(){return e.forceCompositionEnd()})),_g(g,"input",(function(){d.composing||d.readFromDOMSoon()})),_g(g,"copy",c),_g(g,"cut",c)},ai.prototype.screenReaderLabelChanged=function(a){a?this.div.setAttribute("aria-label",a):this.div.removeAttribute("aria-label")},ai.prototype.prepareSelection=function(){var a=Hc(this.cm,!1);return a.focus=document.activeElement==this.div,a},ai.prototype.showSelection=function(a,b){a&&this.cm.display.view.length&&((a.focus||b)&&this.showPrimarySelection(),this.showMultipleSelections(a))},ai.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},ai.prototype.showPrimarySelection=function(){var a=this.getSelection(),b=this.cm,c=b.doc.sel.primary(),d=c.from(),e=c.to();if(b.display.viewTo==b.display.viewFrom||d.line>=b.display.viewTo||e.line<b.display.viewFrom)return void a.removeAllRanges();var f=jg(b,a.anchorNode,a.anchorOffset),g=jg(b,a.focusNode,a.focusOffset);if(!f||f.bad||!g||g.bad||0!=ia(ma(f,g),d)||0!=ia(la(f,g),e)){var h=b.display.view,i=d.line>=b.display.viewFrom&&fg(b,d)||{node:h[0].measure.map[2],offset:0},j=e.line<b.display.viewTo&&fg(b,e);if(!j){var k=h[h.length-1].measure,l=k.maps?k.maps[k.maps.length-1]:k.map;j={node:l[l.length-1],offset:l[l.length-2]-l[l.length-3]}}if(!i||!j)return void a.removeAllRanges();var m,n=a.rangeCount&&a.getRangeAt(0);try{m=Ig(i.node,i.offset,j.offset,j.node)}catch(a){}m&&(!og&&b.state.focused?(a.collapse(i.node,i.offset),m.collapsed||(a.removeAllRanges(),a.addRange(m))):(a.removeAllRanges(),a.addRange(m)),n&&null==a.anchorNode?a.addRange(n):og&&this.startGracePeriod()),this.rememberSelection()}},ai.prototype.startGracePeriod=function(){var a=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout((function(){a.gracePeriod=!1,a.selectionChanged()&&a.cm.operation((function(){return a.cm.curOp.selectionChanged=!0}))}),20)},ai.prototype.showMultipleSelections=function(a){c(this.cm.display.cursorDiv,a.cursors),c(this.cm.display.selectionDiv,a.selection)},ai.prototype.rememberSelection=function(){var a=this.getSelection();this.lastAnchorNode=a.anchorNode,this.lastAnchorOffset=a.anchorOffset,this.lastFocusNode=a.focusNode,this.lastFocusOffset=a.focusOffset},ai.prototype.selectionInEditor=function(){var a=this.getSelection();if(!a.rangeCount)return!1;var b=a.getRangeAt(0).commonAncestorContainer;return f(this.div,b)},ai.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},ai.prototype.blur=function(){this.div.blur()},ai.prototype.getField=function(){return this.div},ai.prototype.supportsTouch=function(){return!0},ai.prototype.receivedFocus=function(){function a(){b.cm.state.focused&&(b.pollSelection(),b.polling.set(b.cm.options.pollInterval,a))}var b=this;this.selectionInEditor()?this.pollSelection():qd(this.cm,(function(){return b.cm.curOp.selectionChanged=!0})),this.polling.set(this.cm.options.pollInterval,a)},ai.prototype.selectionChanged=function(){var a=this.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},ai.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var a=this.getSelection(),b=this.cm;if(Cg&&wg&&this.cm.display.gutterSpecs.length&&gg(a.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var c=jg(b,a.anchorNode,a.anchorOffset),d=jg(b,a.focusNode,a.focusOffset);c&&d&&qd(b,(function(){ve(b.doc,Pd(c,d),Sg),(c.bad||d.bad)&&(b.curOp.selectionChanged=!0)}))}}},ai.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),e=c.to();if(0==d.ch&&d.line>a.firstLine()&&(d=ha(d.line-1,_(a.doc,d.line-1).length)),e.ch==_(a.doc,e.line).text.length&&e.line<a.lastLine()&&(e=ha(e.line+1,0)),d.line<b.viewFrom||e.line>b.viewTo-1)return!1;var f,g,h;d.line==b.viewFrom||0==(f=zc(a,d.line))?(g=da(b.view[0].line),h=b.view[0].node):(g=da(b.view[f].line),h=b.view[f-1].node.nextSibling);var i,j,k=zc(a,e.line);if(k==b.view.length-1?(i=b.viewTo-1,j=b.lineDiv.lastChild):(i=da(b.view[k+1].line)-1,j=b.view[k+1].node.previousSibling),!h)return!1;for(var l=a.doc.splitLines(ig(a,h,j,g,i)),m=aa(a.doc,ha(g,0),ha(i,_(a.doc,i).text.length));l.length>1&&m.length>1;)if(p(l)==p(m))l.pop(),m.pop(),i--;else{if(l[0]!=m[0])break;l.shift(),m.shift(),g++}for(var n=0,o=0,q=l[0],r=m[0],s=Math.min(q.length,r.length);n<s&&q.charCodeAt(n)==r.charCodeAt(n);)++n;for(var t=p(l),u=p(m),v=Math.min(t.length-(1==l.length?n:0),u.length-(1==m.length?n:0));o<v&&t.charCodeAt(t.length-o-1)==u.charCodeAt(u.length-o-1);)++o;if(1==l.length&&1==m.length&&g==d.line)for(;n&&n>d.ch&&t.charCodeAt(t.length-o-1)==u.charCodeAt(u.length-o-1);)n--,o++;l[l.length-1]=t.slice(0,t.length-o).replace(/^\u200b+/,""),l[0]=l[0].slice(n).replace(/\u200b+$/,"");var w=ha(g,n),x=ha(i,m.length?p(m).length-o:0);return l.length>1||l[0]||ia(w,x)?(Le(a.doc,l,w,x,"+input"),!0):void 0},ai.prototype.ensurePolled=function(){this.forceCompositionEnd()},ai.prototype.reset=function(){this.forceCompositionEnd()},ai.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},ai.prototype.readFromDOMSoon=function(){var a=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout((function(){if(a.readDOMTimeout=null,a.composing){if(!a.composing.done)return;a.composing=null}a.updateFromDOM()}),80))},ai.prototype.updateFromDOM=function(){var a=this;!this.cm.isReadOnly()&&this.pollContent()||qd(this.cm,(function(){return Ac(a.cm)}))},ai.prototype.setUneditable=function(a){a.contentEditable="false"},ai.prototype.onKeyPress=function(a){0==a.charCode||this.composing||(a.preventDefault(),this.cm.isReadOnly()||rd(this.cm,Zf)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0))},ai.prototype.readOnlyChanged=function(a){this.div.contentEditable=String("nocursor"!=a)},ai.prototype.onContextMenu=function(){},ai.prototype.resetPosition=function(){},ai.prototype.needsContentAttribute=!0;var bi=function(a){this.cm=a,this.prevInput="",this.pollingFast=!1,this.polling=new Ng,this.hasSelection=!1,this.composing=null};bi.prototype.init=function(a){function b(a){if(!G(e,a)){if(e.somethingSelected())Yf({lineWise:!1,text:e.getSelections()});else{if(!e.options.lineWiseCopyCut)return;var b=ag(e);Yf({lineWise:!0,text:b.text}),"cut"==a.type?e.setSelections(b.ranges,null,Sg):(d.prevInput="",f.value=b.text.join("\n"),Mg(f))}"cut"==a.type&&(e.state.cutIncoming=+new Date)}}var c=this,d=this,e=this.cm;this.createField(a);var f=this.textarea;a.wrapper.insertBefore(this.wrapper,a.wrapper.firstChild),Bg&&(f.style.width="0px"),_g(f,"input",(function(){sg&&tg>=9&&c.hasSelection&&(c.hasSelection=null),d.poll()})),_g(f,"paste",(function(a){G(e,a)||$f(a,e)||(e.state.pasteIncoming=+new Date,d.fastPoll())})),_g(f,"cut",b),_g(f,"copy",b),_g(a.scroller,"paste",(function(b){if(!Jb(a,b)&&!G(e,b)){if(!f.dispatchEvent)return e.state.pasteIncoming=+new Date,void d.focus();var c=new Event("paste");c.clipboardData=b.clipboardData,f.dispatchEvent(c)}})),_g(a.lineSpace,"selectstart",(function(b){Jb(a,b)||K(b)})),_g(f,"compositionstart",(function(){var a=e.getCursor("from");d.composing&&d.composing.range.clear(),d.composing={start:a,range:e.markText(a,e.getCursor("to"),{className:"CodeMirror-composing"})}})),_g(f,"compositionend",(function(){d.composing&&(d.poll(),d.composing.range.clear(),d.composing=null)}))},bi.prototype.createField=function(a){this.wrapper=cg(),this.textarea=this.wrapper.firstChild},bi.prototype.screenReaderLabelChanged=function(a){a?this.textarea.setAttribute("aria-label",a):this.textarea.removeAttribute("aria-label")},bi.prototype.prepareSelection=function(){var a=this.cm,b=a.display,c=a.doc,d=Hc(a);if(a.options.moveInputWithCursor){var e=ic(a,c.sel.primary().head,"div"),f=b.wrapper.getBoundingClientRect(),g=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,e.top+g.top-f.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,e.left+g.left-f.left))}return d},bi.prototype.showSelection=function(a){var b=this.cm,d=b.display;c(d.cursorDiv,a.cursors),c(d.selectionDiv,a.selection),null!=a.teTop&&(this.wrapper.style.top=a.teTop+"px",this.wrapper.style.left=a.teLeft+"px")},bi.prototype.reset=function(a){if(!this.contextMenuPending&&!this.composing){var b=this.cm;if(b.somethingSelected()){this.prevInput="";var c=b.getSelection();this.textarea.value=c,b.state.focused&&Mg(this.textarea),sg&&tg>=9&&(this.hasSelection=c)}else a||(this.prevInput=this.textarea.value="",sg&&tg>=9&&(this.hasSelection=null))}},bi.prototype.getField=function(){return this.textarea},bi.prototype.supportsTouch=function(){return!1},bi.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!Dg||g()!=this.textarea))try{this.textarea.focus()}catch(a){}},bi.prototype.blur=function(){this.textarea.blur()},bi.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},bi.prototype.receivedFocus=function(){this.slowPoll()},bi.prototype.slowPoll=function(){var a=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,(function(){a.poll(),a.cm.state.focused&&a.slowPoll()}))},bi.prototype.fastPoll=function(){function a(){c.poll()||b?(c.pollingFast=!1,c.slowPoll()):(b=!0,c.polling.set(60,a))}var b=!1,c=this;c.pollingFast=!0,c.polling.set(20,a)},bi.prototype.poll=function(){var a=this,b=this.cm,c=this.textarea,d=this.prevInput;if(this.contextMenuPending||!b.state.focused||ch(c)&&!d&&!this.composing||b.isReadOnly()||b.options.disableInput||b.state.keySeq)return!1;var e=c.value;if(e==d&&!b.somethingSelected())return!1;if(sg&&tg>=9&&this.hasSelection===e||Eg&&/[\uf700-\uf7ff]/.test(e))return b.display.input.reset(),!1;if(b.doc.sel==b.display.selForContextMenu){var f=e.charCodeAt(0);if(8203!=f||d||(d="​"),8666==f)return this.reset(),this.cm.execCommand("undo")}for(var g=0,h=Math.min(d.length,e.length);g<h&&d.charCodeAt(g)==e.charCodeAt(g);)++g;return qd(b,(function(){Zf(b,e.slice(g),d.length-g,null,a.composing?"*compose":null),e.length>1e3||e.indexOf("\n")>-1?c.value=a.prevInput="":a.prevInput=e,a.composing&&(a.composing.range.clear(),a.composing.range=b.markText(a.composing.start,b.getCursor("to"),{className:"CodeMirror-composing"}))})),!0},bi.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},bi.prototype.onKeyPress=function(){sg&&tg>=9&&(this.hasSelection=null),this.fastPoll()},bi.prototype.onContextMenu=function(a){function b(){if(null!=g.selectionStart){var a=e.somethingSelected(),b="​"+(a?g.value:"");g.value="⇚",g.value=b,d.prevInput=a?"":"​",g.selectionStart=1,g.selectionEnd=b.length,f.selForContextMenu=e.doc.sel}}function c(){if(d.contextMenuPending==c&&(d.contextMenuPending=!1,d.wrapper.style.cssText=k,g.style.cssText=j,sg&&tg<9&&f.scrollbars.setScrollTop(f.scroller.scrollTop=i),null!=g.selectionStart)){(!sg||sg&&tg<9)&&b();var a=0,h=function(){f.selForContextMenu==e.doc.sel&&0==g.selectionStart&&g.selectionEnd>0&&"​"==d.prevInput?rd(e,De)(e):a++<10?f.detectingSelectAll=setTimeout(h,500):(f.selForContextMenu=null,f.input.reset())};f.detectingSelectAll=setTimeout(h,200)}}var d=this,e=d.cm,f=e.display,g=d.textarea;d.contextMenuPending&&d.contextMenuPending();var h=yc(e,a),i=f.scroller.scrollTop;if(h&&!xg){e.options.resetSelectionOnContextMenu&&-1==e.doc.sel.contains(h)&&rd(e,ve)(e.doc,Pd(h),Sg);var j=g.style.cssText,k=d.wrapper.style.cssText,l=d.wrapper.offsetParent.getBoundingClientRect();d.wrapper.style.cssText="position: static",g.style.cssText="position: absolute; width: 30px; height: 30px;\n      top: "+(a.clientY-l.top-5)+"px; left: "+(a.clientX-l.left-5)+"px;\n      z-index: 1000; background: "+(sg?"rgba(255, 255, 255, .05)":"transparent")+";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";var m;if(ug&&(m=window.scrollY),f.input.focus(),ug&&window.scrollTo(null,m),f.input.reset(),e.somethingSelected()||(g.value=d.prevInput=" "),d.contextMenuPending=c,f.selForContextMenu=e.doc.sel,clearTimeout(f.detectingSelectAll),sg&&tg>=9&&b(),Kg){N(a);var n=function(){E(window,"mouseup",n),setTimeout(c,20)};_g(window,"mouseup",n)}else setTimeout(c,50)}},bi.prototype.readOnlyChanged=function(a){a||this.reset(),this.textarea.disabled="nocursor"==a,this.textarea.readOnly=!!a},bi.prototype.setUneditable=function(){},bi.prototype.needsContentAttribute=!1,(function(a){function b(b,d,e,f){a.defaults[b]=d,e&&(c[b]=f?function(a,b,c){c!=Xh&&e(a,b,c)}:e)}var c=a.optionHandlers;a.defineOption=b,a.Init=Xh,b("value","",(function(a,b){return a.setValue(b)}),!0),b("mode",null,(function(a,b){a.doc.modeOption=b,Vd(a)}),!0),b("indentUnit",2,Vd,!0),b("indentWithTabs",!1),b("smartIndent",!0),b("tabSize",4,(function(a){Wd(a),bc(a),Ac(a)}),!0),b("lineSeparator",null,(function(a,b){if(a.doc.lineSep=b,b){var c=[],d=a.doc.first;a.doc.iter((function(a){for(var e=0;;){var f=a.text.indexOf(b,e);if(-1==f)break;e=f+b.length,c.push(ha(d,f))}d++}));for(var e=c.length-1;e>=0;e--)Le(a.doc,b,c[e],ha(c[e].line,c[e].ch+b.length))}})),b("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,(function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test("\t")?"":"|\t"),"g"),c!=Xh&&a.refresh()})),b("specialCharPlaceholder",jb,(function(a){return a.refresh()}),!0),b("electricChars",!0),b("inputStyle",Dg?"contenteditable":"textarea",(function(){throw new Error("inputStyle can not (yet) be changed in a running editor")}),!0),b("spellcheck",!1,(function(a,b){return a.getInputField().spellcheck=b}),!0),b("autocorrect",!1,(function(a,b){return a.getInputField().autocorrect=b}),!0),b("autocapitalize",!1,(function(a,b){return a.getInputField().autocapitalize=b}),!0),b("rtlMoveVisually",!Gg),b("wholeLineUpdateBefore",!0),b("theme","default",(function(a){Sf(a),Jd(a)}),!0),b("keyMap","default",(function(a,b,c){var d=mf(b),e=c!=Xh&&mf(c)
;e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)})),b("extraKeys",null),b("configureMouse",null),b("lineWrapping",!1,Uf,!0),b("gutters",[],(function(a,b){a.display.gutterSpecs=Hd(b,a.options.lineNumbers),Jd(a)}),!0),b("fixedGutter",!0,(function(a,b){a.display.gutters.style.left=b?vc(a.display)+"px":"0",a.refresh()}),!0),b("coverGutterNextToScrollbar",!1,(function(a){return fd(a)}),!0),b("scrollbarStyle","native",(function(a){hd(a),fd(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)}),!0),b("lineNumbers",!1,(function(a,b){a.display.gutterSpecs=Hd(a.options.gutters,b),Jd(a)}),!0),b("firstLineNumber",1,Jd,!0),b("lineNumberFormatter",(function(a){return a}),Jd,!0),b("showCursorWhenSelecting",!1,Gc,!0),b("resetSelectionOnContextMenu",!0),b("lineWiseCopyCut",!0),b("pasteLinesPerSelection",!0),b("selectionsMayTouch",!1),b("readOnly",!1,(function(a,b){"nocursor"==b&&(Pc(a),a.display.input.blur()),a.display.input.readOnlyChanged(b)})),b("screenReaderLabel",null,(function(a,b){b=""===b?null:b,a.display.input.screenReaderLabelChanged(b)})),b("disableInput",!1,(function(a,b){b||a.display.input.reset()}),!0),b("dragDrop",!0,Tf),b("allowDropFileTypes",null),b("cursorBlinkRate",530),b("cursorScrollMargin",0),b("cursorHeight",1,Gc,!0),b("singleCursorHeightPerLine",!0,Gc,!0),b("workTime",100),b("workDelay",100),b("flattenSpans",!0,Wd,!0),b("addModeClass",!1,Wd,!0),b("pollInterval",100),b("undoDepth",200,(function(a,b){return a.doc.history.undoDepth=b})),b("historyEventDelay",1250),b("viewportMargin",10,(function(a){return a.refresh()}),!0),b("maxHighlightLength",1e4,Wd,!0),b("moveInputWithCursor",!0,(function(a,b){b||a.display.input.resetPosition()})),b("tabindex",null,(function(a,b){return a.display.input.getField().tabIndex=b||""})),b("autofocus",null),b("direction","ltr",(function(a,b){return a.doc.setDirection(b)}),!0),b("phrases",null)})(Vf),(function(a){var b=a.optionHandlers,c=a.helpers={};a.prototype={constructor:a,focus:function(){window.focus(),this.display.input.focus()},setOption:function(a,c){var d=this.options,e=d[a];d[a]==c&&"mode"!=a||(d[a]=c,b.hasOwnProperty(a)&&rd(this,b[a])(this,c,e),F(this,"optionChange",this,a))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](mf(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:sd((function(b,c){var d=b.token?b:a.getMode(this.options,b);if(d.startState)throw new Error("Overlays may not be stateful.");r(this.state.overlays,{mode:d,modeSpec:b,opaque:c&&c.opaque,priority:c&&c.priority||0},(function(a){return a.priority})),this.state.modeGen++,Ac(this)})),removeOverlay:sd((function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||"string"==typeof a&&d.name==a)return b.splice(c,1),this.state.modeGen++,void Ac(this)}})),indentLine:sd((function(a,b,c){"string"!=typeof b&&"number"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),fa(this.doc,a)&&Xf(this,a,b,c)})),indentSelection:sd((function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=b[d];if(e.empty())e.head.line>c&&(Xf(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&Yc(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;i<c;++i)Xf(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&re(this.doc,d,new Dh(f,j[d].to()),Sg)}}})),getTokenAt:function(a,b){return xa(this,a,b)},getLineTokens:function(a,b){return xa(this,ha(a),b,!0)},getTokenTypeAt:function(a){a=oa(this.doc,a);var b,c=sa(this,_(this.doc,a.line)),d=0,e=(c.length-1)/2,f=a.ch;if(0==f)b=c[2];else for(;;){var g=d+e>>1;if((g?c[2*g-1]:0)>=f)e=g;else{if(!(c[2*g+1]<f)){b=c[2*g+2];break}d=g+1}}var h=b?b.indexOf("overlay "):-1;return h<0?b:0==h?null:b.slice(0,h-1)},getModeAt:function(b){var c=this.doc.mode;return c.innerMode?a.innerMode(c,this.getTokenAt(b).state).mode:c},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var d=[];if(!c.hasOwnProperty(b))return d;var e=c[b],f=this.getModeAt(a);if("string"==typeof f[b])e[f[b]]&&d.push(e[f[b]]);else if(f[b])for(var g=0;g<f[b].length;g++){var h=e[f[b][g]];h&&d.push(h)}else f.helperType&&e[f.helperType]?d.push(e[f.helperType]):e[f.name]&&d.push(e[f.name]);for(var i=0;i<e._global.length;i++){var j=e._global[i];j.pred(f,this)&&-1==m(d,j.val)&&d.push(j.val)}return d},getStateAfter:function(a,b){var c=this.doc;return a=na(c,null==a?c.first+c.size-1:a),ta(this,a+1,b).state},cursorCoords:function(a,b){var c,d=this.doc.sel.primary();return c=null==a?d.head:"object"==typeof a?oa(this.doc,a):a?d.from():d.to(),ic(this,c,b||"page")},charCoords:function(a,b){return hc(this,oa(this.doc,a),b||"page")},coordsChar:function(a,b){return a=gc(this,a,b||"page"),lc(this,a.left,a.top)},lineAtHeight:function(a,b){return a=gc(this,{top:a,left:0},b||"page").top,ea(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b,c){var d,e=!1;if("number"==typeof a){var f=this.doc.first+this.doc.size-1;a<this.doc.first?a=this.doc.first:a>f&&(a=f,e=!0),d=_(this.doc,a)}else d=a;return fc(this,d,{top:0,left:0},b||"page",c||e).top+(e?this.doc.height-cb(d):0)},defaultTextHeight:function(){return sc(this.display)},defaultCharWidth:function(){return tc(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=ic(this,oa(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(b),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&Vc(this,{left:h,top:g,right:h+b.offsetWidth,bottom:g+b.offsetHeight})},triggerOnKeyDown:sd(Bf),triggerOnKeyPress:sd(Ef),triggerOnKeyUp:Df,triggerOnMouseDown:sd(Gf),execCommand:function(a){if(Rh.hasOwnProperty(a))return Rh[a].call(null,this)},triggerElectric:sd((function(a){_f(this,a)})),findPosH:function(a,b,c,d){var e=1;b<0&&(e=-1,b=-b);for(var f=oa(this.doc,a),g=0;g<b&&(f=dg(this.doc,f,e,c,d),!f.hitSide);++g);return f},moveH:sd((function(a,b){var c=this;this.extendSelectionsBy((function(d){return c.display.shift||c.doc.extend||d.empty()?dg(c.doc,d.head,a,b,c.options.rtlMoveVisually):a<0?d.from():d.to()}),Ug)})),deleteH:sd((function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):nf(this,(function(c){var e=dg(d,c.head,a,b,!1);return a<0?{from:e,to:c.head}:{from:c.head,to:e}}))})),findPosV:function(a,b,c,d){var e=1,f=d;b<0&&(e=-1,b=-b);for(var g=oa(this.doc,a),h=0;h<b;++h){var i=ic(this,g,"div");if(null==f?f=i.left:i.left=f,g=eg(this,i,e,c),g.hitSide)break}return g},moveV:sd((function(a,b){var c=this,d=this.doc,e=[],f=!this.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy((function(g){if(f)return a<0?g.from():g.to();var h=ic(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=eg(c,h,a,b);return"page"==b&&g==d.sel.primary()&&Xc(c,hc(c,i,"div").top-h.top),i}),Ug),e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]})),findWordAt:function(a){var b=this.doc,c=_(b,a.line).text,d=a.ch,e=a.ch;if(c){var f=this.getHelper(a,"wordChars");"before"!=a.sticky&&e!=c.length||!d?++e:--d;for(var g=c.charAt(d),h=v(g,f)?function(a){return v(a,f)}:/\s/.test(g)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!v(a)};d>0&&h(c.charAt(d-1));)--d;for(;e<c.length&&h(c.charAt(e));)++e}return new Dh(ha(a.line,d),ha(a.line,e))},toggleOverwrite:function(a){null!=a&&a==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?h(this.display.cursorDiv,"CodeMirror-overwrite"):Lg(this.display.cursorDiv,"CodeMirror-overwrite"),F(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==g()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:sd((function(a,b){Zc(this,a,b)})),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-Nb(this)-this.display.barHeight,width:a.scrollWidth-Nb(this)-this.display.barWidth,clientHeight:Pb(this),clientWidth:Ob(this)}},scrollIntoView:sd((function(a,b){null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):"number"==typeof a?a={from:ha(a,0),to:null}:null==a.from&&(a={from:a,to:null}),a.to||(a.to=a.from),a.margin=b||0,null!=a.from.line?$c(this,a):ad(this,a.from,a.to,a.margin)})),setSize:sd((function(a,b){var c=this,d=function(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a};null!=a&&(this.display.wrapper.style.width=d(a)),null!=b&&(this.display.wrapper.style.height=d(b)),this.options.lineWrapping&&ac(this);var e=this.display.viewFrom;this.doc.iter(e,this.display.viewTo,(function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){Bc(c,e,"widget");break}++e})),this.curOp.forceUpdate=!0,F(this,"refresh",this)})),operation:function(a){return qd(this,a)},startOperation:function(){return id(this)},endOperation:function(){return jd(this)},refresh:sd((function(){var a=this.display.cachedTextHeight;Ac(this),this.curOp.forceUpdate=!0,bc(this),Zc(this,this.doc.scrollLeft,this.doc.scrollTop),Dd(this.display),(null==a||Math.abs(a-sc(this.display))>.5||this.options.lineWrapping)&&xc(this),F(this,"refresh",this)})),swapDoc:sd((function(a){var b=this.doc;return b.cm=null,this.state.selectingText&&this.state.selectingText(),$d(this,a),bc(this),this.display.input.reset(),Zc(this,a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,ub(this,"swapDoc",this,b),b})),phrase:function(a){var b=this.options.phrases;return b&&Object.prototype.hasOwnProperty.call(b,a)?b[a]:a},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},J(a),a.registerHelper=function(b,d,e){c.hasOwnProperty(b)||(c[b]=a[b]={_global:[]}),c[b][d]=e},a.registerGlobalHelper=function(b,d,e,f){a.registerHelper(b,d,f),c[b]._global.push({pred:e,val:f})}})(Vf);var ci="iter insert remove copy getEditor constructor".split(" ");for(var di in Jh.prototype)Jh.prototype.hasOwnProperty(di)&&m(ci,di)<0&&(Vf.prototype[di]=(function(a){return function(){return a.apply(this.doc,arguments)}})(Jh.prototype[di]));return J(Jh),Vf.inputStyles={textarea:bi,contenteditable:ai},Vf.defineMode=function(a){Vf.defaults.mode||"null"==a||(Vf.defaults.mode=a),T.apply(this,arguments)},Vf.defineMIME=U,Vf.defineMode("null",(function(){return{token:function(a){return a.skipToEnd()}}})),Vf.defineMIME("text/plain","null"),Vf.defineExtension=function(a,b){Vf.prototype[a]=b},Vf.defineDocExtension=function(a,b){Jh.prototype[a]=b},Vf.fromTextArea=lg,(function(a){a.off=E,a.on=_g,a.wheelEventPixels=Md,a.Doc=Jh,a.splitLines=bh,a.countColumn=l,a.findColumn=n,a.isWordChar=u,a.Pass=Rg,a.signal=F,a.Line=oh,a.changeEnd=Qd,a.scrollbarModel=xh,a.Pos=ha,a.cmpPos=ia,a.modes=fh,a.mimeModes=gh,a.resolveMode=V,a.getMode=W,a.modeExtensions=hh,a.extendMode=X,a.copyState=Y,a.startState=$,a.innerMode=Z,a.commands=Rh,a.keyMap=Qh,a.keyName=lf,a.isModifierKey=jf,a.lookupKey=hf,a.normalizeKeyMap=gf,a.StringStream=ih,a.SharedTextMarker=Hh,a.TextMarker=Gh,a.LineWidget=Eh,a.e_preventDefault=K,a.e_stopPropagation=L,a.e_stop=N,a.addClass=h,a.contains=f,a.rmClass=Lg,a.keyNames=Mh})(Vf),Vf.version="5.60.0",Vf}));lib/mailjet-api-strategy.php000060400000047635152456067760012114 0ustar00<?php

/*
 * LICENSE BLOCK
 * 
 * This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it
 * and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING for more details.
 * 
 */
 
defined('_JEXEC') or die('Restricted access');

/* Require the mailjet API libraries */
require_once (__DIR__ . '/api/mailjet-api-v1.php');
require_once (__DIR__ . '/api/mailjet-api-v3.php');
 
 /**
 * This is Api Strategy Interface
 * @author		Pavel Tashev  
 * @author		Mailjet
 * @link		http://www.mailjet.com/
 */
 
 # ============================================== Interface ============================================== #
 interface Mailjet_Api_Interface 
 {
	public function getSenders($params);
 	public function getContactLists($params);
 	public function addContact($params);
	public function removeContact($params);
	public function unsubContact($params);
	public function subContact($params);	
	public function getAuthToken($params);	
	public function validateEmail($email);
 }
 
 
 
 
 
 # ============================================== Strategy ============================================== #
 # Strategy ApiV1
 class Mailjet_Api_Strategy_V1 extends Mailjet_Api_V1 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->userSenderList()->senders;
					
		// Check if the list exists
		if(isset($response))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response as $sender)
			{
				if($sender->status == 'active')
				{
					if(substr($sender->email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->email, 2, strlen($sender->email)); // This is domain
					else						
						$senders['email'][] = $sender->email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->listsAll($input);

		// Check if the list exists
		if(isset($response->status) && $response->status == 'OK')
		{
			$lists = array();
			foreach ($response->lists as $list)
			{
				$lists[] = array(
					'value' 		=> $list->id,
					'label' 		=> $list->label,
					'subscribers'	=> $list->subscribers,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
				
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Unsubscribe the contact
		$response = $this->listsRemoveContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Unsubscribe the contact
		$response = $this->listsUnsubContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Subscribe the user
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'id'		=> $params['ListID'],
			'contact'	=> $params['Email'],
			'force'		=> 1,
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{		
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	
			
	 	if (isset($params['MailjetToken']))
		{
			$op = json_decode($params['MailjetToken']);
			if ($op->timestamp > time() - 3600)
				return $op->token;
		}

		// Get the culture
		if(isset($lang) && $lang != null)
		{
			$locale = substr($lang->getTag(), 0, 2);
			if (!in_array($locale, array('en', 'fr', 'es', 'de')))
				$locale = 'en';
		} else {
			$locale = 'en';
		}

		// Define some required data
		$url = $this->apiUrl.'/apiKeyauthenticate?output=json';
		$data = array(
			'allowed_access[0]' => 'stats',
			'allowed_access[1]' => 'contacts',
			'allowed_access[2]' => 'campaigns',
			'lang' 				=> $locale,
			'default_page'		=> 'campaigns',
			'type' 				=> 'page',
			'apikey' 			=> $params['APIKey']
		);
		
		// Execute POST request
		$curl = curl_init();
		curl_setopt_array($curl, array(
		    CURLOPT_RETURNTRANSFER => 1,
		    CURLOPT_URL => $url,
		    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
		    CURLOPT_POST => 1,
		    CURLOPT_POSTFIELDS => $data
		));
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    		"Authorization: Basic ".base64_encode($params['APIKey'] . ':' . $params['SecretKey'])
    	));
		$result = curl_exec($curl);
		$resp = json_decode($result);
		
		if (is_object($resp))
			if ($resp->status == 'OK')
				return $resp->token;
		
		return (object) array('Status' => 'ERROR'); 
	}	

	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }


 # Strategy ApiV3
 class Mailjet_Api_Strategy_V3 extends Mailjet_Api_V3 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->sender($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response->Data as $sender)
			{
				if($sender->Status == 'Active')
				{
					if(substr($sender->Email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->Email, 2, strlen($sender->Email)); // This is domain
					else						
						$senders['email'][] = $sender->Email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array(
			'akid'	=> $this->_akid
		);
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->liststatistics($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$lists = array();
			foreach ($response->Data as $list)
			{
				$lists[] = array(
					'value' 		=> $list->ID,
					'label' 		=> $list->Name,
					'subscribers'	=> $list->SubscriberCount,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$result = $this->manycontacts(array(
			'method'			=> 'POST',
			'Action'			=> 'Add',
			'Addresses'			=> array($params['Email']),
			'ListID'			=> $params['ListID'],
		));

		// Check if any error
		if(isset($result->Data['0']->Errors->Items)) {
			if( strpos($result->Data['0']->Errors->Items[0]->ErrorMessage, 'duplicate') !== FALSE )
				return (object) array('Status' => 'DUPLICATE');
			else
				return (object) array('Status' => 'ERROR');	
		}		
		
		$this->subContact($params);
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
			{
				// Remove the contact
				$response = $this->listrecipient(array(
					'akid'				=> $this->_akid,
					'method'			=> 'delete',
					'ID'				=> $contact->ID
				));
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }

		return (object) array('Status' => 'ERROR');
	}
	 
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed !== TRUE)
                {
                      $response = $this->listrecipient(array(
                            'akid'    			=> $this->_akid,
                            'method'   			=> 'PUT',
                            'ID'       			=> $contact->ID,
                            'IsUnsubscribed' 	=> 'true',
                            'UnsubscribedAt' 	=> date("Y-m-d\TH:i:s\Z", time()),
                      ));
                } 
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));		
		
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed === TRUE)
                {
	                  $response = $this->listrecipient(array(
	                        'akid'    			=> $this->_akid,
	                        'method'   			=> 'PUT',
	                        'ID'       			=> $contact->ID,
	                        'IsUnsubscribed' 	=> 'false',	                        
	                  ));
                } 
            }
			
			// Check if the subscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	

		// Get the ID of the Api Key
	 	$api_key_response = $this->apikey(array(
			'method' => 'GET',
			'APIKey' => $params['APIKey']
		));

		// Check if the response contains data
		if(!isset($api_key_response->Data[0]->ID))
			return (object) array('Status' => 'ERROR');

		// Get token
		$response = $this->apitoken(array(
			'AllowedAccess' =>  'campaigns,contacts,reports,stats,preferences,pricing,account',
			'method' 		=> 'POST',			
			'APIKeyID' 		=> $api_key_response->Data[0]->ID,
			'TokenType' 	=> 'iframe',			
			'CatchedIp'  	=> $_SERVER['REMOTE_ADDR'],
			'log_once' 		=> TRUE,
			'IsActive'		=> TRUE
		));	

	 	// Get and return the token
		if(isset($response->Data) && count($response->Data) > 0)
			return $response->Data[0]->Token;
		
		return (object) array('Status' => 'ERROR');
	}	
	
	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }
 
 
 
 
 
 # ============================================== Context ============================================== #
 class Mailjet_Api
 {
 	private $context;
	public $version; 
	public $apiUrl;
	
	public function __construct($mailjet_username, $mailjet_password)
  	{
  		# Check the type of the user and set the corresponding Context/Strategy
  		// Set API V3 context and get the user and check if it's V3   		
		$this->setContext(new Mailjet_Api_Strategy_V3($mailjet_username, $mailjet_password));
		//$response = $this->context->getContactLists(array('limit' => 1));
		$response = $this->context->getSenders(array('limit' => 1));
		if(isset($response->Status) && $response->Status == 'ERROR')
		{
			// Set API V1 context and get the contact lists of this user and check if it's V1
			$this->setContext(new Mailjet_Api_Strategy_V1($mailjet_username, $mailjet_password));	
			$response = $this->context->getSenders(array('limit' => 1));
			if(isset($response->Status) && $response->Status == 'ERROR')
			{				
				$this->clearContext();			
			} 
			else {			
				// Get the version and the apiUrl of the API
				$this->version = $this->context->version;
				$this->apiUrl = 'in.mailjet.com';
			}
		} else {
			// Get the version and the apiUrl of the API
			$this->version = $this->context->getVersion();
			$this->apiUrl = 'in-v3.mailjet.com';
		}		
	}
	
	/**
	 * Set the context of the Api - V1 or V3 
	 *
     * @param Mailjet_Api_Interface $context
     * @return void
     */
	private function setContext(Mailjet_Api_Interface $context)
    {
        $this->context = $context;
    }
	
	/**
	 * Clear the context
	 *
     * @param void
     * @return void
     */
	private function clearContext()
    {
        $this->context = FALSE;
    }
	
	
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getSenders($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getSenders($params);
	}	
	
	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getContactLists($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getContactLists($params);
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function addContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->addContact($params);
	 }
	 
	 /**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function removeContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->removeContact($params);
	 }
	 
	 /**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	  public function unsubContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->unsubContact($params);
	  }
	  
	 /**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	  public function subContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->subContact($params);
	  }
	  
	  /**
		* Get the authentication token for the iframes
		* 
		* @param (array) $param = array('APIKey', 'SecretKey', ...) 
		* @return (object)
	  */
	  public function getAuthToken($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->getAuthToken($params);
	  }	
	  
	  /**
	  * Validate if $email is real email
	  * 
	  * @param (string) $email 
	  * @return (boolean) TRUE|FALSE 
	  */
	  public function validateEmail($email) {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
		return $this->context->validateEmail($email);
	  }
 }
 lib/api/mailjet-api-v3.php000060400000067407152456067760011352 0ustar00<?php

/**
 * Mailjet Public API / The real-time Cloud Emailing platform
 *
 * Connect your Apps and Make our product yours with our powerful API
 * http://www.mailjet.com/ Mailjet SAS Website
 *
 * @package		API v0.3
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @copyright	Copyright (c) 2012-2013, Mailjet SAS, http://www.mailjet.com/Terms-of-use.htm
 * @file
 */

// ---------------------------------------------------------------------

/**
 * Mailjet Public API Main Class
 *
 * This class enables you to connect your Apps and use our powerful API.
 * You can use the 'metadata' call to retrieve a list of each object available
 * or implemented a live discovery.
 * http://www.mailjet.com/docs/api
 *
 * updated on 2013-09-03
 *
 * @class		MailjetApi
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @version		0.1
 */
class Mailjet_Api_V3
{
    /**
     * Mailjet API Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_apiKey
     */
    private $_apiKey = '';

    /**
     * Mailjet API Secret Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_secretKey
     */
    private $_secretKey = '';

    /**
     * Seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	private
     * @var		integer $_cache
     */
    private $_cache = 0;//600;

// ---------------------------------------------------------------------

    /**
     * API URL
     *
     * @access	private
     * @var		string
     */
    private $_apiUrl = 'api.mailjet.com/v3/';

    /**
     * API version to use
     *
     * @access	private
     * @var		string
     */
    private $_version = 'REST';

    /**
     * Debug internal flag
     *
     * @access	private
     * @var		boolean
     */
    private $_debug = false;

    /**
     * Debug Label
     *
     * @access	private
     * @var		string
     */
    private $_debug_info = '';

    /**
     * Debug buffer copy
     *
     * @access	private
     * @var		string
     */
    private $_buffer = '';

    /**
     * Debug method copy
     *
     * @access	private
     * @var		string
     */
    private $_method = '';

    /**
     * Debug by cURL
     *
     * @access	private
     * @var		array
     */
    private $_info = NULL;

    /**
     * cURL handle resource
     *
     * @access	private
     * @var		resource
     */
    private $_curl_handle = NULL;

    /**
     * 
     * @var Boolean
     */
    protected $_log_allowed = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log_once = false;
    
    /**
     *
     * @var Boolean
     */
    protected $_extra_err = false;
    
    /**
     * 
     * @var String
     */
    protected $_log_path = 'logs/api/current.log';
    
    /**
     * Singleton pattern : Current instance
     *
     * @access	private
     * @var		resource
     */
    private static $_instance = NULL;

    /**
     * Constructor
     *
     * Set $_apiKey and $_secretKey if provided & Update $_apiUrl with protocol
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string  $_apiKey    Mailjet API Key
     * @param string  $_secretKey Mailjet API Secret Key
     * @param boolean $secure     TRUE to secure the transaction, FALSE otherwise
     */
    public function __construct($apiKey = NULL, $secretKey = NULL, $secure = FALSE)
    {
        if (isset($apiKey))
            $this->_apiKey = $apiKey;
        if (isset($secretKey))
            $this->_secretKey = $secretKey;
        $this->_apiUrl = 'http://'.$this->_apiUrl.$this->_version.'/';
        $this->secure($secure);
        
        $this->_log_allowed = get_cfg_var('MAILJET_ENVIRONMENT') == 'dev';
        
        $this->_fixLogPath();
    }

    /**
     * Singleton pattern :
     * Get the instance of the object if it already exists
     * or create a new one.
     *
     * @access	public
     * @uses	MailjetApi::$_instance
     */
    public static function getInstance()
    {
        if (!(self::$_instance instanceof self))
            self::$_instance = new self();

        return self::$_instance;
    }

    /**
     * Destructor
     *
     * Close the cURL handle resource
     *
     * @access	public
     * @uses	MailjetApi::$_curl_handle
     */
    public function __destruct()
    {
        if(!is_null($this->_curl_handle))
            curl_close($this->_curl_handle);
        $this->_curl_handle = NULL;
    }

    /**
     * Set new Api Key and Secret Key
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string $apiKey    Mailjet API Key
     * @param string $secretKey Mailjet API Secret Key
     */
    public function setKeys($apiKey, $secretKey)
    {
        $this->_apiKey = $apiKey;
        $this->_secretKey = $secretKey;
    }

    /**
     * Set the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     * @param integer $cache Cache to set in seconds
     */
    public function setCache($cache)
    {
        $this->_cache = $cache;
    }

    /**
     * Get the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     *
     * @return integer Cache in seconds
     */
    public function getCache()
    {
        return ($this->_cache);
    }

    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLog($flag)
    {
    	$this->_log = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLog()
    {
    	return $this->_log;
    }
    
    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLogOnce($flag)
    {
    	$this->_log_once = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLogOnce()
    {
    	return $this->_log_once;
    }
    
	/**
     * 
     * @return string
     */
    public function getVersion()
    {
    	return $this->_version;
    }
	
    /**
     *
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setExtraError($flag)
    {
    	$this->_extra_err = (boolean) $flag;
    	return $this;
    }
    
    /**
     *
     * @return boolean
     */
    public function getExtraError()
    {
    	return $this->_extra_err;
    }

    /**
     * Enable log only if MAILJET_ENVIRONMENT == 'dev'
     * @return boolean
     */
    public function logAllowed()
    {
    	return $this->_log_allowed;
    }
    
    /**
     * 
     * @param String $path
     * @return mailjetapi
     */
    public function setLogPath($path)
    {
    	if ($real_path = realpath($path)) {
    		$this->_log_path = $real_path;
    	}
    	return $this;
    }
    
    /**
     * 
     * @return String
     */
    public function getLogPath()
    {
    	return $this->_log_path;
    }
    
    /**
     * 
     * @return mailjetapi
     */
    protected function _fixLogPath()
    {
    	//fix log path
		if(!defined('SYSTEMPATH')) define('SYSTEMPATH', dirname(__FILE__).'/../');
    	$this->_log_path = realpath(SYSTEMPATH.$this->_log_path);
    	$logFilename = 'daily-'.date('Ymd').'.log';
    	$this->_log_path = str_replace('current.log', $logFilename, $this->_log_path);
		return $this;
    }
    
    /**
     * Secure or not the transaction through https
     *
     * @access	public
     * @uses	MailjetApi::$_apiUrl
     * @param boolean $secure TRUE to secure the transaction, FALSE otherwise
     */
    public function secure($secure = TRUE)
    {
        $protocol = 'http';
        if ($secure)
            $protocol = 'https';
        $this->_apiUrl = preg_replace('/http(s)?:\/\//', $protocol.'://', $this->_apiUrl);
    }

    /**
     * Make the magic call ;)
     *
     * Check for some arguments and order them before sending the request.
     * If '_debug_info' is found, some data are stored and can be retrieved
     * with a call to MailjetApi::getDebugInfo().
     *
     * @access	public
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_debug_info
     * @uses	MailjetApi::sendRequest() to send the request
     * @param string $object Method to call
     * @param array  $args   Array of parameters
     *
     * @return string JSON string by default (format can be change with the 'format' parameter)
     */
    public function __call($object, $args)
    {
        if (sizeof($args) > 0)
            $params = $args[0];
        else
            $params = array();

        if (isset($params['method'])) {
            $method = strtoupper($params['method']);
            unset($params['method']);
        }
        if (!isset($method) || !in_array($method, array('GET', 'POST', 'PUT', 'DELETE', 'JSON')))
            $method = 'GET';

        if (isset($params['debug_info'])) {
            $this->_debug = TRUE;
            $this->_debug_info = $params['debug_info'];
            unset($params['debug_info']);
        }
        
        /**
         * Logging
         */
        if (isset($params['log'])) {
        	$this->setLog($params['log']);
        	unset($params['log']);
        }
        
        if (isset($params['log_once'])) {
        	$this->setLogOnce($params['log_once']);
        	unset($params['log_once']);
        }
        
        if (isset($params['log_path'])) {
        	$this->setLogPath($params['log_path']);
        	unset($params['log_path']);
        }
        
        // Extra Error
        if (isset($params['extra_err'])) {
        	$this->setExtraError($params['extra_err']);
        	unset($params['extra_err']);
        }
        
        /**
         * Fallback logging when debug is true
         */
        if ($this->_debug) {
        	$this->setLogOnce(true);
        }

        return (json_decode($this->sendRequest($object, $params, $method)));
    }

    /**
     * Send Request
     *
     * Send the request to the Mailjet API server and get back the result
     * Basically, setup and execute the curl process.
     * Cache management added
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @uses	MailjetApi::$_curl_handle
     * @uses	MailjetApi::buildURL() to build the full Url for the request and update the list of parameters accordingly
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return string the result of the request
     */
    private function sendRequest($object, $params, $method)
    {

    	// Log if this is a JSON call with an ID inside params
    	$is_json_put = (isset($params['ID']) && !empty($params['ID']));
    
        list($url, $params) = $this->buildURL($object, $params, $method);

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $file = $method.'.'.$object.'.'.hash('md5', $this->_apiKey.http_build_query($params, '', '')).'.cache';
        }

        if(is_null($this->_curl_handle))
            $this->_curl_handle = curl_init();

        curl_setopt($this->_curl_handle, CURLOPT_URL, $url);
        curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($this->_curl_handle, CURLOPT_USERPWD, $this->_apiKey.':'.$this->_secretKey);
        curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($this->_curl_handle, CURLOPT_USERAGENT, 'joomla-3.0');
    	
        switch ($method) {
            case 'GET' :
                curl_setopt($this->_curl_handle, CURLOPT_HTTPGET, TRUE);
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, NULL);
            break;

            case 'POST':
                if(isset($params['Action']) && $params['Action']=='Add'){
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, json_encode($params));
                    curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                }
                else{
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
                }
            break;

            case 'PUT':
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
            break;
            
            case 'JSON':
            	if($is_json_put)
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "PUT");            		
            	else
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
            	
            	$params = json_encode($params);
				curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $params);
				curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
				curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array(
				    'Content-Type: application/json',
				    'Content-Length: ' . strlen($params))
				);
            break;
            	
        }

        $buffer = curl_exec($this->_curl_handle);

        $this->_info = curl_getinfo($this->_curl_handle);
        $this->_response_code = $this->_info['http_code'];
        
		curl_close($this->_curl_handle);
		$this->_curl_handle = null;
        
        if ($this->_debug) {
            $this->_buffer = $buffer;
            $this->_method = $method;
            $this->_debug = FALSE;
        }

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $data = array('timestamp' => time(), 'result' => $buffer, 'http_code' => $this->_info['http_code']);
        }
        
        if( $this->getExtraError() ){
        	$this->getExtraErr( $buffer );
        	$this->setExtraError( false );
        }
        
        if ($this->logAllowed() && ($this->getLog() || $this->getLogOnce())) {

        	if ($this->_info) {
	        	$moreInfo = print_r(array(
	       			'content_type'	=> $this->_info['content_type'],
	        		'http_code'		=> $this->_info['http_code'],
	        		'total_time'	=> $this->_info['total_time'],
	        	), true);
	        	$moreInfo = substr($moreInfo, 6);
        	} else {
        		$moreInfo = 'none';
        	}
        	
        	$date = DateTime::createFromFormat('U.u', microtime(true));
        	
            if (is_array($params)) {
        		$jsonParams = json_encode($params);
        	} else {
        		$jsonParams = $params;
        	}
        	        	
        	$logLines = array();
        	
			$logLines[] = '';
        	$logLines[] = $date->format('Y-m-d H:i:s.u')." > {$object} :: {$method}";
			$logLines[] = '';
			$logLines[] = $this->_info['url'];
			$logLines[] = '';
			$logLines[] = "Request";
			$logLines[] = $jsonParams;
			$logLines[] = '';
			$logLines[] = "Response";
			$logLines[] = $buffer;
			$logLines[] = '';
			$logLines[] = 'Info';
			$logLines[] = $moreInfo;
			$logLines[] = '';
			$logLines[] = str_repeat("=", 100);
			$logLines[] = '';
				
			$logText = implode(PHP_EOL, $logLines);

			file_put_contents($this->getLogPath(), $logText, FILE_APPEND);
        	
			$this->setLogOnce(false);
			
        }
        
        return $buffer;
    }

    /**
     * Build the full Url for the request and update the parameters if needed
     *
     * @access	private
     * @uses	MailjetApi::$_apiUrl
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return array Full built Url for the request and new params
     */
    private function buildURL($object, $params, $method = 'GET')
    {
        $url = $this->_apiUrl.$object;

        if (isset($params['ID'])) {
            $url .= '/'.$params['ID'];
            unset($params['ID']);
        }

        $this->_akid = array_key_exists('akid', $params);

        if ($method == 'GET')
            $url .= '?'.http_build_query($params, '', '&');
        elseif ($method == 'PUT' || $method == 'POST' || $method == 'DELETE' || $method == 'JSON') {
            $tocheck = array('format', 'style', 'countrecords', 'recurse', 'akid', 'DuplicateFrom');
            $query = array();
            foreach ($params as $key => $value)
                if (in_array($key, $tocheck)) {
                    $query[$key] = $value;
                    unset($params[$key]);
                }
            if(count($query))
            	$url .= '?'.http_build_query($query, '', '&');
            	
        } 

        return (array($url, $params));
    }

    /**
     * Build query for cURL
     * Beware of the Boolean !
     *
     * @access	private
     * @param array $params Post parameters for the request
     *
     * @return string URL-encoded query string from the associative array provided
     */
    private function curl_build_query($params)
    {
    	foreach($params as $key => $value) {
	    	if($value === TRUE)
	    		$value = 'true';
	    	elseif($value === FALSE)
	    		$value = 'false';
    	}
        /*array_walk($params, function(&$value, &$key) {
            if ($value === TRUE) {
                $value = 'true';
            } elseif ($value === FALSE) {
                $value = 'false';
            }
        });*/

        return (http_build_query($params, '', '&'));
    }

    /**
     * Get the last HTTP code retrieved by cURL
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     *
     * @return integer last HTTP code retrieved by cURL or 0 if not set
     */
    public function getLastHTTPCode()
    {
        if (isset($this->_info['http_code']))
            return ($this->_info['http_code']);

        return (0);
    }

    /**
     * Set some info if the object came from the cache
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     */
    private function setCacheDebugInfo($method, $url, $data)
    {
        $this->_debug_info .= ' /* LAST CACHED AT '.date('Y/m/d H:i:s', $data['timestamp']).' - UPDATING EVERY '.$this->_cache.'s */';
        $this->_buffer = $data['result'];
        $this->_method = $method;
        $this->_info = array();
        $this->_info['url'] = $url;
        $this->_info['http_code'] = $data['http_code'];
        $this->_info['total_time'] = $this->_info['pretransfer_time'] = 0;
        $this->_debug = FALSE;
    }

    /**
     * Get some info for debugging purpose
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     * To update this array, you need to add the key 'debug_info'
     * to the list of parameters. You can specified a value to
     * identify the returned array.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     *
     * @return array with some debug info
     */
    public function getDebugInfo()
    {
        $status_code = array (
            200 => 'OK - Everything went fine.',
            201 => 'OK - Created : The POST request was successfully executed.',
            204 => 'OK - No Content : The Delete request was successful.',
            304 => 'OK - Not Modified : The PUT request didn’t affect any record.',
            400 => 'KO - Bad Request : Please check the parameters.',
            401 => 'KO - Unauthorized : A problem occurred with the apiKey/secretKey. You may be not authorized to access the API or your apiKey may have expired.',
            403 => 'KO - Forbidden : You are not authorized to call that function.',
            404 => 'KO - Not Found : The resource with the specified ID does not exist.',
            405 => 'KO - Method not allowed : Attempt to put/post multiple resources in 1 request.',
            500 => 'KO - Internal Server Error.',
            503 => 'KO - Service unavailable.'
        );

        if (array_key_exists($this->_info['http_code'], $status_code))
            $http_code_text = $status_code[$this->_info['http_code']];
        else
            $http_code_text = 'KO - Service unavailable.';

        $status_message = '';
        if ($this->_info['http_code'] >= 400) {
            $buffer = json_decode($this->_buffer);
            if (!is_null($buffer) && isset($buffer->StatusCode) && isset($buffer->ErrorMessage)) {
                $status_message = $buffer->StatusCode.' - '.$buffer->ErrorMessage;
                if (isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo))
                    $status_message .= ' ('.$buffer->ErrorInfo.')';
            }
        }

        $res = array(
            'debug_info'	=> $this->_debug_info,
            'method'		=> $this->_method,
            'url'			=> $this->_info['url'],
            'duration'		=> $this->_info['total_time'] - $this->_info['pretransfer_time'],
            'http_code'		=> $this->_info['http_code'],
            'http_code_text'=> $http_code_text,
            'status_message'=> $status_message,
            'curl_info'		=> $this->_info,
            'buffer'		=> $this->_buffer
        );

        return $res;
    }
    
    protected function getExtraErr( &$buffer )
    {   
    	$bufferCheck = json_decode($buffer);
    	
    	if( is_null( $bufferCheck ) )
    		return;
    	
    	$buffer = $bufferCheck;   	
    	
    	if( $this->_info['http_code'] < 400 )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    		$buffer->ExtraError = $response ;
    		$buffer = json_encode( $buffer );
    		return;
    	}
    	
    	$internalErrors = array(  
    			'MJ01' => 'Could not determine APIKey', 								// SERRCouldNotDetermineAPIKey
    			'MJ02' => 'No persister object found for class: "%s"', 					// SErrNoPersister
    			'MJ03' => 'A non-empty value is required', 								// SErrValueRequired
    			'MJ04' => 'Value must have at least length %d',							// SErrMinLength
    			'MJ05' => 'Value may have at most length %d',							// SErrMaxLength
    			'MJ06' => 'Value must be larger than or equal to %s',					// SErrMinValue
    			'MJ07' => 'Value must be less than or equal to %s',						// SErrMaxValue
    			'MJ08' => 'Property %s is invalid: %s', 								// SErrInProperty
    			'MJ09' => 'Value is not in list of allowed values: (%s)',				// SErrValueNotInList
    			'MJ10' => 'Value must be positive',										// SErrPositiveValueRequired
    			'MJ11' => 'Unknown object type "%s".',									// SErrUnknownObject
    			'MJ12' => 'Cannot save object of type %s',								// SerrCannotSaveObjectType
    			'MJ13' => 'Invalid characters in MD5 hash: "%s"',						// SErrInvalidHashCharacters
    			'MJ14' => 'Invalid length for MD5 hash: %d',							// SErrInvalidHashLength
    			'MJ15' => 'Unknown relation name : "%s"',								// SErrUnkownRelation
    			'MJ16' => 'Class "%s" does not support a unique key.',					// SErrNoAlternateKey
    			'MJ17' => '(%s) Cannot search unique key: unique key value is empty.',	// SErrNoAlternateKeyValue
    			'MJ18' => 'A %s resource with value "%s" for %s already exists.',		// SErrDuplicateKey
    			'MJ19' => 'Setting a value for property "%s" is not allowed',			// SErrCannotWriteProperty
    			'MJ20' => 'Setting a value for properties is not allowed',				// SErrCannotWriteProperties   			
    			// ContactMetadata
    			'CM01' => 'Property "%s" already exists',								// sERRCMPropertyAlreadyExists
    			'CM02' => 'Unknown namespace : %s',										// SERRCMUnknownNamespace
    			'CM03' => '"%s" is not a valid integer value for key %s',				// SERRCMNotAValidIntegerValueForKey
    			'CM04' => '"%s" is not a valid bool value for key %s',					// SERRCMNotAValidBoolValueForKey
    			'CM05' => '"%s" is not a valid float value for key %s',					// SERRCMNotAValidFloatValue
    			'CM06' => 'Length of value (%d bytes) exceeds maximum data length (%d bytes) ',	// SERRCMLengthOfValueExceedsMaxDataLength
    			'CM07' => 'Internal error: invalid data type %d',						// SERRCMInternalErrorInvalidDataType
    			'CM08' => '"%s" is not a valid datatype'								// SERRCMNotAValidDataType
    	); 	
    	
    	$response = array();
    	
    		// We expect here $this->_info['http_code']  to be >= 400   	
    	if ( isset($buffer->StatusCode) ) {
    		if( ( isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo) ) || ( isset($buffer->ErrorMessage) && !empty($buffer->ErrorMessage) ) )
    		{	
    			$comeFromString = false;
    			if( !empty( $buffer->ErrorInfo ) )
    			{  	
    				$info = json_decode( $buffer->ErrorInfo );
    				if( empty( $info) ) // message is type=string
    				{   	
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorInfo );
    				}else{   					
    					$errInfos =  $info;
    				}
    			}else{  // ( !empty( $buffer->ErrorMessage ) )
    				$info = json_decode( $buffer->ErrorMessage );
    				if( empty( $info ) ) // message is type=string
    				{
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorMessage );
    				}else{   					
    					$errInfos = $info;
    				}
    			}	
    			/**
    			*  Default response. Most of the ErrorInfo/ErrorMessage will come as they are - without specific err code in front!
    			*  We keep the ExtraErrors = ErrorInfo/ErrorMessage. 
    			*  
    			*  In the feature all the responses will consist these special codes.
    			*  When this happen (!!! ToDo !!!) -> we have to override coming StatusCode and ErrorInfo with parsed error results. And remove this ExtraError from the buffer
    			*  $internalErrors array and preg_match -> should be removed. We should catch the first 4 symbols from the string (this will be StatusCode), 
    			*  all the remaining string will be ErrorInfo 
    			*/  			   			 			 			    			
    			$errCodes = array_keys( $internalErrors );   			
    			$regexp = '/^(' . implode( '|',array_values( $errCodes ) ).')/i';   
    			foreach( $errInfos as $errInfoObj )
    			{    
    				foreach( $errInfoObj as $key => $errInfo )	
    				{			
	    				$tempResp = array();
	    				$tempResp["ExtraErrCode"] = $buffer->StatusCode;
	    				$tempResp["ExtraErrKey"] = "";
	    				$tempResp["ExtraErrMsg"] = $errInfo;
	    				
	    				preg_match($regexp, $errInfo, $matches);   	
	    				if( !empty( $matches ))
	    				{
	    					$tempResp["ExtraErrCode"] = $matches[1];
	    					if( $comeFromString )
	    						$tempResp["ExtraErrKey"] = '';
	    					else 
	    						$tempResp["ExtraErrKey"] = $key;
	    					$tempResp["ExtraErrMsg"] = $internalErrors[$matches[1]];
	    				}
	    				$response[] = $tempResp ;
    				}
    			}   			 			   			
    		}
    	}
    		// Check if is $response empty !    
    	if( empty( $response ) )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    	}	
    	
    	$buffer->ExtraError = $response ;
    	$buffer = json_encode( $buffer );
    }

}lib/api/mailjet-api-v1.php000060400000014414152456067760011336 0ustar00<?php

/**
 * Mailjet Public API
 *
 * @package		API v0.1
 * @author		Mailjet
 * @link		http://api.mailjet.com/
 *
 */

class Mailjet_Api_V1
{
	var $version = '0.1';

	// Choose your weapon : php, json, xml, serialize, html, csv
	var $output = 'json';

	// Connect thru https protocol
	var $secure = false;

	// Mode debug ? 0 none / 1 errors only / 2 all
	var $debug = 0;
	
	// Edit with your Mailjet Infos
	var $apiKey = '';
	var $secretKey = '';

	// Constructor function
	public function __construct($apiKey = false, $secretKey = false)
	{
		if ($apiKey)
			$this->apiKey = $apiKey;
		if ($secretKey)
			$this->secretKey = $secretKey;

		$this->apiUrl = (($this->secure) ? 'https' : 'http') . '://api.mailjet.com/' . $this->version . '';
	}

	public function __call($method, $args)
	{
		// params
		$params = (sizeof($args) > 0) ? $args[0] : array();

		// request method
		$request = isset($params["method"]) ? strtoupper($params["method"]) : 'GET';

		// unset useless params
		if (isset($params["method"]))
			unset($params["method"]);

		// Make request
		$result = $this->sendRequest($method, $params, $request);

		// Return result
		$return = ($result === true) ? $this->_response : false;

		if ($this->debug == 2 || ( $this->debug == 1 && $return == false))
			$this->debug();

		return $return;
	}

	public function requestUrlBuilder($method,$params=array(),$request)
	{
		$query_string = array('output' => 'output=' . $this->output);

		foreach ($params as $key => $value)
		{
			if ($request == 'GET' || in_array($key, array('apikey', 'output')))
				$query_string[$key] = $key . '=' . urlencode($value);
			if ($key == 'output')
				$this->output = $value;
		}

		$this->call_url = $this->apiUrl . '/' . $method . '/?' . join('&', $query_string);

		return $this->call_url;
	}

	public function sendRequest($method = false, $params = array(), $request = 'GET')
	{
		// Method
		$this->_method = $method;
		$this->_request = $request;

		// Build request URL
		$url = $this->requestUrlBuilder($method, $params, $request);

		if (!in_array('curl', get_loaded_extensions()))
			die('Error: You must have cURL extension enabled !');

		// Set up and execute the curl process
		$curl_handle = curl_init();
		curl_setopt($curl_handle, CURLOPT_URL, $url);
		curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($curl_handle, CURLOPT_USERPWD, $this->apiKey . ':' . $this->secretKey);
		curl_setopt($curl_handle, CURLOPT_VERBOSE, true);
		curl_setopt($curl_handle, CURLINFO_HEADER_OUT, true);
        curl_setopt($curl_handle, CURLOPT_USERAGENT, 'joomla-1.0');
    	

		$this->_request_post = false;
		if ($request == 'POST')
		{
			curl_setopt($curl_handle, CURLOPT_POST, count($params));
			curl_setopt($curl_handle, CURLOPT_POSTFIELDS, http_build_query($params));
			$this->_request_post = $params;
		}

		$buffer = curl_exec($curl_handle);

		if ($this->debug > 2)
		{
			$this->debug();
			// var_dump($buffer);
			// var_dump(curl_getinfo($curl_handle));
		}

		// Response code
		$this->_response_code = curl_getinfo($curl_handle, CURLINFO_HTTP_CODE);

		// Close curl process
		curl_close($curl_handle);

		// RESPONSE
		$this->_response = ($this->output == 'json') ? json_decode($buffer) : $buffer;

		return ($this->_response_code == 200) ? true : false;
	}

	public function debug()
	{
		echo '<style type="text/css">';
		echo '
		#debugger {width: 100%; font-family: arial;}
		#debugger table {padding: 0; margin: 0 0 20px; width: 100%; font-size: 11px; text-align: left;border-collapse: collapse;}
		#debugger th, #debugger td {padding: 2px 4px;}
		#debugger tr.h {background: #999; color: #fff;}
		#debugger tr.Success {background:#90c306; color: #fff;}
		#debugger tr.Error {background:#c30029 ; color: #fff;}
		#debugger tr.Not-modified {background:orange ; color: #fff;}
		#debugger th {width: 20%; vertical-align:top; padding-bottom: 8px;}

		';
		echo '</style>';

		echo '<div id="debugger">';

		if (isset($this->_response_code))
		{
			if ($this->_response_code == 200)
			{
				echo '<table>';
				echo '<tr class="Success"><th>Success</th><td></td></tr>';
				echo '<tr><th>Status code</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
					echo '<tr><th>Response</th><td><pre>' . utf8_decode(print_r($this->_response, 1)) . '</pre></td></tr>';

				echo '</table>';
			}
			elseif($this->_response_code == 304)
			{
				echo '<table>';
				echo '<tr class="Not-modified"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';
				echo '<tr><th>Message</th><td>Not Modified</td></tr>';
				echo '</table>';
			}
			else
			{
				echo '<table>';
				echo '<tr class="Error"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
				{
					if (is_array($this->_response) || is_object($this->_response))
						echo '<tr><th>Status</th><td><pre>' . print_r($this->_response, true) . '</pre></td></tr>';
					else
						echo '<tr><th>Status</th><td><pre>' . $this->_response . '</pre></td></tr>';
				}
			}
			echo '</table>';
		}

		$call_url = parse_url($this->call_url);

		echo '<table>';
		echo '<tr class="h"><th>API config</th><td></td></tr>';
		echo '<tr><th>Protocole</th><td>' . $call_url['scheme'] . '</td></tr>';
		echo '<tr><th>Host</th><td>' . $call_url['host'] . '</td></tr>';
		echo '<tr><th>Version</th><td>' . $this->version . '</td></tr>';
		echo '</table>';

		echo '<table>';
		echo '<tr class="h"><th>Call infos</th><td></td></tr>';
		echo '<tr><th>Method</th><td>' . $this->_method . '</td></tr>';
		echo '<tr><th>Request type</th><td>' . $this->_request . '</td></tr>';
		echo '<tr><th>Get Arguments</th><td>';

		$args = explode("&", $call_url['query']);
		foreach ($args as $arg)
		{
			$arg = explode('=', $arg);
			echo ''.$arg[0].' = <span style="color:#ff6e56;">' . $arg[1] . '</span><br/>';
		}

		echo '</td></tr>';

		if ($this->_request_post)
		{
			echo '<tr><th>Post Arguments</th><td>';

			foreach ($this->_request_post as $k => $v)
				echo $k.' = <span style="color:#ff6e56;">' . $v . '</span><br/>';

			echo '</td></tr>';
		}

		echo '<tr><th>Call url</th><td>' . $this->call_url . '</td></tr>';
		echo '</table>';
		echo '</div>';
	}
}lib/Auth.php000060400000016030152456067760006742 0ustar00<?php

defined('_JEXEC') or die('Restricted access');
 
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */

class Auth
{

	/**
	 * 
	 * @var String
	 */
	private $_dbData;

	/**
	 * 
	 * @var String
	 */
	private $_apiKey;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiSecret;
	
	/**
	 * 
	 * @var String
	 */
	private $_token;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiUrl;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiVersion;

    /**
     *
     * @var Boolean
     */
    private $_enable = false;

    /**
     *
     * @var String
     */
    private $_testAddress = 'test@emailaddress';
	
	/**
	 * 
	 */
	public function __construct()
	{
		$this->_initData();
	}
	
	/**
	 * 
	 * @return Auth
	 */
	protected function _initData()
	{
		$this->_dbData = realpath(__DIR__.'/../db/data');
		touch($this->_dbData);
		
		$data = null;
		$content = trim(file_get_contents($this->_dbData));
		
		if ($content) {
			$data = json_decode($content);
		}

		if (!$data) {
			$this->saveData();
		}

		if (isset($data->apiKey) && $data->apiKey) {
			$this->setApiKey($data->apiKey);
		}

		if (isset($data->apiSecret) && $data->apiSecret) {
			$this->setApiSecret($data->apiSecret);
		}

		if (isset($data->token) && $data->token) {
			$this->setToken($data->token);
		}
		
		if (isset($data->apiUrl) && $data->apiUrl) {
			$this->setApiUrl($data->apiUrl);
		}
		
		if (isset($data->apiVersion) && $data->apiVersion) {
			$this->setApiVersion($data->apiVersion);
		}

        if(!empty($data->enable)) {
            $this->setEnable($data->enable);
        }

        if(!empty($data->test_address)) {
            $this->setTestAddress($data->test_address);
        }
		
		return $this;
	}

	/**
	 * 
	 * @return Auth
	 */
	public function saveData()
	{
		$data = array(
			'apiKey'		=> $this->getApiKey(),
			'apiSecret'		=> $this->getApiSecret(),
			'token'			=> $this->getToken(),
			'apiUrl'		=> $this->getApiUrl(),
			'apiVersion'	=> $this->getApiVersion(),
            'enable'        => $this->getEnable(),
            'test_address'  => $this->getTestAddress()
		);
			
		file_put_contents($this->_dbData, json_encode($data));

		$mailjetConfig = realpath(__DIR__.'/../../config.php');
        $dataConf = '<?php
class JMailjetConfig {
	public $bak_mailer = "smtp";
	public $bak_smtpauth = "1";
	public $bak_smtpuser = "your API key";
	public $bak_smtppass = "your API secret";
	public $bak_smtphost = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $bak_smtpsecure = "tls";
	public $bak_smtpport = "587";
	public $test = "";
	public $test_address = "'.$this->getTestAddress().'";
	public $enable = "'.$this->getEnable().'";
	public $username = "'.(($this->getApiKey())?$this->getApiKey():"your API key").'";
	public $password = "'.(($this->getApiSecret())?$this->getApiSecret():"your API secret").'";
	public $host = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $secure = "tls";
	public $port = "587";
}';
        file_put_contents($mailjetConfig, $dataConf);
		
		return $this;
	}
	
	/**
	 * 
	 * @return Auth
	 */
	public function deleteData()
	{
		$content = trim(file_get_contents($this->_dbData));
		$data = array(
			'apiKey'		=> null,
			'apiSecret'		=> null,
			'token'			=> null,
			'apiUrl'		=> null,
			'apiVersion'	=> null,
            'enable'        => null,
            'test_address'  => null,
		);

		file_put_contents($this->_dbData, json_encode($data));

		$this->_apiKey = null;
		$this->_apiSecret = null;
		$this->_token = null;
		$this->_apiUrl = null;
		$this->_apiVersion = null;
        $this->_enable = null;
        $this->_testAddress = null;
		
		return $this;
	}
	
	/**
	 * 
	 * @param String $apiKey
	 * @return Auth
	 */
	public function setApiKey($apiKey)
	{
		$this->_apiKey = $apiKey;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiKey()
	{
		return $this->_apiKey;
	}
	
	/**
	 * 
	 * @param String $apiSecret
	 * @return Auth
	 */
	public function setApiSecret($apiSecret)
	{
		$this->_apiSecret = $apiSecret;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiSecret()
	{
		return $this->_apiSecret;
	}
	
	/**
	 * 
	 * @param String $token
	 * @return Auth
	 */
	public function setToken($token)
	{
		$this->_token = $token;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getToken()
	{
		if (($this->_token == NULL || strlen($this->_token) == 0) && $this->getApiKey() && $this->getApiSecret())
			$this->generateToken();
		return $this->_token;
	}

    /**
     *
     * @return Boolean
     */
    public function getEnable()
    {
        return $this->_enable;
    }

    /**
     *
     * @param Boolean
     * @return Boolean
     */
    public function setEnable($val)
    {
        return $this->_enable = $val;
    }

    /**
     *
     * @return String
     */
    public function getTestAddress()
    {
        return $this->_testAddress;
    }

    /**
     *
     * @param String
     * @return String
     */
    public function setTestAddress($val)
    {
        return $this->_testAddress = $val;
    }
	
	/**
	 * 
	 * @param String $apiUrl
	 * @return Auth
	 */
	public function setApiUrl($apiUrl)
	{
		$this->_apiUrl = $apiUrl;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiUrl()
	{
		return $this->_apiUrl;
	}
	
	/**
	 * 
	 * @param String $apiVersion
	 * @return Auth
	 */
	public function setApiVersion($apiVersion)
	{
		$this->_apiVersion = $apiVersion;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiVersion()
	{
		return $this->_apiVersion;
	}

	/**
	 * 
	 * @return boolean
	 */
	public function haveToken()
	{		
		return (boolean) $this->getToken();
	}
	
	/**
	 * 
	 * @return boolean
	 */
	public function canGenerateToken()
	{
		return $this->getApiKey() && $this->getApiSecret();
	}

	/**
	 * 
	 * @return boolean
	 */
	public function generateToken()
	{	
		if (!$this->canGenerateToken()) {
			return false;
		}
			
		$mj = new Mailjet_Api($this->getApiKey(), $this->getApiSecret());
		$this->setApiUrl($mj->apiUrl);
		$this->setApiVersion($mj->version);

		$response = $mj->getAuthToken(array(
			'APIKey'		=> $this->getApiKey(),
			'SecretKey'	 	=> $this->getApiSecret()
		));
		
		// Log the response
		$this->_log($mj);
		
		// Check if the response is correct
		if (!isset($response->Status) || (isset($response->Status) && $response->Status != 'ERROR')) {
			$this->setToken($response);
			$this->saveData();
		}
		
		return true;
	}

	public function __destruct()
	{
		$this->saveData();
	}
	
	private function _log($response)
	{
		$log = realpath(__DIR__.'/../tmp/log');
		
		touch($log);
		
		$delimiter = str_repeat('=', 100);
		
		$content = file_get_contents($log);
		
		$prepend = '';
		
		$prepend .= $delimiter;
		$prepend .= PHP_EOL;
		$prepend .= date('Y-m-d H:i:s');
		$prepend .= PHP_EOL;
		$prepend .= 'RESPONSE';
		$prepend .= PHP_EOL;
		$prepend .= print_r($response, true);
		$prepend .= PHP_EOL;

		
		$content = $prepend.$content;
		file_put_contents($log, $content);
	}
	
}

?>hook.php000060400000003474152456067760006243 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

require_once realpath(__DIR__.'/lib/Auth.php');
require_once realpath(__DIR__.'/lib/mailjet-api-strategy.php');

$auth = new Auth();

$log = realpath(__DIR__.'/tmp/log');

touch($log);

$delimiter = str_repeat('=', 100);

$content = file_get_contents($log);

$prepend = '';

$prepend .= $delimiter;
$prepend .= PHP_EOL;
$prepend .= date('Y-m-d H:i:s');
$prepend .= PHP_EOL;
$prepend .= 'POST';
$prepend .= PHP_EOL;
$prepend .= print_r($_POST, true);
$prepend .= PHP_EOL;
$prepend .= 'GET';
$prepend .= PHP_EOL;
$prepend .= print_r($_GET, true);

if (isset($_POST['data'])) {
	$data = (object) $_POST['data'];
} else if (isset($_POST['mailjet'])) {
	$mailjet = json_decode($_POST['mailjet']);
	$data = $mailjet->data;
}

if (isset($data->next_step_url) && $data->next_step_url) {

	//we have api key and secret but no token so generate it
	if (
		isset($data->apikey) 
		&& $data->apikey 
		&& isset($data->secretkey) 
		&& $data->secretkey
		&& !$auth->haveToken()
	) {		
		$auth->setApiKey($data->apikey);
		$auth->setApiSecret($data->secretkey);
		$auth->generateToken();
		$auth->saveData();
	} 

	$response = array(
		"code"				=> 1,
		"continue"			=> true,
		"continue_address"	=> $data->next_step_url,
	);
	
} else {

	$response = array(		
		"code"		=> 0,		
		"continue"	=> false,		
		"exit_url"	=> 'http://prestashop.com/exit.php',
	);
	
}

$json = json_encode($response);

$prepend .= PHP_EOL;
$prepend .= 'RESPONSE';
$prepend .= PHP_EOL;
$prepend .= $json;
$prepend .= PHP_EOL;
$prepend .= $delimiter;
$prepend .= PHP_EOL;

$content = $prepend.$content;
file_put_contents($log, $content);

echo $json;config.php000060400000000630152456067760006537 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$myHookUrl      = JURI::base().'components/com_mailjet/lib/hook.php';
$myExitUrl      = JURI::base().'components/com_mailjet/lib/exit.php'; 
$resellerName   = 'test';tmp/log000060400000102250152456067760006066 0ustar00====================================================================================================
2014-09-24 18:22:51
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 18:02:39
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 18:02:06
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.075868
                    [namelookup_time] => 3.1E-5
                    [connect_time] => 0.031974
                    [pretransfer_time] => 0.032039
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8475
                    [speed_upload] => 2016
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.075834
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 47087
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => in-v3.mailjet.com
)

====================================================================================================
2014-09-24 17:39:54
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:26:25
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:26:09
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:25:55
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 16:34:26
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.0752
                    [namelookup_time] => 3.5E-5
                    [connect_time] => 0.03224
                    [pretransfer_time] => 0.03231
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8550
                    [speed_upload] => 2034
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.075164
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 41085
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => in-v3.mailjet.com
)

====================================================================================================
2014-09-24 16:19:47
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.077033
                    [namelookup_time] => 3.0E-5
                    [connect_time] => 0.032484
                    [pretransfer_time] => 0.032563
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8347
                    [speed_upload] => 1986
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.076998
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 39552
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => http://api.mailjet.com/v3/REST/
)

====================================================================================================
2014-09-24 14:40:57
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.383548
                    [namelookup_time] => 2.9E-5
                    [connect_time] => 0.031834
                    [pretransfer_time] => 0.031893
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 1676
                    [speed_upload] => 398
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.383513
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.46.177
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 53699
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
)

====================================================================================================
2014-09-24 13:55:44
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-24T10:55:44Z
                            [FirstUsedAt] => 
                            [ID] => 1531814
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => E2A2E8E4155971C09461056DB4A2E84A88641773F890CBA6D7E4940EFFE4E0CED009FF388848B7E68C89C340F0A39B7C22273723A53A2CF57E6CEFE34173D2B4970DE3C56F369116250864C4773A02E548A9583A393C896E58453FDEA6BA76E5E0B3DFDC4E6A165CBDE3D5EB1B7702F6559323ABE83B876F9AED3CB4C7BA087
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-24 13:55:37
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-24T10:55:37Z
                            [FirstUsedAt] => 
                            [ID] => 1531813
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => FDBE4EAB1136F8B5CE0CC150D2711138180B16C46B51E6C99B873B063038E373C54686FAFABB85D3F6FED5A02B881C4649A017D30787A3D1BDCD2976CE681FAC75E67FDFE2D5D49740453999BC10FB5A92358730733F15ADF153C1CDEADCF5DC8A3A67BC8D8665921DBEBDAED395F1C56AD056332572BB5E6F48B9887D40999
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 18:23:25
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-23T15:23:25Z
                            [FirstUsedAt] => 
                            [ID] => 1531747
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => 31780227E49D32BD990E9A4B129DF4E8A3CAAA0228336F28CF14D9EC57EB1FCED69A17D464F93374298496DCF7412B28FBFA1ADE1E4262C6DC6B1326B0EAD0ADC3517AC082CCF2F90B25E5006F38C9E50551E9385FA1430A1D2E423E67658245FF5AA97DBDFC3A5671DE309656D002EA6066A1F8A42134A689ADCCC1964165D
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 12:38:08
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-23T09:38:08Z
                            [FirstUsedAt] => 
                            [ID] => 1531715
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => C7470DD9910D1A4885F2E0669861165180EEE5C18ABBD23956E27E9FC14F356BB495B8D9F9E9636965404732A6675C986982832E4DCA6014B6600364286E0678B5392A1D5E30EDA650F75A8607D28257B023E2166EEACF1868337B1B218C952D997185A5128F5C80F01EA446EE63E6430C1AFFC0F2C4BBA9EA374B2A16ADDF4
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 12:26:27
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.12
                            [CreatedAt] => 2014-09-23T09:26:27Z
                            [FirstUsedAt] => 
                            [ID] => 1531706
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => 255B5D469EF20EECB4C56EF1D5CEADE84E0DC6E4B05AD137B8D7AE91428DDC7547C9C14573B78830BDF1911C4567115EAB21D2E524BFC7E5702601FB9E16DFF7A272A9E5C71D7BDE0B584132FC3ED6AFA6133BFE475B39A157FD2A21B663BDE3EF9D9D3904D32299949CEB4971C68EE337638A4EFAADE99ACE71DCD4F286DE8
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-19 17:23:02
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.12
                            [CreatedAt] => 2014-09-19T14:23:02Z
                            [FirstUsedAt] => 
                            [ID] => 1531571
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => FACB508DBC7E98D9D08F66A59B0C560CFB78AD000B724981284A7612AA773B31E3EFFAFEB3308A37336D24F24FD8CD88CD06A2A8A3C9C04DCD2A5C4658626E91F4874F180DF513EC0B853988CFCC708F4F02283D7230E69A6097C8EE243A0B9D2BC0E31ACC373B57D0E2441A6684CA2129139DED2322FB9E417EFA1DF60588A
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

exit.php000060400000000370152456067760006244 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
EXITdb/data000060400000000241152456067760006000 0ustar00{"apiKey":"6363e9d3b0fbcc689c98e18a1a0ba9b5","apiSecret":"ea3818da6ef29051a081297d4e4ea6cb","token":null,"test_address":"vincent.halle@eliosa.com","enable":true}mailjet-api-strategy.php000060400000047635152456276260011343 0ustar00<?php

/*
 * LICENSE BLOCK
 * 
 * This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it
 * and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING for more details.
 * 
 */
 
defined('_JEXEC') or die('Restricted access');

/* Require the mailjet API libraries */
require_once (__DIR__ . '/api/mailjet-api-v1.php');
require_once (__DIR__ . '/api/mailjet-api-v3.php');
 
 /**
 * This is Api Strategy Interface
 * @author		Pavel Tashev  
 * @author		Mailjet
 * @link		http://www.mailjet.com/
 */
 
 # ============================================== Interface ============================================== #
 interface Mailjet_Api_Interface 
 {
	public function getSenders($params);
 	public function getContactLists($params);
 	public function addContact($params);
	public function removeContact($params);
	public function unsubContact($params);
	public function subContact($params);	
	public function getAuthToken($params);	
	public function validateEmail($email);
 }
 
 
 
 
 
 # ============================================== Strategy ============================================== #
 # Strategy ApiV1
 class Mailjet_Api_Strategy_V1 extends Mailjet_Api_V1 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->userSenderList()->senders;
					
		// Check if the list exists
		if(isset($response))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response as $sender)
			{
				if($sender->status == 'active')
				{
					if(substr($sender->email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->email, 2, strlen($sender->email)); // This is domain
					else						
						$senders['email'][] = $sender->email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->listsAll($input);

		// Check if the list exists
		if(isset($response->status) && $response->status == 'OK')
		{
			$lists = array();
			foreach ($response->lists as $list)
			{
				$lists[] = array(
					'value' 		=> $list->id,
					'label' 		=> $list->label,
					'subscribers'	=> $list->subscribers,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
				
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Unsubscribe the contact
		$response = $this->listsRemoveContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Unsubscribe the contact
		$response = $this->listsUnsubContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Subscribe the user
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'id'		=> $params['ListID'],
			'contact'	=> $params['Email'],
			'force'		=> 1,
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{		
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	
			
	 	if (isset($params['MailjetToken']))
		{
			$op = json_decode($params['MailjetToken']);
			if ($op->timestamp > time() - 3600)
				return $op->token;
		}

		// Get the culture
		if(isset($lang) && $lang != null)
		{
			$locale = substr($lang->getTag(), 0, 2);
			if (!in_array($locale, array('en', 'fr', 'es', 'de')))
				$locale = 'en';
		} else {
			$locale = 'en';
		}

		// Define some required data
		$url = $this->apiUrl.'/apiKeyauthenticate?output=json';
		$data = array(
			'allowed_access[0]' => 'stats',
			'allowed_access[1]' => 'contacts',
			'allowed_access[2]' => 'campaigns',
			'lang' 				=> $locale,
			'default_page'		=> 'campaigns',
			'type' 				=> 'page',
			'apikey' 			=> $params['APIKey']
		);
		
		// Execute POST request
		$curl = curl_init();
		curl_setopt_array($curl, array(
		    CURLOPT_RETURNTRANSFER => 1,
		    CURLOPT_URL => $url,
		    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
		    CURLOPT_POST => 1,
		    CURLOPT_POSTFIELDS => $data
		));
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    		"Authorization: Basic ".base64_encode($params['APIKey'] . ':' . $params['SecretKey'])
    	));
		$result = curl_exec($curl);
		$resp = json_decode($result);
		
		if (is_object($resp))
			if ($resp->status == 'OK')
				return $resp->token;
		
		return (object) array('Status' => 'ERROR'); 
	}	

	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }


 # Strategy ApiV3
 class Mailjet_Api_Strategy_V3 extends Mailjet_Api_V3 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->sender($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response->Data as $sender)
			{
				if($sender->Status == 'Active')
				{
					if(substr($sender->Email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->Email, 2, strlen($sender->Email)); // This is domain
					else						
						$senders['email'][] = $sender->Email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array(
			'akid'	=> $this->_akid
		);
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->liststatistics($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$lists = array();
			foreach ($response->Data as $list)
			{
				$lists[] = array(
					'value' 		=> $list->ID,
					'label' 		=> $list->Name,
					'subscribers'	=> $list->SubscriberCount,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$result = $this->manycontacts(array(
			'method'			=> 'POST',
			'Action'			=> 'Add',
			'Addresses'			=> array($params['Email']),
			'ListID'			=> $params['ListID'],
		));

		// Check if any error
		if(isset($result->Data['0']->Errors->Items)) {
			if( strpos($result->Data['0']->Errors->Items[0]->ErrorMessage, 'duplicate') !== FALSE )
				return (object) array('Status' => 'DUPLICATE');
			else
				return (object) array('Status' => 'ERROR');	
		}		
		
		$this->subContact($params);
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
			{
				// Remove the contact
				$response = $this->listrecipient(array(
					'akid'				=> $this->_akid,
					'method'			=> 'delete',
					'ID'				=> $contact->ID
				));
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }

		return (object) array('Status' => 'ERROR');
	}
	 
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed !== TRUE)
                {
                      $response = $this->listrecipient(array(
                            'akid'    			=> $this->_akid,
                            'method'   			=> 'PUT',
                            'ID'       			=> $contact->ID,
                            'IsUnsubscribed' 	=> 'true',
                            'UnsubscribedAt' 	=> date("Y-m-d\TH:i:s\Z", time()),
                      ));
                } 
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));		
		
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed === TRUE)
                {
	                  $response = $this->listrecipient(array(
	                        'akid'    			=> $this->_akid,
	                        'method'   			=> 'PUT',
	                        'ID'       			=> $contact->ID,
	                        'IsUnsubscribed' 	=> 'false',	                        
	                  ));
                } 
            }
			
			// Check if the subscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	

		// Get the ID of the Api Key
	 	$api_key_response = $this->apikey(array(
			'method' => 'GET',
			'APIKey' => $params['APIKey']
		));

		// Check if the response contains data
		if(!isset($api_key_response->Data[0]->ID))
			return (object) array('Status' => 'ERROR');

		// Get token
		$response = $this->apitoken(array(
			'AllowedAccess' =>  'campaigns,contacts,reports,stats,preferences,pricing,account',
			'method' 		=> 'POST',			
			'APIKeyID' 		=> $api_key_response->Data[0]->ID,
			'TokenType' 	=> 'iframe',			
			'CatchedIp'  	=> $_SERVER['REMOTE_ADDR'],
			'log_once' 		=> TRUE,
			'IsActive'		=> TRUE
		));	

	 	// Get and return the token
		if(isset($response->Data) && count($response->Data) > 0)
			return $response->Data[0]->Token;
		
		return (object) array('Status' => 'ERROR');
	}	
	
	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }
 
 
 
 
 
 # ============================================== Context ============================================== #
 class Mailjet_Api
 {
 	private $context;
	public $version; 
	public $apiUrl;
	
	public function __construct($mailjet_username, $mailjet_password)
  	{
  		# Check the type of the user and set the corresponding Context/Strategy
  		// Set API V3 context and get the user and check if it's V3   		
		$this->setContext(new Mailjet_Api_Strategy_V3($mailjet_username, $mailjet_password));
		//$response = $this->context->getContactLists(array('limit' => 1));
		$response = $this->context->getSenders(array('limit' => 1));
		if(isset($response->Status) && $response->Status == 'ERROR')
		{
			// Set API V1 context and get the contact lists of this user and check if it's V1
			$this->setContext(new Mailjet_Api_Strategy_V1($mailjet_username, $mailjet_password));	
			$response = $this->context->getSenders(array('limit' => 1));
			if(isset($response->Status) && $response->Status == 'ERROR')
			{				
				$this->clearContext();			
			} 
			else {			
				// Get the version and the apiUrl of the API
				$this->version = $this->context->version;
				$this->apiUrl = 'in.mailjet.com';
			}
		} else {
			// Get the version and the apiUrl of the API
			$this->version = $this->context->getVersion();
			$this->apiUrl = 'in-v3.mailjet.com';
		}		
	}
	
	/**
	 * Set the context of the Api - V1 or V3 
	 *
     * @param Mailjet_Api_Interface $context
     * @return void
     */
	private function setContext(Mailjet_Api_Interface $context)
    {
        $this->context = $context;
    }
	
	/**
	 * Clear the context
	 *
     * @param void
     * @return void
     */
	private function clearContext()
    {
        $this->context = FALSE;
    }
	
	
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getSenders($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getSenders($params);
	}	
	
	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getContactLists($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getContactLists($params);
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function addContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->addContact($params);
	 }
	 
	 /**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function removeContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->removeContact($params);
	 }
	 
	 /**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	  public function unsubContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->unsubContact($params);
	  }
	  
	 /**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	  public function subContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->subContact($params);
	  }
	  
	  /**
		* Get the authentication token for the iframes
		* 
		* @param (array) $param = array('APIKey', 'SecretKey', ...) 
		* @return (object)
	  */
	  public function getAuthToken($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->getAuthToken($params);
	  }	
	  
	  /**
	  * Validate if $email is real email
	  * 
	  * @param (string) $email 
	  * @return (boolean) TRUE|FALSE 
	  */
	  public function validateEmail($email) {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
		return $this->context->validateEmail($email);
	  }
 }
 api/mailjet-api-v3.php000060400000067407152456276260010601 0ustar00<?php

/**
 * Mailjet Public API / The real-time Cloud Emailing platform
 *
 * Connect your Apps and Make our product yours with our powerful API
 * http://www.mailjet.com/ Mailjet SAS Website
 *
 * @package		API v0.3
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @copyright	Copyright (c) 2012-2013, Mailjet SAS, http://www.mailjet.com/Terms-of-use.htm
 * @file
 */

// ---------------------------------------------------------------------

/**
 * Mailjet Public API Main Class
 *
 * This class enables you to connect your Apps and use our powerful API.
 * You can use the 'metadata' call to retrieve a list of each object available
 * or implemented a live discovery.
 * http://www.mailjet.com/docs/api
 *
 * updated on 2013-09-03
 *
 * @class		MailjetApi
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @version		0.1
 */
class Mailjet_Api_V3
{
    /**
     * Mailjet API Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_apiKey
     */
    private $_apiKey = '';

    /**
     * Mailjet API Secret Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_secretKey
     */
    private $_secretKey = '';

    /**
     * Seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	private
     * @var		integer $_cache
     */
    private $_cache = 0;//600;

// ---------------------------------------------------------------------

    /**
     * API URL
     *
     * @access	private
     * @var		string
     */
    private $_apiUrl = 'api.mailjet.com/v3/';

    /**
     * API version to use
     *
     * @access	private
     * @var		string
     */
    private $_version = 'REST';

    /**
     * Debug internal flag
     *
     * @access	private
     * @var		boolean
     */
    private $_debug = false;

    /**
     * Debug Label
     *
     * @access	private
     * @var		string
     */
    private $_debug_info = '';

    /**
     * Debug buffer copy
     *
     * @access	private
     * @var		string
     */
    private $_buffer = '';

    /**
     * Debug method copy
     *
     * @access	private
     * @var		string
     */
    private $_method = '';

    /**
     * Debug by cURL
     *
     * @access	private
     * @var		array
     */
    private $_info = NULL;

    /**
     * cURL handle resource
     *
     * @access	private
     * @var		resource
     */
    private $_curl_handle = NULL;

    /**
     * 
     * @var Boolean
     */
    protected $_log_allowed = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log_once = false;
    
    /**
     *
     * @var Boolean
     */
    protected $_extra_err = false;
    
    /**
     * 
     * @var String
     */
    protected $_log_path = 'logs/api/current.log';
    
    /**
     * Singleton pattern : Current instance
     *
     * @access	private
     * @var		resource
     */
    private static $_instance = NULL;

    /**
     * Constructor
     *
     * Set $_apiKey and $_secretKey if provided & Update $_apiUrl with protocol
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string  $_apiKey    Mailjet API Key
     * @param string  $_secretKey Mailjet API Secret Key
     * @param boolean $secure     TRUE to secure the transaction, FALSE otherwise
     */
    public function __construct($apiKey = NULL, $secretKey = NULL, $secure = FALSE)
    {
        if (isset($apiKey))
            $this->_apiKey = $apiKey;
        if (isset($secretKey))
            $this->_secretKey = $secretKey;
        $this->_apiUrl = 'http://'.$this->_apiUrl.$this->_version.'/';
        $this->secure($secure);
        
        $this->_log_allowed = get_cfg_var('MAILJET_ENVIRONMENT') == 'dev';
        
        $this->_fixLogPath();
    }

    /**
     * Singleton pattern :
     * Get the instance of the object if it already exists
     * or create a new one.
     *
     * @access	public
     * @uses	MailjetApi::$_instance
     */
    public static function getInstance()
    {
        if (!(self::$_instance instanceof self))
            self::$_instance = new self();

        return self::$_instance;
    }

    /**
     * Destructor
     *
     * Close the cURL handle resource
     *
     * @access	public
     * @uses	MailjetApi::$_curl_handle
     */
    public function __destruct()
    {
        if(!is_null($this->_curl_handle))
            curl_close($this->_curl_handle);
        $this->_curl_handle = NULL;
    }

    /**
     * Set new Api Key and Secret Key
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string $apiKey    Mailjet API Key
     * @param string $secretKey Mailjet API Secret Key
     */
    public function setKeys($apiKey, $secretKey)
    {
        $this->_apiKey = $apiKey;
        $this->_secretKey = $secretKey;
    }

    /**
     * Set the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     * @param integer $cache Cache to set in seconds
     */
    public function setCache($cache)
    {
        $this->_cache = $cache;
    }

    /**
     * Get the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     *
     * @return integer Cache in seconds
     */
    public function getCache()
    {
        return ($this->_cache);
    }

    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLog($flag)
    {
    	$this->_log = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLog()
    {
    	return $this->_log;
    }
    
    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLogOnce($flag)
    {
    	$this->_log_once = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLogOnce()
    {
    	return $this->_log_once;
    }
    
	/**
     * 
     * @return string
     */
    public function getVersion()
    {
    	return $this->_version;
    }
	
    /**
     *
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setExtraError($flag)
    {
    	$this->_extra_err = (boolean) $flag;
    	return $this;
    }
    
    /**
     *
     * @return boolean
     */
    public function getExtraError()
    {
    	return $this->_extra_err;
    }

    /**
     * Enable log only if MAILJET_ENVIRONMENT == 'dev'
     * @return boolean
     */
    public function logAllowed()
    {
    	return $this->_log_allowed;
    }
    
    /**
     * 
     * @param String $path
     * @return mailjetapi
     */
    public function setLogPath($path)
    {
    	if ($real_path = realpath($path)) {
    		$this->_log_path = $real_path;
    	}
    	return $this;
    }
    
    /**
     * 
     * @return String
     */
    public function getLogPath()
    {
    	return $this->_log_path;
    }
    
    /**
     * 
     * @return mailjetapi
     */
    protected function _fixLogPath()
    {
    	//fix log path
		if(!defined('SYSTEMPATH')) define('SYSTEMPATH', dirname(__FILE__).'/../');
    	$this->_log_path = realpath(SYSTEMPATH.$this->_log_path);
    	$logFilename = 'daily-'.date('Ymd').'.log';
    	$this->_log_path = str_replace('current.log', $logFilename, $this->_log_path);
		return $this;
    }
    
    /**
     * Secure or not the transaction through https
     *
     * @access	public
     * @uses	MailjetApi::$_apiUrl
     * @param boolean $secure TRUE to secure the transaction, FALSE otherwise
     */
    public function secure($secure = TRUE)
    {
        $protocol = 'http';
        if ($secure)
            $protocol = 'https';
        $this->_apiUrl = preg_replace('/http(s)?:\/\//', $protocol.'://', $this->_apiUrl);
    }

    /**
     * Make the magic call ;)
     *
     * Check for some arguments and order them before sending the request.
     * If '_debug_info' is found, some data are stored and can be retrieved
     * with a call to MailjetApi::getDebugInfo().
     *
     * @access	public
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_debug_info
     * @uses	MailjetApi::sendRequest() to send the request
     * @param string $object Method to call
     * @param array  $args   Array of parameters
     *
     * @return string JSON string by default (format can be change with the 'format' parameter)
     */
    public function __call($object, $args)
    {
        if (sizeof($args) > 0)
            $params = $args[0];
        else
            $params = array();

        if (isset($params['method'])) {
            $method = strtoupper($params['method']);
            unset($params['method']);
        }
        if (!isset($method) || !in_array($method, array('GET', 'POST', 'PUT', 'DELETE', 'JSON')))
            $method = 'GET';

        if (isset($params['debug_info'])) {
            $this->_debug = TRUE;
            $this->_debug_info = $params['debug_info'];
            unset($params['debug_info']);
        }
        
        /**
         * Logging
         */
        if (isset($params['log'])) {
        	$this->setLog($params['log']);
        	unset($params['log']);
        }
        
        if (isset($params['log_once'])) {
        	$this->setLogOnce($params['log_once']);
        	unset($params['log_once']);
        }
        
        if (isset($params['log_path'])) {
        	$this->setLogPath($params['log_path']);
        	unset($params['log_path']);
        }
        
        // Extra Error
        if (isset($params['extra_err'])) {
        	$this->setExtraError($params['extra_err']);
        	unset($params['extra_err']);
        }
        
        /**
         * Fallback logging when debug is true
         */
        if ($this->_debug) {
        	$this->setLogOnce(true);
        }

        return (json_decode($this->sendRequest($object, $params, $method)));
    }

    /**
     * Send Request
     *
     * Send the request to the Mailjet API server and get back the result
     * Basically, setup and execute the curl process.
     * Cache management added
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @uses	MailjetApi::$_curl_handle
     * @uses	MailjetApi::buildURL() to build the full Url for the request and update the list of parameters accordingly
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return string the result of the request
     */
    private function sendRequest($object, $params, $method)
    {

    	// Log if this is a JSON call with an ID inside params
    	$is_json_put = (isset($params['ID']) && !empty($params['ID']));
    
        list($url, $params) = $this->buildURL($object, $params, $method);

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $file = $method.'.'.$object.'.'.hash('md5', $this->_apiKey.http_build_query($params, '', '')).'.cache';
        }

        if(is_null($this->_curl_handle))
            $this->_curl_handle = curl_init();

        curl_setopt($this->_curl_handle, CURLOPT_URL, $url);
        curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($this->_curl_handle, CURLOPT_USERPWD, $this->_apiKey.':'.$this->_secretKey);
        curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($this->_curl_handle, CURLOPT_USERAGENT, 'joomla-3.0');
    	
        switch ($method) {
            case 'GET' :
                curl_setopt($this->_curl_handle, CURLOPT_HTTPGET, TRUE);
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, NULL);
            break;

            case 'POST':
                if(isset($params['Action']) && $params['Action']=='Add'){
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, json_encode($params));
                    curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                }
                else{
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
                }
            break;

            case 'PUT':
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
            break;
            
            case 'JSON':
            	if($is_json_put)
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "PUT");            		
            	else
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
            	
            	$params = json_encode($params);
				curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $params);
				curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
				curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array(
				    'Content-Type: application/json',
				    'Content-Length: ' . strlen($params))
				);
            break;
            	
        }

        $buffer = curl_exec($this->_curl_handle);

        $this->_info = curl_getinfo($this->_curl_handle);
        $this->_response_code = $this->_info['http_code'];
        
		curl_close($this->_curl_handle);
		$this->_curl_handle = null;
        
        if ($this->_debug) {
            $this->_buffer = $buffer;
            $this->_method = $method;
            $this->_debug = FALSE;
        }

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $data = array('timestamp' => time(), 'result' => $buffer, 'http_code' => $this->_info['http_code']);
        }
        
        if( $this->getExtraError() ){
        	$this->getExtraErr( $buffer );
        	$this->setExtraError( false );
        }
        
        if ($this->logAllowed() && ($this->getLog() || $this->getLogOnce())) {

        	if ($this->_info) {
	        	$moreInfo = print_r(array(
	       			'content_type'	=> $this->_info['content_type'],
	        		'http_code'		=> $this->_info['http_code'],
	        		'total_time'	=> $this->_info['total_time'],
	        	), true);
	        	$moreInfo = substr($moreInfo, 6);
        	} else {
        		$moreInfo = 'none';
        	}
        	
        	$date = DateTime::createFromFormat('U.u', microtime(true));
        	
            if (is_array($params)) {
        		$jsonParams = json_encode($params);
        	} else {
        		$jsonParams = $params;
        	}
        	        	
        	$logLines = array();
        	
			$logLines[] = '';
        	$logLines[] = $date->format('Y-m-d H:i:s.u')." > {$object} :: {$method}";
			$logLines[] = '';
			$logLines[] = $this->_info['url'];
			$logLines[] = '';
			$logLines[] = "Request";
			$logLines[] = $jsonParams;
			$logLines[] = '';
			$logLines[] = "Response";
			$logLines[] = $buffer;
			$logLines[] = '';
			$logLines[] = 'Info';
			$logLines[] = $moreInfo;
			$logLines[] = '';
			$logLines[] = str_repeat("=", 100);
			$logLines[] = '';
				
			$logText = implode(PHP_EOL, $logLines);

			file_put_contents($this->getLogPath(), $logText, FILE_APPEND);
        	
			$this->setLogOnce(false);
			
        }
        
        return $buffer;
    }

    /**
     * Build the full Url for the request and update the parameters if needed
     *
     * @access	private
     * @uses	MailjetApi::$_apiUrl
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return array Full built Url for the request and new params
     */
    private function buildURL($object, $params, $method = 'GET')
    {
        $url = $this->_apiUrl.$object;

        if (isset($params['ID'])) {
            $url .= '/'.$params['ID'];
            unset($params['ID']);
        }

        $this->_akid = array_key_exists('akid', $params);

        if ($method == 'GET')
            $url .= '?'.http_build_query($params, '', '&');
        elseif ($method == 'PUT' || $method == 'POST' || $method == 'DELETE' || $method == 'JSON') {
            $tocheck = array('format', 'style', 'countrecords', 'recurse', 'akid', 'DuplicateFrom');
            $query = array();
            foreach ($params as $key => $value)
                if (in_array($key, $tocheck)) {
                    $query[$key] = $value;
                    unset($params[$key]);
                }
            if(count($query))
            	$url .= '?'.http_build_query($query, '', '&');
            	
        } 

        return (array($url, $params));
    }

    /**
     * Build query for cURL
     * Beware of the Boolean !
     *
     * @access	private
     * @param array $params Post parameters for the request
     *
     * @return string URL-encoded query string from the associative array provided
     */
    private function curl_build_query($params)
    {
    	foreach($params as $key => $value) {
	    	if($value === TRUE)
	    		$value = 'true';
	    	elseif($value === FALSE)
	    		$value = 'false';
    	}
        /*array_walk($params, function(&$value, &$key) {
            if ($value === TRUE) {
                $value = 'true';
            } elseif ($value === FALSE) {
                $value = 'false';
            }
        });*/

        return (http_build_query($params, '', '&'));
    }

    /**
     * Get the last HTTP code retrieved by cURL
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     *
     * @return integer last HTTP code retrieved by cURL or 0 if not set
     */
    public function getLastHTTPCode()
    {
        if (isset($this->_info['http_code']))
            return ($this->_info['http_code']);

        return (0);
    }

    /**
     * Set some info if the object came from the cache
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     */
    private function setCacheDebugInfo($method, $url, $data)
    {
        $this->_debug_info .= ' /* LAST CACHED AT '.date('Y/m/d H:i:s', $data['timestamp']).' - UPDATING EVERY '.$this->_cache.'s */';
        $this->_buffer = $data['result'];
        $this->_method = $method;
        $this->_info = array();
        $this->_info['url'] = $url;
        $this->_info['http_code'] = $data['http_code'];
        $this->_info['total_time'] = $this->_info['pretransfer_time'] = 0;
        $this->_debug = FALSE;
    }

    /**
     * Get some info for debugging purpose
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     * To update this array, you need to add the key 'debug_info'
     * to the list of parameters. You can specified a value to
     * identify the returned array.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     *
     * @return array with some debug info
     */
    public function getDebugInfo()
    {
        $status_code = array (
            200 => 'OK - Everything went fine.',
            201 => 'OK - Created : The POST request was successfully executed.',
            204 => 'OK - No Content : The Delete request was successful.',
            304 => 'OK - Not Modified : The PUT request didn’t affect any record.',
            400 => 'KO - Bad Request : Please check the parameters.',
            401 => 'KO - Unauthorized : A problem occurred with the apiKey/secretKey. You may be not authorized to access the API or your apiKey may have expired.',
            403 => 'KO - Forbidden : You are not authorized to call that function.',
            404 => 'KO - Not Found : The resource with the specified ID does not exist.',
            405 => 'KO - Method not allowed : Attempt to put/post multiple resources in 1 request.',
            500 => 'KO - Internal Server Error.',
            503 => 'KO - Service unavailable.'
        );

        if (array_key_exists($this->_info['http_code'], $status_code))
            $http_code_text = $status_code[$this->_info['http_code']];
        else
            $http_code_text = 'KO - Service unavailable.';

        $status_message = '';
        if ($this->_info['http_code'] >= 400) {
            $buffer = json_decode($this->_buffer);
            if (!is_null($buffer) && isset($buffer->StatusCode) && isset($buffer->ErrorMessage)) {
                $status_message = $buffer->StatusCode.' - '.$buffer->ErrorMessage;
                if (isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo))
                    $status_message .= ' ('.$buffer->ErrorInfo.')';
            }
        }

        $res = array(
            'debug_info'	=> $this->_debug_info,
            'method'		=> $this->_method,
            'url'			=> $this->_info['url'],
            'duration'		=> $this->_info['total_time'] - $this->_info['pretransfer_time'],
            'http_code'		=> $this->_info['http_code'],
            'http_code_text'=> $http_code_text,
            'status_message'=> $status_message,
            'curl_info'		=> $this->_info,
            'buffer'		=> $this->_buffer
        );

        return $res;
    }
    
    protected function getExtraErr( &$buffer )
    {   
    	$bufferCheck = json_decode($buffer);
    	
    	if( is_null( $bufferCheck ) )
    		return;
    	
    	$buffer = $bufferCheck;   	
    	
    	if( $this->_info['http_code'] < 400 )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    		$buffer->ExtraError = $response ;
    		$buffer = json_encode( $buffer );
    		return;
    	}
    	
    	$internalErrors = array(  
    			'MJ01' => 'Could not determine APIKey', 								// SERRCouldNotDetermineAPIKey
    			'MJ02' => 'No persister object found for class: "%s"', 					// SErrNoPersister
    			'MJ03' => 'A non-empty value is required', 								// SErrValueRequired
    			'MJ04' => 'Value must have at least length %d',							// SErrMinLength
    			'MJ05' => 'Value may have at most length %d',							// SErrMaxLength
    			'MJ06' => 'Value must be larger than or equal to %s',					// SErrMinValue
    			'MJ07' => 'Value must be less than or equal to %s',						// SErrMaxValue
    			'MJ08' => 'Property %s is invalid: %s', 								// SErrInProperty
    			'MJ09' => 'Value is not in list of allowed values: (%s)',				// SErrValueNotInList
    			'MJ10' => 'Value must be positive',										// SErrPositiveValueRequired
    			'MJ11' => 'Unknown object type "%s".',									// SErrUnknownObject
    			'MJ12' => 'Cannot save object of type %s',								// SerrCannotSaveObjectType
    			'MJ13' => 'Invalid characters in MD5 hash: "%s"',						// SErrInvalidHashCharacters
    			'MJ14' => 'Invalid length for MD5 hash: %d',							// SErrInvalidHashLength
    			'MJ15' => 'Unknown relation name : "%s"',								// SErrUnkownRelation
    			'MJ16' => 'Class "%s" does not support a unique key.',					// SErrNoAlternateKey
    			'MJ17' => '(%s) Cannot search unique key: unique key value is empty.',	// SErrNoAlternateKeyValue
    			'MJ18' => 'A %s resource with value "%s" for %s already exists.',		// SErrDuplicateKey
    			'MJ19' => 'Setting a value for property "%s" is not allowed',			// SErrCannotWriteProperty
    			'MJ20' => 'Setting a value for properties is not allowed',				// SErrCannotWriteProperties   			
    			// ContactMetadata
    			'CM01' => 'Property "%s" already exists',								// sERRCMPropertyAlreadyExists
    			'CM02' => 'Unknown namespace : %s',										// SERRCMUnknownNamespace
    			'CM03' => '"%s" is not a valid integer value for key %s',				// SERRCMNotAValidIntegerValueForKey
    			'CM04' => '"%s" is not a valid bool value for key %s',					// SERRCMNotAValidBoolValueForKey
    			'CM05' => '"%s" is not a valid float value for key %s',					// SERRCMNotAValidFloatValue
    			'CM06' => 'Length of value (%d bytes) exceeds maximum data length (%d bytes) ',	// SERRCMLengthOfValueExceedsMaxDataLength
    			'CM07' => 'Internal error: invalid data type %d',						// SERRCMInternalErrorInvalidDataType
    			'CM08' => '"%s" is not a valid datatype'								// SERRCMNotAValidDataType
    	); 	
    	
    	$response = array();
    	
    		// We expect here $this->_info['http_code']  to be >= 400   	
    	if ( isset($buffer->StatusCode) ) {
    		if( ( isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo) ) || ( isset($buffer->ErrorMessage) && !empty($buffer->ErrorMessage) ) )
    		{	
    			$comeFromString = false;
    			if( !empty( $buffer->ErrorInfo ) )
    			{  	
    				$info = json_decode( $buffer->ErrorInfo );
    				if( empty( $info) ) // message is type=string
    				{   	
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorInfo );
    				}else{   					
    					$errInfos =  $info;
    				}
    			}else{  // ( !empty( $buffer->ErrorMessage ) )
    				$info = json_decode( $buffer->ErrorMessage );
    				if( empty( $info ) ) // message is type=string
    				{
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorMessage );
    				}else{   					
    					$errInfos = $info;
    				}
    			}	
    			/**
    			*  Default response. Most of the ErrorInfo/ErrorMessage will come as they are - without specific err code in front!
    			*  We keep the ExtraErrors = ErrorInfo/ErrorMessage. 
    			*  
    			*  In the feature all the responses will consist these special codes.
    			*  When this happen (!!! ToDo !!!) -> we have to override coming StatusCode and ErrorInfo with parsed error results. And remove this ExtraError from the buffer
    			*  $internalErrors array and preg_match -> should be removed. We should catch the first 4 symbols from the string (this will be StatusCode), 
    			*  all the remaining string will be ErrorInfo 
    			*/  			   			 			 			    			
    			$errCodes = array_keys( $internalErrors );   			
    			$regexp = '/^(' . implode( '|',array_values( $errCodes ) ).')/i';   
    			foreach( $errInfos as $errInfoObj )
    			{    
    				foreach( $errInfoObj as $key => $errInfo )	
    				{			
	    				$tempResp = array();
	    				$tempResp["ExtraErrCode"] = $buffer->StatusCode;
	    				$tempResp["ExtraErrKey"] = "";
	    				$tempResp["ExtraErrMsg"] = $errInfo;
	    				
	    				preg_match($regexp, $errInfo, $matches);   	
	    				if( !empty( $matches ))
	    				{
	    					$tempResp["ExtraErrCode"] = $matches[1];
	    					if( $comeFromString )
	    						$tempResp["ExtraErrKey"] = '';
	    					else 
	    						$tempResp["ExtraErrKey"] = $key;
	    					$tempResp["ExtraErrMsg"] = $internalErrors[$matches[1]];
	    				}
	    				$response[] = $tempResp ;
    				}
    			}   			 			   			
    		}
    	}
    		// Check if is $response empty !    
    	if( empty( $response ) )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    	}	
    	
    	$buffer->ExtraError = $response ;
    	$buffer = json_encode( $buffer );
    }

}api/mailjet-api-v1.php000060400000014414152456276260010565 0ustar00<?php

/**
 * Mailjet Public API
 *
 * @package		API v0.1
 * @author		Mailjet
 * @link		http://api.mailjet.com/
 *
 */

class Mailjet_Api_V1
{
	var $version = '0.1';

	// Choose your weapon : php, json, xml, serialize, html, csv
	var $output = 'json';

	// Connect thru https protocol
	var $secure = false;

	// Mode debug ? 0 none / 1 errors only / 2 all
	var $debug = 0;
	
	// Edit with your Mailjet Infos
	var $apiKey = '';
	var $secretKey = '';

	// Constructor function
	public function __construct($apiKey = false, $secretKey = false)
	{
		if ($apiKey)
			$this->apiKey = $apiKey;
		if ($secretKey)
			$this->secretKey = $secretKey;

		$this->apiUrl = (($this->secure) ? 'https' : 'http') . '://api.mailjet.com/' . $this->version . '';
	}

	public function __call($method, $args)
	{
		// params
		$params = (sizeof($args) > 0) ? $args[0] : array();

		// request method
		$request = isset($params["method"]) ? strtoupper($params["method"]) : 'GET';

		// unset useless params
		if (isset($params["method"]))
			unset($params["method"]);

		// Make request
		$result = $this->sendRequest($method, $params, $request);

		// Return result
		$return = ($result === true) ? $this->_response : false;

		if ($this->debug == 2 || ( $this->debug == 1 && $return == false))
			$this->debug();

		return $return;
	}

	public function requestUrlBuilder($method,$params=array(),$request)
	{
		$query_string = array('output' => 'output=' . $this->output);

		foreach ($params as $key => $value)
		{
			if ($request == 'GET' || in_array($key, array('apikey', 'output')))
				$query_string[$key] = $key . '=' . urlencode($value);
			if ($key == 'output')
				$this->output = $value;
		}

		$this->call_url = $this->apiUrl . '/' . $method . '/?' . join('&', $query_string);

		return $this->call_url;
	}

	public function sendRequest($method = false, $params = array(), $request = 'GET')
	{
		// Method
		$this->_method = $method;
		$this->_request = $request;

		// Build request URL
		$url = $this->requestUrlBuilder($method, $params, $request);

		if (!in_array('curl', get_loaded_extensions()))
			die('Error: You must have cURL extension enabled !');

		// Set up and execute the curl process
		$curl_handle = curl_init();
		curl_setopt($curl_handle, CURLOPT_URL, $url);
		curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($curl_handle, CURLOPT_USERPWD, $this->apiKey . ':' . $this->secretKey);
		curl_setopt($curl_handle, CURLOPT_VERBOSE, true);
		curl_setopt($curl_handle, CURLINFO_HEADER_OUT, true);
        curl_setopt($curl_handle, CURLOPT_USERAGENT, 'joomla-1.0');
    	

		$this->_request_post = false;
		if ($request == 'POST')
		{
			curl_setopt($curl_handle, CURLOPT_POST, count($params));
			curl_setopt($curl_handle, CURLOPT_POSTFIELDS, http_build_query($params));
			$this->_request_post = $params;
		}

		$buffer = curl_exec($curl_handle);

		if ($this->debug > 2)
		{
			$this->debug();
			// var_dump($buffer);
			// var_dump(curl_getinfo($curl_handle));
		}

		// Response code
		$this->_response_code = curl_getinfo($curl_handle, CURLINFO_HTTP_CODE);

		// Close curl process
		curl_close($curl_handle);

		// RESPONSE
		$this->_response = ($this->output == 'json') ? json_decode($buffer) : $buffer;

		return ($this->_response_code == 200) ? true : false;
	}

	public function debug()
	{
		echo '<style type="text/css">';
		echo '
		#debugger {width: 100%; font-family: arial;}
		#debugger table {padding: 0; margin: 0 0 20px; width: 100%; font-size: 11px; text-align: left;border-collapse: collapse;}
		#debugger th, #debugger td {padding: 2px 4px;}
		#debugger tr.h {background: #999; color: #fff;}
		#debugger tr.Success {background:#90c306; color: #fff;}
		#debugger tr.Error {background:#c30029 ; color: #fff;}
		#debugger tr.Not-modified {background:orange ; color: #fff;}
		#debugger th {width: 20%; vertical-align:top; padding-bottom: 8px;}

		';
		echo '</style>';

		echo '<div id="debugger">';

		if (isset($this->_response_code))
		{
			if ($this->_response_code == 200)
			{
				echo '<table>';
				echo '<tr class="Success"><th>Success</th><td></td></tr>';
				echo '<tr><th>Status code</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
					echo '<tr><th>Response</th><td><pre>' . utf8_decode(print_r($this->_response, 1)) . '</pre></td></tr>';

				echo '</table>';
			}
			elseif($this->_response_code == 304)
			{
				echo '<table>';
				echo '<tr class="Not-modified"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';
				echo '<tr><th>Message</th><td>Not Modified</td></tr>';
				echo '</table>';
			}
			else
			{
				echo '<table>';
				echo '<tr class="Error"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
				{
					if (is_array($this->_response) || is_object($this->_response))
						echo '<tr><th>Status</th><td><pre>' . print_r($this->_response, true) . '</pre></td></tr>';
					else
						echo '<tr><th>Status</th><td><pre>' . $this->_response . '</pre></td></tr>';
				}
			}
			echo '</table>';
		}

		$call_url = parse_url($this->call_url);

		echo '<table>';
		echo '<tr class="h"><th>API config</th><td></td></tr>';
		echo '<tr><th>Protocole</th><td>' . $call_url['scheme'] . '</td></tr>';
		echo '<tr><th>Host</th><td>' . $call_url['host'] . '</td></tr>';
		echo '<tr><th>Version</th><td>' . $this->version . '</td></tr>';
		echo '</table>';

		echo '<table>';
		echo '<tr class="h"><th>Call infos</th><td></td></tr>';
		echo '<tr><th>Method</th><td>' . $this->_method . '</td></tr>';
		echo '<tr><th>Request type</th><td>' . $this->_request . '</td></tr>';
		echo '<tr><th>Get Arguments</th><td>';

		$args = explode("&", $call_url['query']);
		foreach ($args as $arg)
		{
			$arg = explode('=', $arg);
			echo ''.$arg[0].' = <span style="color:#ff6e56;">' . $arg[1] . '</span><br/>';
		}

		echo '</td></tr>';

		if ($this->_request_post)
		{
			echo '<tr><th>Post Arguments</th><td>';

			foreach ($this->_request_post as $k => $v)
				echo $k.' = <span style="color:#ff6e56;">' . $v . '</span><br/>';

			echo '</td></tr>';
		}

		echo '<tr><th>Call url</th><td>' . $this->call_url . '</td></tr>';
		echo '</table>';
		echo '</div>';
	}
}Auth.php000060400000016030152456276260006171 0ustar00<?php

defined('_JEXEC') or die('Restricted access');
 
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */

class Auth
{

	/**
	 * 
	 * @var String
	 */
	private $_dbData;

	/**
	 * 
	 * @var String
	 */
	private $_apiKey;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiSecret;
	
	/**
	 * 
	 * @var String
	 */
	private $_token;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiUrl;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiVersion;

    /**
     *
     * @var Boolean
     */
    private $_enable = false;

    /**
     *
     * @var String
     */
    private $_testAddress = 'test@emailaddress';
	
	/**
	 * 
	 */
	public function __construct()
	{
		$this->_initData();
	}
	
	/**
	 * 
	 * @return Auth
	 */
	protected function _initData()
	{
		$this->_dbData = realpath(__DIR__.'/../db/data');
		touch($this->_dbData);
		
		$data = null;
		$content = trim(file_get_contents($this->_dbData));
		
		if ($content) {
			$data = json_decode($content);
		}

		if (!$data) {
			$this->saveData();
		}

		if (isset($data->apiKey) && $data->apiKey) {
			$this->setApiKey($data->apiKey);
		}

		if (isset($data->apiSecret) && $data->apiSecret) {
			$this->setApiSecret($data->apiSecret);
		}

		if (isset($data->token) && $data->token) {
			$this->setToken($data->token);
		}
		
		if (isset($data->apiUrl) && $data->apiUrl) {
			$this->setApiUrl($data->apiUrl);
		}
		
		if (isset($data->apiVersion) && $data->apiVersion) {
			$this->setApiVersion($data->apiVersion);
		}

        if(!empty($data->enable)) {
            $this->setEnable($data->enable);
        }

        if(!empty($data->test_address)) {
            $this->setTestAddress($data->test_address);
        }
		
		return $this;
	}

	/**
	 * 
	 * @return Auth
	 */
	public function saveData()
	{
		$data = array(
			'apiKey'		=> $this->getApiKey(),
			'apiSecret'		=> $this->getApiSecret(),
			'token'			=> $this->getToken(),
			'apiUrl'		=> $this->getApiUrl(),
			'apiVersion'	=> $this->getApiVersion(),
            'enable'        => $this->getEnable(),
            'test_address'  => $this->getTestAddress()
		);
			
		file_put_contents($this->_dbData, json_encode($data));

		$mailjetConfig = realpath(__DIR__.'/../../config.php');
        $dataConf = '<?php
class JMailjetConfig {
	public $bak_mailer = "smtp";
	public $bak_smtpauth = "1";
	public $bak_smtpuser = "your API key";
	public $bak_smtppass = "your API secret";
	public $bak_smtphost = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $bak_smtpsecure = "tls";
	public $bak_smtpport = "587";
	public $test = "";
	public $test_address = "'.$this->getTestAddress().'";
	public $enable = "'.$this->getEnable().'";
	public $username = "'.(($this->getApiKey())?$this->getApiKey():"your API key").'";
	public $password = "'.(($this->getApiSecret())?$this->getApiSecret():"your API secret").'";
	public $host = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $secure = "tls";
	public $port = "587";
}';
        file_put_contents($mailjetConfig, $dataConf);
		
		return $this;
	}
	
	/**
	 * 
	 * @return Auth
	 */
	public function deleteData()
	{
		$content = trim(file_get_contents($this->_dbData));
		$data = array(
			'apiKey'		=> null,
			'apiSecret'		=> null,
			'token'			=> null,
			'apiUrl'		=> null,
			'apiVersion'	=> null,
            'enable'        => null,
            'test_address'  => null,
		);

		file_put_contents($this->_dbData, json_encode($data));

		$this->_apiKey = null;
		$this->_apiSecret = null;
		$this->_token = null;
		$this->_apiUrl = null;
		$this->_apiVersion = null;
        $this->_enable = null;
        $this->_testAddress = null;
		
		return $this;
	}
	
	/**
	 * 
	 * @param String $apiKey
	 * @return Auth
	 */
	public function setApiKey($apiKey)
	{
		$this->_apiKey = $apiKey;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiKey()
	{
		return $this->_apiKey;
	}
	
	/**
	 * 
	 * @param String $apiSecret
	 * @return Auth
	 */
	public function setApiSecret($apiSecret)
	{
		$this->_apiSecret = $apiSecret;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiSecret()
	{
		return $this->_apiSecret;
	}
	
	/**
	 * 
	 * @param String $token
	 * @return Auth
	 */
	public function setToken($token)
	{
		$this->_token = $token;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getToken()
	{
		if (($this->_token == NULL || strlen($this->_token) == 0) && $this->getApiKey() && $this->getApiSecret())
			$this->generateToken();
		return $this->_token;
	}

    /**
     *
     * @return Boolean
     */
    public function getEnable()
    {
        return $this->_enable;
    }

    /**
     *
     * @param Boolean
     * @return Boolean
     */
    public function setEnable($val)
    {
        return $this->_enable = $val;
    }

    /**
     *
     * @return String
     */
    public function getTestAddress()
    {
        return $this->_testAddress;
    }

    /**
     *
     * @param String
     * @return String
     */
    public function setTestAddress($val)
    {
        return $this->_testAddress = $val;
    }
	
	/**
	 * 
	 * @param String $apiUrl
	 * @return Auth
	 */
	public function setApiUrl($apiUrl)
	{
		$this->_apiUrl = $apiUrl;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiUrl()
	{
		return $this->_apiUrl;
	}
	
	/**
	 * 
	 * @param String $apiVersion
	 * @return Auth
	 */
	public function setApiVersion($apiVersion)
	{
		$this->_apiVersion = $apiVersion;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiVersion()
	{
		return $this->_apiVersion;
	}

	/**
	 * 
	 * @return boolean
	 */
	public function haveToken()
	{		
		return (boolean) $this->getToken();
	}
	
	/**
	 * 
	 * @return boolean
	 */
	public function canGenerateToken()
	{
		return $this->getApiKey() && $this->getApiSecret();
	}

	/**
	 * 
	 * @return boolean
	 */
	public function generateToken()
	{	
		if (!$this->canGenerateToken()) {
			return false;
		}
			
		$mj = new Mailjet_Api($this->getApiKey(), $this->getApiSecret());
		$this->setApiUrl($mj->apiUrl);
		$this->setApiVersion($mj->version);

		$response = $mj->getAuthToken(array(
			'APIKey'		=> $this->getApiKey(),
			'SecretKey'	 	=> $this->getApiSecret()
		));
		
		// Log the response
		$this->_log($mj);
		
		// Check if the response is correct
		if (!isset($response->Status) || (isset($response->Status) && $response->Status != 'ERROR')) {
			$this->setToken($response);
			$this->saveData();
		}
		
		return true;
	}

	public function __destruct()
	{
		$this->saveData();
	}
	
	private function _log($response)
	{
		$log = realpath(__DIR__.'/../tmp/log');
		
		touch($log);
		
		$delimiter = str_repeat('=', 100);
		
		$content = file_get_contents($log);
		
		$prepend = '';
		
		$prepend .= $delimiter;
		$prepend .= PHP_EOL;
		$prepend .= date('Y-m-d H:i:s');
		$prepend .= PHP_EOL;
		$prepend .= 'RESPONSE';
		$prepend .= PHP_EOL;
		$prepend .= print_r($response, true);
		$prepend .= PHP_EOL;

		
		$content = $prepend.$content;
		file_put_contents($log, $content);
	}
	
}

?>