(this.nativeLog||function(e){console.log(e)})("Start JS Framework 0.29.7, Build at 2019-06-10 17:34. (Vue: 2.5.16-weex.5, Rax: 0.4.20)");var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";var t,c,r,l;function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e,t){return e(t={exports:{}},t.exports),t.exports}Array.from||(Array.from=(t=Object.prototype.toString,c=function(e){return"function"==typeof e||"[object Function]"===t.call(e)},r=Math.pow(2,53)-1,l=function(e){var t,n=(t=Number(e),isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t);return Math.min(Math.max(n,0),r)},function(e){var t=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var n,r=1<arguments.length?arguments[1]:void 0;if(void 0!==r){if(!c(r))throw new TypeError("Array.from: when provided, the second argument must be a function");2<arguments.length&&(n=arguments[2])}for(var o,i=l(t.length),a=c(this)?Object(new this(i)):new Array(i),s=0;s<i;)o=t[s],a[s]=r?void 0===n?r(o,s):r.call(n,o,s):o,s+=1;return a.length=i,a}));var v=n(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),m=n(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),o=(m.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),y=function(e){if(!o(e))throw TypeError(e+" is not an object!");return e},i=function(e){try{return!!e()}catch(e){return!0}},a=!i(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),s=v.document,u=o(s)&&o(s.createElement),f=function(e){return u?s.createElement(e):{}},p=!a&&!i(function(){return 7!=Object.defineProperty(f("div"),"a",{get:function(){return 7}}).a}),d=Object.defineProperty,h={f:a?Object.defineProperty:function(e,t,n){if(y(e),t=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}(t,!0),y(n),p)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},k=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},S=a?function(e,t,n){return h.f(e,t,k(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},b=0,w=Math.random(),O=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},C=n(function(e){var i=O("src"),t="toString",n=Function[t],a=(""+n).split(t);m.inspectSource=function(e){return n.call(e)},(e.exports=function(e,t,n,r){var o="function"==typeof n;o&&(_(n,"name")||S(n,"name",t)),e[t]!==n&&(o&&(_(n,i)||S(n,i,e[t]?""+e[t]:a.join(String(t)))),e===v?e[t]=n:r?e[t]?e[t]=n:S(e,t,n):(delete e[t],S(e,t,n)))})(Function.prototype,t,function(){return"function"==typeof this&&this[i]||n.call(this)})}),x=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(r,o,e){if(x(r),void 0===o)return r;switch(e){case 1:return function(e){return r.call(o,e)};case 2:return function(e,t){return r.call(o,e,t)};case 3:return function(e,t,n){return r.call(o,e,t,n)}}return function(){return r.apply(o,arguments)}},$="prototype",A=function(e,t,n){var r,o,i,a,s=e&A.F,c=e&A.G,l=e&A.S,u=e&A.P,f=e&A.B,p=c?v:l?v[t]||(v[t]={}):(v[t]||{})[$],d=c?m:m[t]||(m[t]={}),h=d[$]||(d[$]={});for(r in c&&(n=t),n)i=((o=!s&&p&&void 0!==p[r])?p:n)[r],a=f&&o?E(i,v):u&&"function"==typeof i?E(Function.call,i):i,p&&C(p,r,i,e&A.U),d[r]!=i&&S(d,r,a),u&&h[r]!=i&&(h[r]=i)};v.core=m,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;var j,I=A,M={}.toString,T=function(e){return M.call(e).slice(8,-1)},P=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==T(e)?e.split(""):Object(e)},F=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e},N=function(e){return P(F(e))},R=Math.ceil,D=Math.floor,V=function(e){return isNaN(e=+e)?0:(0<e?D:R)(e)},L=Math.min,J=function(e){return 0<e?L(V(e),9007199254740991):0},W=Math.max,q=Math.min,B=n(function(e){var t="__core-js_shared__",n=v[t]||(v[t]={});(e.exports=function(e,t){return n[e]||(n[e]=void 0!==t?t:{})})("versions",[]).push({version:m.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),U=B("keys"),z=function(e){return U[e]||(U[e]=O(e))},H=(j=!1,function(e,t,n){var r,o,i,a=N(e),s=J(a.length),c=(o=s,(r=V(r=n))<0?W(r+o,0):q(r,o));if(j&&t!=t){for(;c<s;)if((i=a[c++])!=i)return!0}else for(;c<s;c++)if((j||c in a)&&a[c]===t)return j||c||0;return!j&&-1}),G=z("IE_PROTO"),X="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),K=Object.keys||function(e){return function(e,t){var n,r=N(e),o=0,i=[];for(n in r)n!=G&&_(r,n)&&i.push(n);for(;t.length>o;)_(r,n=t[o++])&&(~H(i,n)||i.push(n));return i}(e,X)},Z={f:Object.getOwnPropertySymbols},Y={f:{}.propertyIsEnumerable},Q=function(e){return Object(F(e))},ee=Object.assign,te=!ee||i(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=ee({},e)[n]||Object.keys(ee({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Q(e),o=arguments.length,i=1,a=Z.f,s=Y.f;i<o;)for(var c,l=P(n[i++]),u=a?K(l).concat(a(l)):K(l),f=u.length,p=0;p<f;)s.call(l,c=u[p++])&&(r[c]=l[c]);return r}:ee;I(I.S+I.F,"Object",{assign:te});m.Object.assign;Object.setPrototypeOf||(Object.setPrototypeOf=function(t,n){var r;function o(e,t){return r.call(e,t),e}try{(r=t.getOwnPropertyDescriptor(t.prototype,n).set).call({},null)}catch(e){if(t.prototype!=={}[n])return;r=function(e){this[n]=e},o.polyfill=o(o({},null),t.prototype)instanceof t}return o}(Object,"__proto__"));var ne=global.WXEnvironment;void 0===ne||"iOS"!==ne.platform&&"android"!==ne.platform||ne.__enable_native_promise__||(global.Promise=void 0);var re=n(function(e){var t=B("wks"),n=v.Symbol,r="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=r&&n[e]||(r?n:O)("Symbol."+e))}).store=t}),oe=re("toStringTag"),ie="Arguments"==T(function(){return arguments}()),ae=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),oe))?n:ie?T(t):"Object"==(r=T(t))&&"function"==typeof t.callee?"Arguments":r},se={};se[re("toStringTag")]="z",se+""!="[object z]"&&C(Object.prototype,"toString",function(){return"[object "+ae(this)+"]"},!0);var ce={},le=a?Object.defineProperties:function(e,t){y(e);for(var n,r=K(t),o=r.length,i=0;i<o;)h.f(e,n=r[i++],t[n]);return e},ue=v.document,fe=ue&&ue.documentElement,pe=z("IE_PROTO"),de=function(){},he="prototype",ve=function(){var e,t=f("iframe"),n=X.length;for(t.style.display="none",fe.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),ve=e.F;n--;)delete ve[he][X[n]];return ve()},me=Object.create||function(e,t){var n;return null!==e?(de[he]=y(e),n=new de,de[he]=null,n[pe]=e):n=ve(),void 0===t?n:le(n,t)},ye=h.f,ge=re("toStringTag"),_e=function(e,t,n){e&&!_(e=n?e:e.prototype,ge)&&ye(e,ge,{configurable:!0,value:t})},be={};S(be,re("iterator"),function(){return this});var we,ke=z("IE_PROTO"),Se=Object.prototype,Oe=Object.getPrototypeOf||function(e){return e=Q(e),_(e,ke)?e[ke]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Se:null},Ce=re("iterator"),xe=!([].keys&&"next"in[].keys()),Ee="values",$e=function(){return this},Ae=function(e,t,n,r,o,i,a){var s,c,l;c=t,l=r,(s=n).prototype=me(be,{next:k(1,l)}),_e(s,c+" Iterator");var u,f,p,d=function(e){if(!xe&&e in y)return y[e];switch(e){case"keys":case Ee:return function(){return new n(this,e)}}return function(){return new n(this,e)}},h=t+" Iterator",v=o==Ee,m=!1,y=e.prototype,g=y[Ce]||y["@@iterator"]||o&&y[o],_=g||d(o),b=o?v?d("entries"):_:void 0,w="Array"==t&&y.entries||g;if(w&&(p=Oe(w.call(new e)))!==Object.prototype&&p.next&&(_e(p,h,!0),"function"!=typeof p[Ce]&&S(p,Ce,$e)),v&&g&&g.name!==Ee&&(m=!0,_=function(){return g.call(this)}),(xe||m||!y[Ce])&&S(y,Ce,_),ce[t]=_,ce[h]=$e,o)if(u={values:v?_:d(Ee),keys:i?_:d("keys"),entries:b},a)for(f in u)f in y||C(y,f,u[f]);else I(I.P+I.F*(xe||m),t,u);return u},je=(we=!0,function(e,t){var n,r,o=String(F(e)),i=V(t),a=o.length;return i<0||a<=i?we?"":void 0:(n=o.charCodeAt(i))<55296||56319<n||i+1===a||(r=o.charCodeAt(i+1))<56320||57343<r?we?o.charAt(i):n:we?o.slice(i,i+2):r-56320+(n-55296<<10)+65536});Ae(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=je(t,n),this._i+=e.length,{value:e,done:!1})});var Ie=re("unscopables"),Me=Array.prototype;null==Me[Ie]&&S(Me,Ie,{});var Te=function(e){Me[Ie][e]=!0},Pe=function(e,t){return{value:t,done:!!e}},Fe=Ae(Array,"Array",function(e,t){this._t=N(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Pe(1)):Pe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");ce.Arguments=ce.Array,Te("keys"),Te("values"),Te("entries");for(var Ne=re("iterator"),Re=re("toStringTag"),De=ce.Array,Ve={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Le=K(Ve),Je=0;Je<Le.length;Je++){var We,qe=Le[Je],Be=Ve[qe],Ue=v[qe],ze=Ue&&Ue.prototype;if(ze&&(ze[Ne]||S(ze,Ne,De),ze[Re]||S(ze,Re,qe),ce[qe]=De,Be))for(We in Fe)ze[We]||C(ze,We,Fe[We],!0)}var He,Ge,Xe,Ke=function(t,e,n,r){try{return r?e(y(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&y(o.call(t)),e}},Ze=re("iterator"),Ye=Array.prototype,Qe=re("iterator"),et=m.getIteratorMethod=function(e){if(null!=e)return e[Qe]||e["@@iterator"]||ce[ae(e)]},tt=n(function(e){var d={},h={},t=e.exports=function(e,t,n,r,o){var i,a,s,c,l,u=o?function(){return e}:et(e),f=E(n,r,t?2:1),p=0;if("function"!=typeof u)throw TypeError(e+" is not iterable!");if(void 0===(l=u)||ce.Array!==l&&Ye[Ze]!==l){for(s=u.call(e);!(a=s.next()).done;)if((c=Ke(s,f,a.value,t))===d||c===h)return c}else for(i=J(e.length);p<i;p++)if((c=t?f(y(a=e[p])[0],a[1]):f(e[p]))===d||c===h)return c};t.BREAK=d,t.RETURN=h}),nt=re("species"),rt=v.process,ot=v.setImmediate,it=v.clearImmediate,at=v.MessageChannel,st=v.Dispatch,ct=0,lt={},ut="onreadystatechange",ft=function(){var e=+this;if(lt.hasOwnProperty(e)){var t=lt[e];delete lt[e],t()}},pt=function(e){ft.call(e.data)};ot&&it||(ot=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return lt[++ct]=function(){!function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}e.apply(n,t)}("function"==typeof e?e:Function(e),n)},He(ct),ct},it=function(e){delete lt[e]},"process"==T(rt)?He=function(e){rt.nextTick(E(ft,e,1))}:st&&st.now?He=function(e){st.now(E(ft,e,1))}:at?(Xe=(Ge=new at).port2,Ge.port1.onmessage=pt,He=E(Xe.postMessage,Xe,1)):v.addEventListener&&"function"==typeof postMessage&&!v.importScripts?(He=function(e){v.postMessage(e+"","*")},v.addEventListener("message",pt,!1)):He=ut in f("script")?function(e){fe.appendChild(f("script"))[ut]=function(){fe.removeChild(this),ft.call(e)}}:function(e){setTimeout(E(ft,e,1),0)});var dt={set:ot,clear:it},ht=dt.set,vt=v.MutationObserver||v.WebKitMutationObserver,mt=v.process,yt=v.Promise,gt="process"==T(mt);function _t(e){var n,r;this.promise=new e(function(e,t){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=e,r=t}),this.resolve=x(n),this.reject=x(r)}var bt={f:function(e){return new _t(e)}},wt=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},kt=v.navigator,St=kt&&kt.userAgent||"",Ot=re("species"),Ct=re("iterator"),xt=!1;try{[7][Ct]().return=function(){xt=!0}}catch(e){}var Et,$t,At,jt,It,Mt=dt.set,Tt=function(){var n,r,o,e=function(){var e,t;for(gt&&(e=mt.domain)&&e.exit();n;){t=n.fn,n=n.next;try{t()}catch(e){throw n?o():r=void 0,e}}r=void 0,e&&e.enter()};if(gt)o=function(){mt.nextTick(e)};else if(!vt||v.navigator&&v.navigator.standalone)if(yt&&yt.resolve){var t=yt.resolve(void 0);o=function(){t.then(e)}}else o=function(){ht.call(v,e)};else{var i=!0,a=document.createTextNode("");new vt(e).observe(a,{characterData:!0}),o=function(){a.data=i=!i}}return function(e){var t={fn:e,next:void 0};r&&(r.next=t),n||(n=t,o()),r=t}}(),Pt="Promise",Ft=v.TypeError,Nt=v.process,Rt=Nt&&Nt.versions,Dt=Rt&&Rt.v8||"",Vt=v[Pt],Lt="process"==ae(Nt),Jt=function(){},Wt=$t=bt.f,qt=!!function(){try{var e=Vt.resolve(1),t=(e.constructor={})[re("species")]=function(e){e(Jt,Jt)};return(Lt||"function"==typeof PromiseRejectionEvent)&&e.then(Jt)instanceof t&&0!==Dt.indexOf("6.6")&&-1===St.indexOf("Chrome/66")}catch(e){}}(),Bt=function(e){var t;return!(!o(e)||"function"!=typeof(t=e.then))&&t},Ut=function(u,n){if(!u._n){u._n=!0;var r=u._c;Tt(function(){for(var c=u._v,l=1==u._s,e=0,t=function(e){var t,n,r,o=l?e.ok:e.fail,i=e.resolve,a=e.reject,s=e.domain;try{o?(l||(2==u._h&&Gt(u),u._h=1),!0===o?t=c:(s&&s.enter(),t=o(c),s&&(s.exit(),r=!0)),t===e.promise?a(Ft("Promise-chain cycle")):(n=Bt(t))?n.call(t,i,a):i(t)):a(c)}catch(e){s&&!r&&s.exit(),a(e)}};r.length>e;)t(r[e++]);u._c=[],u._n=!1,n&&!u._h&&zt(u)})}},zt=function(i){Mt.call(v,function(){var e,t,n,r=i._v,o=Ht(i);if(o&&(e=wt(function(){Lt?Nt.emit("unhandledRejection",r,i):(t=v.onunhandledrejection)?t({promise:i,reason:r}):(n=v.console)&&n.error&&n.error("Unhandled promise rejection",r)}),i._h=Lt||Ht(i)?2:1),i._a=void 0,o&&e.e)throw e.v})},Ht=function(e){return 1!==e._h&&0===(e._a||e._c).length},Gt=function(t){Mt.call(v,function(){var e;Lt?Nt.emit("rejectionHandled",t):(e=v.onrejectionhandled)&&e({promise:t,reason:t._v})})},Xt=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Ut(t,!0))},Kt=function(e){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw Ft("Promise can't be resolved itself");(n=Bt(e))?Tt(function(){var t={_w:r,_d:!1};try{n.call(e,E(Kt,t,1),E(Xt,t,1))}catch(e){Xt.call(t,e)}}):(r._v=e,r._s=1,Ut(r,!1))}catch(e){Xt.call({_w:r,_d:!1},e)}}};qt||(Vt=function(e){!function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!")}(this,Vt,Pt,"_h"),x(e),Et.call(this);try{e(E(Kt,this,1),E(Xt,this,1))}catch(e){Xt.call(this,e)}},(Et=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=function(e,t,n){for(var r in t)C(e,r,t[r],n);return e}(Vt.prototype,{then:function(e,t){var n,r,o,i=Wt((n=Vt,void 0===(o=y(this).constructor)||null==(r=y(o)[nt])?n:x(r)));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=Lt?Nt.domain:void 0,this._c.push(i),this._a&&this._a.push(i),this._s&&Ut(this,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),At=function(){var e=new Et;this.promise=e,this.resolve=E(Kt,e,1),this.reject=E(Xt,e,1)},bt.f=Wt=function(e){return e===Vt||e===jt?new At(e):$t(e)}),I(I.G+I.W+I.F*!qt,{Promise:Vt}),_e(Vt,Pt),It=v[Pt],a&&It&&!It[Ot]&&h.f(It,Ot,{configurable:!0,get:function(){return this}}),jt=m[Pt],I(I.S+I.F*!qt,Pt,{reject:function(e){var t=Wt(this);return(0,t.reject)(e),t.promise}}),I(I.S+I.F*!qt,Pt,{resolve:function(e){return function(e,t){if(y(e),o(t)&&t.constructor===e)return t;var n=bt.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),I(I.S+I.F*!(qt&&function(e,t){if(!t&&!xt)return!1;var n=!1;try{var r=[7],o=r[Ct]();o.next=function(){return{done:n=!0}},r[Ct]=function(){return o},e(r)}catch(e){}return n}(function(e){Vt.all(e).catch(Jt)})),Pt,{all:function(e){var a=this,t=Wt(a),s=t.resolve,c=t.reject,n=wt(function(){var r=[],o=0,i=1;tt(e,!1,function(e){var t=o++,n=!1;r.push(void 0),i++,a.resolve(e).then(function(e){n||(n=!0,r[t]=e,--i||s(r))},c)}),--i||s(r)});return n.e&&c(n.v),t.promise},race:function(e){var t=this,n=Wt(t),r=n.reject,o=wt(function(){tt(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Zt=1;function Yt(){return(Zt++).toString()}function Qt(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function en(e){return"[object Object]"===Object.prototype.toString.call(e)}function tn(e){if("function"!=typeof btoa)return"";var t=Array.prototype.map.call(new Uint8Array(e),function(e){return String.fromCharCode(e)}).join("");return btoa(t)}function nn(e){if(!e||"object"!=typeof e)return!0;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}var rn=["off","error","warn","info","log","debug"],on={};function an(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return on[t]&&on[t][e]}function sn(e){global.nativeLog("wxInteractionAnalyzer: [jsfm]"+e,"__DEBUG")}global.console;function cn(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}global.setTimeout;var ln=global.setTimeoutNative;function un(t,n,r){if(t.hasOwnProperty(n)){var e=t[n];Object.defineProperty(t,n,{get:function(){return e},set:function(e){if(this===t)throw Error("Cannot assign to read only property "+n+" of "+r);return Object.defineProperty(this,n,{value:e,writable:!0}),e}})}}!function(){if(void 0===setTimeout&&"function"==typeof ln){var n={},r=0;global.setTimeout=function(e,t){n[++r]=e,ln(r.toString(),t)},global.setTimeoutCallback=function(e){"function"==typeof n[e]&&(n[e](),delete n[e])}}}(),"undefined"==typeof WXEnvironment||WXEnvironment.__enable_native_promise__,function(){if(rn.forEach(function(t){var n=rn.indexOf(t);on[t]={},rn.forEach(function(e){rn.indexOf(e)<=n&&(on[t][e]=!0)})}),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("debug")&&global.nativeLog.apply(global,cn(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("log")&&global.nativeLog.apply(global,cn(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("info")&&global.nativeLog.apply(global,cn(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("warn")&&global.nativeLog.apply(global,cn(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("error")&&global.nativeLog.apply(global,cn(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,o=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:o},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("error")&&console.__ori__.error.apply(console,e)}}}();var fn={framework:"0.29.7",transformer:">=0.1.5 <0.5"};function pn(e,t,n){return t+"@"+n+"#"+e}var dn=function(e){this.instanceId=String(e),this.lastCallbackId=0,this.callbacks={},this.hooks={}};dn.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},dn.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},dn.prototype.registerHook=function(e,t,n,r){var o=pn(e,t,n);this.hooks[o]&&console.warn('[JS Framework] Override an existing component hook "'+o+'".'),this.hooks[o]=r},dn.prototype.triggerHook=function(e,t,n,r){var o=pn(e,t,n),i=this.hooks[o];if("function"!=typeof i)return console.error("[JS Framework] Invalid hook function type ("+typeof i+') on "'+o+'".'),null;var a=null;try{a=i.apply(null,r||[])}catch(e){throw console.error('[JS Framework] Failed to execute the hook function on "'+o+'".'),e}return a},dn.prototype.consume=function(e,t,n){var r=this.callbacks[e];if(void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r)try{return r.call(null,t)}catch(e){throw console.error("[JS Framework] Failed to execute the callback function:\n "+e.toString()),e}return new Error('invalid callback id "'+e+'"')},dn.prototype.close=function(){this.callbacks={},this.hooks={}};var hn={};function vn(e){return hn[e]}function mn(e){var t=hn[e];return t&&t.taskCenter?t.taskCenter:null}function yn(e,t,n){var r=e.documentElement;if(!(0<r.pureChildren.length||t.parentNode)){var o,i,a=r.children,s=a.indexOf(n);s<0?a.push(t):a.splice(s,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,_n(t,r)):(t.children.forEach(function(e){e.parentNode=t}),gn(e,t),t.docId=e.id,t.ownerDocument=e,_n(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),o=e,i=t.toJSON(),o&&o.taskCenter&&"function"==typeof o.taskCenter.send&&o.taskCenter.send("dom",{action:"createBody"},[i])):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function gn(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function _n(t,e){(t.parentNode=e).docId&&(t.docId=e.docId,t.ownerDocument=e.ownerDocument,(t.ownerDocument.nodeMap[t.nodeId]=t).depth=e.depth+1),t.children.forEach(function(e){_n(e,t)})}function bn(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function wn(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function kn(e,t,n,r){n<0&&(n=0);var o=t[n-1],i=t[n];return t.splice(n,0,e),r&&(o&&(o.nextSibling=e),e.previousSibling=o,(e.nextSibling=i)&&(i.previousSibling=e)),n}function Sn(e,t,n,r){var o=t.indexOf(e);if(o<0)return-1;if(r){var i=t[o-1],a=t[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}t.splice(o,1);var s=n;o<=n&&(s=n-1);var c=t[s-1],l=t[s];return t.splice(s,0,e),r&&(c&&(c.nextSibling=e),e.previousSibling=c,(e.nextSibling=l)&&(l.previousSibling=e)),o===s?-1:n}function On(e,t,n){var r=t.indexOf(e);if(!(r<0)){if(n){var o=t[r-1],i=t[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}t.splice(r,1)}}var Cn,xn=function(){this.nodeId=Yt(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};xn.prototype.destroy=function(){var e=vn(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var En={};var $n=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"];function An(e,t){vn(e).nodeMap[t.nodeId]=t}var jn=function(o){function e(e,t,n){void 0===e&&(e="div"),o.call(this);var r=En[e];if(r&&!n)return new r(e,t,!0);t=t||{},this.nodeType=1,this.nodeId=Yt(),this.ref=this.nodeId,this.type=e,this.attr=t.attr||{},this.style=t.style||{},this.classStyle=t.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return o&&(e.__proto__=o),((e.prototype=Object.create(o&&o.prototype)).constructor=e).prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(an("debug")&&sn("[appendChild]("+this.docId+","+e.type+","+e.ref+") Move <"+e.type+"> to "+this.children.length+" of <"+this.type+"> ("+this.ref+")."),Sn(e,this.children,this.children.length,!0),1===e.nodeType){var t=Sn(e,this.pureChildren,this.pureChildren.length),n=mn(this.docId);if(n&&0<=t)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(an("debug")&&sn("[appendChild]("+this.docId+","+e.type+","+e.ref+") Append <"+e.type+"> to <"+this.type+"> ("+this.ref+")."),_n(e,this),kn(e,this.children,this.children.length,!0),this.docId&&An(this.docId,e),1===e.nodeType){kn(e,this.pureChildren,this.pureChildren.length);var r=mn(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},e.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(Sn(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=bn(t),r=Sn(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=mn(this.docId);if(o&&0<=r)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(an("debug")&&sn("[insertBefore]("+this.docId+","+e.type+","+e.ref+") Insert <"+e.type+"> to <"+this.type+"> ("+this.ref+"), before ("+t.ref+")."),_n(e,this),kn(e,this.children,this.children.indexOf(t),!0),this.docId&&An(this.docId,e),1===e.nodeType){var i=bn(t),a=kn(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=mn(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},e.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(Sn(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=Sn(e,this.pureChildren,this.pureChildren.indexOf(wn(t))+1),r=mn(this.docId);if(r&&0<=n)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(an("debug")&&sn("[insertAfter]("+this.docId+","+e.type+","+e.ref+") Insert <"+e.type+"> to <"+this.type+"> ("+this.ref+"), after ("+t.ref+")."),_n(e,this),kn(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&An(this.docId,e),1===e.nodeType){var o=kn(e,this.pureChildren,this.pureChildren.indexOf(wn(t))+1),i=mn(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},e.prototype.removeChild=function(e,t){if(e.parentNode&&(On(e,this.children,!0),1===e.nodeType)){an("debug")&&sn("[removeChild]("+this.docId+","+e.type+","+e.ref+") Remove <"+e.type+"> from <"+this.type+"> ("+this.ref+")."),On(e,this.pureChildren);var n=mn(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},e.prototype.clear=function(){var t=mn(this.docId);t&&this.pureChildren.forEach(function(e){t.send("dom",{action:"removeElement"},[e.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},e.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=mn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},e.prototype.setAttrs=function(e,t){if(!nn(e)){var n={};for(var r in e)this.attr[r]!==e[r]&&(this.attr[r]=e[r],n[r]=e[r]);if(!nn(n)){var o=mn(this.docId);!t&&o&&o.send("dom",{action:"updateAttrs"},[this.ref,n])}}},e.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=mn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},e.prototype.setStyles=function(e,t){if(!nn(e)){var n={};for(var r in e)this.style[r]!==e[r]&&(this.style[r]=e[r],n[r]=e[r]);if(!nn(n)){var o=mn(this.docId);!t&&o&&o.send("dom",{action:"updateStyle"},[this.ref,n])}}},e.prototype.setClassStyle=function(e){for(var t in this.classStyle)this.classStyle[t]="";Object.assign(this.classStyle,e);var n=mn(this.docId);n&&n.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},e.prototype.addEvent=function(e,t,n){if(this.event||(this.event={}),!this.event[e]){an("debug")&&sn("[addEvent]("+this.docId+","+this.type+","+this.ref+') Add "'+e+'" event on <'+this.type+"> ("+this.ref+")."),this.event[e]={handler:t,params:n};var r=mn(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,e])}},e.prototype.removeEvent=function(e){if(this.event&&this.event[e]){an("debug")&&sn("[removeEvent]("+this.docId+","+this.type+","+this.ref+') Remove "'+e+'" event on <'+this.type+"> ("+this.ref+")."),delete this.event[e];var t=mn(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},e.prototype.fireEvent=function(t,e,n,r){var o=null,i=!1,a=this.event[t];if(a&&e){an("debug")&&sn("[fireEvent]("+this.docId+","+this.type+","+this.ref+') Fire "'+t+'" event on <'+this.type+"> ("+this.ref+").");var s=a.handler;e.stopPropagation=function(){i=!0};try{o=r&&r.params?s.call.apply(s,[this].concat(r.params,[e])):s.call(this,e)}catch(e){throw console.error('[JS Framework] Failed to invoke the event handler of "'+t+'" on '+this.type+" ("+this.ref+"):\n "+e.toString()),e}}return!i&&n&&-1!==$n.indexOf(t)&&this.parentNode&&this.parentNode.fireEvent&&(e.currentTarget=this.parentNode,this.parentNode.fireEvent(t,e,n)),o},e.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},e.prototype.toJSON=function(e){void 0===e&&(e=!1);var t={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},n=[];for(var r in this.event){var o=this.event[r].params;o?n.push({type:r,params:o}):n.push(r)}return n.length&&(t.event=n),!e&&this.pureChildren.length&&(t.children=this.pureChildren.map(function(e){return e.toJSON()})),t},e.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(e){return e.toString()}).join("")+"</"+this.type+">"},e}(xn);Cn=jn;var In=function(){},Mn=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:String(e)}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new dn(e)}),In=t||function(){}};function Tn(e,t){var n=vn(e);return n?Array.isArray(t)?t.map(function(e){switch(e.method){case"callback":return function(e,t,n,r){return e.taskCenter.callback(t,n,r)}.apply(void 0,[n].concat(e.args));case"fireEventSync":case"fireEvent":return function(e,t,n,r,o,i){var a=e.getRef(t);return a?e.fireEvent(a,n,r,o,i):r?(r._nodeId=t,e.fireEvent(e.getRef("_documentElement"),n,r,o,i)):void 0}.apply(void 0,[n].concat(e.args));case"componentHook":return function(e,t,n,r,o){if(!e||!e.taskCenter)return console.error('[JS Framework] Can\'t find "document" or "taskCenter".'),null;var i=null;try{i=e.taskCenter.triggerHook(t,n,r,o)}catch(e){throw console.error('[JS Framework] Failed to trigger the "'+n+"@"+r+'" hook on '+t+"."),e}return i}.apply(void 0,[n].concat(e.args))}}):void 0:new Error("[JS Framework] Failed to receiveTasks, instance ("+e+") is not available.")}Mn.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},Mn.prototype.registerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).registerHook.apply(e,t)},Mn.prototype.triggerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).triggerHook.apply(e,t)},Mn.prototype.updateData=function(e,t,n){this.send("module",{module:"dom",method:"updateComponentData"},[e,t,n])},Mn.prototype.destroyCallback=function(){return this.callbackManager.close()},Mn.prototype.normalize=function(e,t){var n=this;void 0===t&&(t=!1);var r=Qt(e);if(e&&e instanceof jn)return e.ref;if(e&&e._isVue&&e.$el instanceof jn)return e.$el.ref;if("Function"===r)return this.callbackManager.add(e).toString();if(t){if("Object"===r){var o={};for(var i in e)o[i]=n.normalize(e[i],!0);return o}if("Array"===r)return e.map(function(e){return n.normalize(e,!0)})}return e&&e.ref&&e["[[VirtualElement]]"]?e.ref:function(e){var t=Qt(e);switch(t){case"Undefined":case"Null":return"";case"RegExp":return e.toString();case"Date":return e.toISOString();case"Number":case"String":case"Boolean":case"Array":case"Object":return e;case"ArrayBuffer":return{"@type":"binary",dataType:t,base64:tn(e)};case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":return{"@type":"binary",dataType:t,base64:tn(e.buffer)};default:return JSON.stringify(e)}}(e)},Mn.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,c=t.module,l=t.method;switch(n=n.map(function(e){return o.normalize(e)}),"Object"===Qt(r)&&(r=this.normalize(r,!0)),e){case"dom":return an("debug")&&sn("[task]("+this.instanceId+","+this.type+","+i+") "+JSON.stringify(n)),this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,l,n,Object.assign({component:a},r));default:return an("debug")&&sn("[task]("+this.instanceId+","+c+","+l+") "+JSON.stringify(n)),this.moduleHandler(this.instanceId,c,l,n,r)}},Mn.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},Mn.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},Mn.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};var Pn={};function Fn(r){void 0===r&&(r={});var e=function(t){var e,n;n=t,en(e=Pn)&&Object.prototype.hasOwnProperty.call(e,n)||(Pn[t]={}),Array.isArray(r[t])&&r[t].forEach(function(e){"string"==typeof e?Pn[t][e]=!0:en(e)&&"string"==typeof e.name&&(Pn[t][e.name]=e.args||[])})};for(var t in r)e(t)}function Nn(e,t){return"string"==typeof t?!(!Pn[e]||!Pn[e][t]):!!Pn[e]}var Rn={};function Dn(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Rn[e]=!0:en(e)&&"string"==typeof e.type&&function(o,e){if(Array.isArray(e)&&e.length){var t=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t}(Cn);e.forEach(function(r){t.prototype[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=mn(this.docId);if(n)return n.send("component",{ref:this.ref,component:o,method:r},e)}}),En[o]=t}}((Rn[e.type]=e).type,e.methods))})}function Vn(e){return!!Rn[e]}var Ln=[];function Jn(e,t){qn(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Ln.push({name:e,options:t}))}function Wn(n){Ln.some(function(e,t){if(e.name===n)return Ln.splice(t,1),!0})}function qn(e){return t=e,0<=Ln.map(function(e){return e.name}).indexOf(t);var t}var Bn=function(t){function e(e){t.call(this),this.nodeType=8,this.nodeId=Yt(),this.ref=this.nodeId,this.type="comment",this.value=e,this.children=[],this.pureChildren=[]}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},e}(xn);function Un(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}var zn=function(e,t){this.id=e,this.batched=!1,this.updates=[],"function"==typeof t?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:t}):console.error("[JS Runtime] invalid parameter, handler must be a function")};zn.prototype.createFinish=function(e){return(0,this.handler)([Un("createFinish")],e)},zn.prototype.updateFinish=function(e){return(0,this.handler)([Un("updateFinish")],e)},zn.prototype.refreshFinish=function(e){return(0,this.handler)([Un("refreshFinish")],e)},zn.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[Un("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return Un("addElement",[t.ref,e,-1])})),this.addActions(r)},zn.prototype.addElement=function(e,t,n){return 0<=n||(n=-1),this.addActions(Un("addElement",[t,e.toJSON(),n]))},zn.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return Un("removeElement",[e])});return this.addActions(t)}return this.addActions(Un("removeElement",[e]))},zn.prototype.moveElement=function(e,t,n){return this.addActions(Un("moveElement",[e,t,n]))},zn.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(Un("updateAttrs",[e,r]))},zn.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(Un("updateStyle",[e,r]))},zn.prototype.setStyles=function(e,t){return this.addActions(Un("updateStyle",[e,t]))},zn.prototype.addEvent=function(e,t){return this.addActions(Un("addEvent",[e,t]))},zn.prototype.removeEvent=function(e,t){return this.addActions(Un("removeEvent",[e,t]))},zn.prototype.handler=function(e,t){return t&&t()},zn.prototype.addActions=function(e){var t=this.updates,n=this.handler;if(Array.isArray(e)||(e=[e]),!this.batched)return n(e);t.push.apply(t,e)};var Hn={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"};function Gn(e,t,n){var r,o=t.module,i=t.method,a=t.args;return r=i,"dom"===o&&Hn[r]&&"function"==typeof global[Hn[r]]?global[Hn[i]].apply(global,[e].concat(a,["-1"])):n(e,[t],"-1")}var Xn=function e(t,n,r){var o,i;t=t?t.toString():"",this.id=t,this.URL=n,i=this,(o=t)&&(hn[o]=i),this.nodeMap={};var a,s,c=e.Listener||zn;this.listener=new c(t,r||(a=t,"function"!=typeof(s=e.handler||global.callNative)&&console.error("[JS Runtime] no default handler"),function(e){Array.isArray(e)||(e=[e]);for(var t=0;t<e.length;t++){var n=Gn(a,e[t],s);if(-1===n)return n}})),this.taskCenter=new Mn(t,r?function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};function Kn(e){return e["[[CurrentInstanceId]]"]}Xn.prototype.getRef=function(e){return this.nodeMap[e]},Xn.prototype.open=function(){this.listener.batched=!1},Xn.prototype.close=function(){this.listener.batched=!0},Xn.prototype.createDocumentElement=function(){var n=this;if(!this.documentElement){var e=new jn("document");e.docId=this.id,e.ownerDocument=this,e.role="documentElement",e.depth=0,e.ref="_documentElement",this.nodeMap._documentElement=e,this.documentElement=e,Object.defineProperty(e,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(e){yn(n,e)}}),Object.defineProperty(e,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(e,t){yn(n,e,t)}}),an("debug")&&sn('Create document element (id: "'+e.docId+'", ref: "'+e.ref+'")')}return this.documentElement},Xn.prototype.createBody=function(e,t){if(!this.body){var n=new jn(e,t);gn(this,n),an("debug")&&sn("[createBody]("+this.id+","+n.type+","+n.ref+") ("+JSON.stringify(n.toJSON(!0))+").")}return this.body},Xn.prototype.createElement=function(e,t){var n=new jn(e,t);return an("debug")&&sn("[createElement]("+this.id+","+n.type+","+n.ref+") ("+JSON.stringify(n.toJSON(!0))+")."),n},Xn.prototype.createComment=function(e){return new Bn(e)},Xn.prototype.fireEvent=function(e,t,n,r,o){if(e){var i;(n=n||{}).type=n.type||t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&function(e,t){var n=t.attrs||{};for(var r in n)e.setAttr(r,n[r],!0);var o=t.style||{};for(var i in o)e.setStyle(i,o[i],!0)}(e,r);var a=this.getRef("_root");return a&&a.attr&&(i="true"===a.attr.bubble),e.fireEvent(t,n,i,o)}},Xn.prototype.destroy=function(){var e;an("debug")&&sn("[destroy]("+this.id+",document,"+this.ref+') Destroy document (id: "'+this.id+'", URL: "'+this.URL+'")'),this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,e=this.id,delete hn[e]},Xn.handler=null;var Zn,Yn,Qn=function(e,t,n){var r,o;r=this,o=String(e),Object.defineProperty(r,"[[CurrentInstanceId]]",{value:o}),this.config=t||{},this._nativeData=n||{},this.document=new Xn(e,this.config.bundleUrl),this.requireModule=this.requireModule.bind(this),this.importScript=this.importScript.bind(this),this.isRegisteredModule=Nn,this.isRegisteredComponent=Vn};Qn.prototype.requireModule=function(s){var c=Kn(this);if(c&&this.document&&this.document.taskCenter){if(Nn(s)){var e={},t=Pn[s],n=function(a){Object.defineProperty(e,a,{enumerable:!0,configurable:!0,get:function(){return n=s,r=a,(o=mn(e=c))&&"function"==typeof o.send?function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return o.send("module",{module:n,method:r},e)}:(console.error("[JS Framework] Failed to find taskCenter ("+e+")."),null);var e,n,r,o},set:function(e){return n=s,r=a,o=e,(i=mn(t=c))&&"function"==typeof i.send?"function"!=typeof o?(console.error("[JS Framework] "+n+"."+r+" must be assigned as a function."),null):function(e){return i.send("module",{module:n,method:r},[e])}:(console.error("[JS Framework] Failed to find taskCenter ("+t+")."),null);var t,n,r,o,i}})};for(var r in t)n(r);return e}console.warn('[JS Framework] using unregistered weex module "'+s+'"')}else console.error('[JS Framework] Failed to requireModule("'+s+'"), instance ('+c+") doesn't exist anymore.")},Qn.prototype.supports=function(e){if("string"!=typeof e)return null;var t=e.match(/^@(\w+)\/([\w-]+)(\.(\w+))?$/i);if(t){var n=t[1],r=t[2],o=t[4];switch(n){case"module":return Nn(r,o);case"component":return Vn(r)}}return null},Qn.prototype.importScript=function(e,r){void 0===r&&(r={});var o=Kn(this),i=mn(o);return new Promise(function(t,n){i&&"function"==typeof i.send||n(new Error('[JS Framework] Failed to import script "'+e+'", no taskCenter ('+o+") matched."));try{i.send("module",{module:"script",method:"importScript"},[e,r],{callback:[function(e){return t(e)},function(e){return n(e)}]})}catch(e){n(e)}})};var er=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/;function tr(){return"0.29.7"}var nr={};function rr(e){return nr[e]}function or(e,t,n){void 0===t&&(t={});var r=new Qn(e,t,n),o=t.bundleType||"Vue";nr[e]=o;var i=Yn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');var a,s,c,l,u=(a=e,s={weex:r,config:t,created:Date.now(),framework:o,bundleType:o},c=Yn,(l=Object.create(null)).service=Object.create(null),Ln.forEach(function(e){var t=e.name,n=e.options.create;if(n)try{var r=n(a,s,c);Object.assign(l.service,r),Object.assign(l,r.instance)}catch(e){console.error("[JS Runtime] Failed to create service "+t+".")}}),delete l.service.instance,Object.freeze(l.service),l);Object.freeze(u);var f=Object.create(null);Object.assign(f,u,{weex:r,getJSFMVersion:tr,requireModule:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return r.requireModule.apply(r,e)},__WEEX_CALL_JAVASCRIPT__:Tn,services:u}),Object.freeze(f);var p=Object.assign({},f);return"function"==typeof i.createInstanceContext&&Object.assign(p,i.createInstanceContext(e,f,n)),Object.freeze(p),p}var ir={createInstance:function(e,t,n,r){if(nr[e])return new Error('The instance id "'+e+'" has already been used!');var o=function(e){var t=er.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}(t);nr[e]=o,(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{})),n.bundleType=o;var i=Yn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');"Weex"===o&&console.error('[JS Framework] COMPATIBILITY WARNING: Weex DSL 1.0 (.we) framework is no longer supported! It will be removed in the next version of WeexSDK, your page would be crash if you still using the ".we" framework. Please upgrade it to Vue.js or Rax.');var a=or(e,n,r);if("function"==typeof i.createInstance){if("Rax"!==o&&"Weex"!==o)return i.createInstance(e,t,n,r,a);var s=Object.assign({config:n,created:Date.now(),framework:o},a);return i.createInstance(e,t,n,r,s)}!function(e,t){var n=[],r=[];for(var o in t)n.push(o),r.push(t[o]);var i="\n    (function (global) {\n      "+e+"\n    })(Object.create(this))\n  ";(new(Function.prototype.bind.apply(Function,[null].concat(n,[i])))).apply(void 0,r)}(t,a)},createInstanceContext:or,getRoot:function(e){var t=vn(e);try{if(t&&t.body)return t.body.toJSON()}catch(e){return void console.error("[JS Framework] Failed to get the virtual dom tree.")}},getJSFMVersion:tr,getDocument:vn,registerService:Jn,unregisterService:Wn,callJS:function(e,t){var n=Zn[rr(e)];return n&&"function"==typeof n.receiveTasks?n.receiveTasks(e,t):Tn(e,t)}};function ar(s){ir[s]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n,r=e[0],o=rr(r);if(o&&Zn[o]){var i=(n=Zn[o])[s].apply(n,e),a={framework:o};return"refreshInstance"===s?Ln.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:Yn})}):"destroyInstance"===s&&(Ln.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:Yn})}),delete nr[r]),i}return new Error('[JS Framework] Using invalid instance id "'+r+'" when calling '+s+".")}}function sr(o,i){ir[o]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n in"function"==typeof i&&i.apply(void 0,e),Yn.frameworks){var r=Yn.frameworks[n];r&&r[o]&&r[o].apply(r,e)}}}var cr={Document:Xn,Element:jn,Comment:Bn,Listener:zn,TaskCenter:Mn,sendTasks:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return"function"==typeof callNative?callNative.apply(void 0,e):(global.callNative||function(){}).apply(void 0,e)}};Xn.handler=cr.sendTasks;var lr={service:{register:Jn,unregister:Wn,has:qn},freezePrototype:function(){Object.freeze(cr.Comment),Object.freeze(cr.Listener),Object.freeze(cr.Document.prototype),Object.freeze(cr.Comment.prototype),Object.freeze(cr.Listener.prototype)},init:function(e){for(var t in Zn=(Yn=e||{}).frameworks||{},function(){var e={createFinish:global.callCreateFinish,updateFinish:global.callUpdateFinish,refreshFinish:global.callRefreshFinish,createBody:global.callCreateBody,addElement:global.callAddElement,removeElement:global.callRemoveElement,moveElement:global.callMoveElement,updateAttrs:global.callUpdateAttrs,updateStyle:global.callUpdateStyle,addEvent:global.callAddEvent,removeEvent:global.callRemoveEvent,__updateComponentData:global.__updateComponentData},t=Mn.prototype,n=function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return In(e,[{module:"dom",method:n,args:t}],"-1")}};for(var r in e)n(r);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return In(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return In(e,[{module:t,method:n,args:r}])}}(),Zn){var n=Zn[t];if("function"==typeof n.init)try{n.init(e)}catch(e){}}return sr("registerComponents",Dn),sr("registerModules",Fn),sr("registerMethods"),["destroyInstance","refreshInstance"].forEach(ar),ir},config:cr};function ur(e,t){void 0===t&&(t={}),this.type=e||"message",this.data=t.data||null,this.origin=t.origin||"",this.source=t.source||null,this.ports=t.ports||[],this.target=null,this.timeStamp=Date.now()}var fr={},pr={};function dr(){}dr.prototype.postMessage=function(e){if(this._closed)throw new Error('BroadcastChannel "'+this.name+'" is closed.');var t=fr[this.name];if(t&&t.length)for(var n=0;n<t.length;++n){var r=t[n];r._closed||r===this||"function"==typeof r.onmessage&&r.onmessage(new ur("message",{data:e}))}},dr.prototype.close=function(){var t=this;if(!this._closed&&(this._closed=!0,fr[this.name])){var e=fr[this.name].filter(function(e){return e!==t});e.length?fr[this.name]=e:delete fr[this.name]}};var hr={BroadcastChannel:{create:function(t,e,n){if(pr[t]=[],"function"==typeof global.BroadcastChannel)return{};var r={BroadcastChannel:function(e){Object.defineProperty(this,"name",{configurable:!1,enumerable:!0,writable:!1,value:String(e)}),this._closed=!1,this.onmessage=null,fr[this.name]||(fr[this.name]=[]),fr[this.name].push(this),pr[t].push(this)}};return r.BroadcastChannel.prototype=dr.prototype,{instance:r}},destroy:function(e,t){pr[e].forEach(function(e){return e.close()}),delete pr[e]}}};var vr={},mr={};var yr=Object.freeze({init:function(e){vr.Document=e.Document,vr.Element=e.Element,vr.Comment=e.Comment,vr.sendTasks=e.sendTasks},createInstance:function(t,e,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new vr.Document(t,n.bundleUrl),a={},s={id:t,data:r,document:i,callbacks:a},c=0;i.addCallback=function(e){return a[++c]=e,c},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},mr[t]=s;var l=Object.assign({Document:vr.Document,Element:vr.Element,Comment:vr.Comment,sendTasks:function(e){return vr.sendTasks(t,e,-1)},options:n,document:i},o),u=[],f=[];for(var p in l)u.push(p),f.push(l[p]);return u.push(e),(new(Function.prototype.bind.apply(Function,[null].concat(u)))).apply(void 0,f),vr.sendTasks(t,[{module:"dom",method:"createFinish",args:[]}],-1),s},destroyInstance:function(e){delete mr[e]},getRoot:function(e){return mr[e].document.body.toJSON()},receiveTasks:function(r,e){var o={fireEvent:function(e,t,n,r,o){var i=mr[e].document,a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){return mr[e].document.handleCallback(t,n,r)}};if((mr[r]||{}).document&&Array.isArray(e)){var i=[];return e.forEach(function(e){var t=o[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),i.push(t.apply(void 0,n)))}),i}}}),gr=n(function(e){e.exports=function(e,o){var _=Object.freeze({});function $(e){return null==e}function A(e){return null!=e}function j(e){return!0===e}function I(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function b(e){return null!==e&&"object"==typeof e}var r=Object.prototype.toString;function u(e){return"[object Object]"===r.call(e)}function i(e){var t=parseFloat(String(e));return 0<=t&&Math.floor(t)===t&&isFinite(e)}function t(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function n(e){var t=parseFloat(e);return isNaN(t)?e:t}function s(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}s("slot,component",!0);var c=s("key,ref,slot,slot-scope,is");function l(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var a=Object.prototype.hasOwnProperty;function f(e,t){return a.call(e,t)}function p(t){var n=Object.create(null);return function(e){return n[e]||(n[e]=t(e))}}var d=/-(\w)/g,h=p(function(e){return e.replace(d,function(e,t){return t?t.toUpperCase():""})}),v=p(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),m=/\B([A-Z])/g,w=p(function(e){return e.replace(m,"-$1").toLowerCase()});var y=Function.prototype.bind?function(e,t){return e.bind(t)}:function(n,r){function e(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}return e._length=n.length,e};function g(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function N(e,t){for(var n in t)e[n]=t[n];return e}function R(e,t,n){}var k=function(e,t,n){return!1},S=function(e){return e};function O(t,n){if(t===n)return!0;var e=b(t),r=b(n);if(!e||!r)return!e&&!r&&String(t)===String(n);try{var o=Array.isArray(t),i=Array.isArray(n);if(o&&i)return t.length===n.length&&t.every(function(e,t){return O(e,n[t])});if(o||i)return!1;var a=Object.keys(t),s=Object.keys(n);return a.length===s.length&&a.every(function(e){return O(t[e],n[e])})}catch(e){return!1}}function C(e,t){for(var n=0;n<e.length;n++)if(O(e[n],t))return n;return-1}function D(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var M="data-server-rendered",x=["component","directive","filter"],E=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],T={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:k,isReservedAttr:k,isUnknownElement:k,getTagNamespace:R,parsePlatformTagName:S,mustUseProp:k,_lifecycleHooks:E};function P(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var F=/[^\w.$]/;var V,L="__proto__"in{},J="undefined"!=typeof window,W="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,q=W&&WXEnvironment.platform.toLowerCase(),B=J&&window.navigator.userAgent.toLowerCase(),U=(B&&/msie|trident/.test(B),B&&0<B.indexOf("msie 9.0")),z=B&&0<B.indexOf("edge/"),H=(B&&B.indexOf("android"),B&&/iphone|ipad|ipod|ios/.test(B)||"ios"===q),G=(B&&/chrome\/\d+/.test(B),{}.watch);if(J)try{var X={};Object.defineProperty(X,"passive",{get:function(){}}),window.addEventListener("test-passive",null,X)}catch(e){}var K=function(){return void 0===V&&(V=!J&&!W&&void 0!==global&&"server"===global.process.env.VUE_ENV),V},Z=J&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function Y(e){return"function"==typeof e&&/native code/.test(e.toString())}var Q,ee="undefined"!=typeof Symbol&&Y(Symbol)&&"undefined"!=typeof Reflect&&Y(Reflect.ownKeys);Q="undefined"!=typeof Set&&Y(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var te=R,ne=0,re=function(){this.id=ne++,this.subs=[]};re.prototype.addSub=function(e){this.subs.push(e)},re.prototype.removeSub=function(e){l(this.subs,e)},re.prototype.depend=function(){re.target&&re.target.addDep(this)},re.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},re.target=null;var oe=[];function ie(e){re.target&&oe.push(re.target),re.target=e}function ae(){re.target=oe.pop()}var se=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ce={child:{configurable:!0}};ce.child.get=function(){return this.componentInstance},Object.defineProperties(se.prototype,ce);var le=function(e){void 0===e&&(e="");var t=new se;return t.text=e,t.isComment=!0,t};function ue(e){return new se(void 0,void 0,void 0,String(e))}function fe(e){var t=new se(e.tag,e.data,e.children,e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.isCloned=!0,t}var pe=Array.prototype,de=Object.create(pe);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=pe[a];P(de,a,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r,o=s.apply(this,t),i=this.__ob__;switch(a){case"push":case"unshift":r=t;break;case"splice":r=t.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})});var he=Object.getOwnPropertyNames(de),ve=!0;function me(e){ve=e}var ye=function(e){(this.value=e,this.dep=new re,this.vmCount=0,P(e,"__ob__",this),Array.isArray(e))?((L?ge:_e)(e,de,he),this.observeArray(e)):this.walk(e)};function ge(e,t,n){e.__proto__=t}function _e(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];P(e,i,t[i])}}function be(e,t){var n;if(b(e)&&!(e instanceof se))return f(e,"__ob__")&&e.__ob__ instanceof ye?n=e.__ob__:ve&&!K()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new ye(e)),t&&n&&n.vmCount++,n}function we(n,e,r,t,o){var i=new re,a=Object.getOwnPropertyDescriptor(n,e);if(!a||!1!==a.configurable){var s=a&&a.get;s||2!==arguments.length||(r=n[e]);var c=a&&a.set,l=!o&&be(r);Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(n):r;return re.target&&(i.depend(),l&&(l.dep.depend(),Array.isArray(e)&&function e(t){for(var n=void 0,r=0,o=t.length;r<o;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(e))),e},set:function(e){var t=s?s.call(n):r;e===t||e!=e&&t!=t||(c?c.call(n,e):r=e,l=!o&&be(e),i.notify())}})}}function ke(e,t,n){if(Array.isArray(e)&&i(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(we(r.value,t,n),r.dep.notify(),n):e[t]=n}function Se(e,t){if(Array.isArray(e)&&i(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||f(e,t)&&(delete e[t],n&&n.dep.notify())}}ye.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)we(e,t[n])},ye.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)be(e[t])};var Oe=T.optionMergeStrategies;function Ce(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),a=0;a<i.length;a++)r=e[n=i[a]],o=t[n],f(e,n)?u(r)&&u(o)&&Ce(r,o):ke(e,n,o);return e}function xe(n,r,o){return o?function(){var e="function"==typeof r?r.call(o,o):r,t="function"==typeof n?n.call(o,o):n;return e?Ce(e,t):t}:r?n?function(){return Ce("function"==typeof r?r.call(this,this):r,"function"==typeof n?n.call(this,this):n)}:r:n}function Ee(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function $e(e,t,n,r){var o=Object.create(e||null);return t?N(o,t):o}Oe.data=function(e,t,n){return n?xe(e,t,n):t&&"function"!=typeof t?e:xe(e,t)},E.forEach(function(e){Oe[e]=Ee}),x.forEach(function(e){Oe[e+"s"]=$e}),Oe.watch=function(e,t,n,r){if(e===G&&(e=void 0),t===G&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var o={};for(var i in N(o,e),t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},Oe.props=Oe.methods=Oe.inject=Oe.computed=function(e,t,n,r){if(!e)return t;var o=Object.create(null);return N(o,e),t&&N(o,t),o},Oe.provide=xe;var Ae=function(e,t){return void 0===t?e:t};function je(n,r,o){"function"==typeof r&&(r=r.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])&&(i[h(o)]={type:null});else if(u(n))for(var a in n)o=n[a],i[h(a)]=u(o)?o:{type:o};e.props=i}}(r),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(u(n))for(var i in n){var a=n[i];r[i]=u(a)?N({from:i},a):{from:a}}}}(r),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(r);var e=r.extends;if(e&&(n=je(n,e,o)),r.mixins)for(var t=0,i=r.mixins.length;t<i;t++)n=je(n,r.mixins[t],o);var a,s={};for(a in n)c(a);for(a in r)f(n,a)||c(a);function c(e){var t=Oe[e]||Ae;s[e]=t(n[e],r[e],o,e)}return s}function Ie(e,t,n,r){if("string"==typeof n){var o=e[t];if(f(o,n))return o[n];var i=h(n);if(f(o,i))return o[i];var a=v(i);return f(o,a)?o[a]:o[n]||o[i]||o[a]}}function Me(e,t,n,r){var o=t[e],i=!f(n,e),a=n[e],s=Fe(Boolean,o.type);if(-1<s)if(i&&!f(o,"default"))a=!1;else if(""===a||a===w(e)){var c=Fe(String,o.type);(c<0||s<c)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(!f(t,"default"))return;var r=t.default;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Te(t.type)?r.call(e):r}(r,o,e);var l=ve;me(!0),be(a),me(l)}return a}function Te(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function Pe(e,t){return Te(e)===Te(t)}function Fe(e,t){if(!Array.isArray(t))return Pe(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(Pe(t[n],e))return n;return-1}function Ne(e,t,n){if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){Re(e,r,"errorCaptured hook")}}Re(e,t,n)}function Re(e,t,n){if(T.errorHandler)try{return T.errorHandler.call(null,e,t,n)}catch(e){De(e,null,"config.errorHandler")}De(e,t,n)}function De(e,t,n){if(!J&&!W||"undefined"==typeof console)throw e;console.error(e)}var Ve,Le,Je=[],We=!1;function qe(){We=!1;for(var e=Je.slice(0),t=Je.length=0;t<e.length;t++)e[t]()}var Be=!1;function Ue(){if("undefined"!=typeof setImmediate&&Y(setImmediate))Le=function(){setImmediate(qe)};else if("undefined"==typeof MessageChannel||!Y(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Le=function(){setTimeout(qe,0)};else{var e=new MessageChannel,t=e.port2;e.port1.onmessage=qe,Le=function(){t.postMessage(1)}}if("undefined"!=typeof Promise&&Y(Promise)){var n=Promise.resolve();Ve=function(){n.then(qe),!W&&H&&setTimeout(R)}}else Ve=Le}function ze(e,t){var n;if(Je.push(function(){if(e)try{e.call(t)}catch(e){Ne(e,t,"nextTick")}else n&&n(t)}),We||(We=!0,Be&&"function"==typeof Le?Le():"function"==typeof Ve?Ve():setTimeout(qe,0)),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}Ue();var He=new Q;function Ge(e){!function e(t,n){var r,o;var i=Array.isArray(t);if(!i&&!b(t)||Object.isFrozen(t)||t instanceof se)return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}(e,He),He.clear()}var Xe,Ke=p(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function Ze(e){function o(){var e=arguments,t=o.fns;if(!Array.isArray(t))return t.apply(null,arguments);for(var n=t.slice(),r=0;r<n.length;r++)n[r].apply(null,e)}return o.fns=e,o}function Ye(e,t,n,r,o){var i,a,s,c,l;for(i in e)a=s=e[i],c=t[i],l=Ke(i),u(a)&&(s=a.handler,l.params=a.params),$(s)||($(c)?($(s.fns)&&(s=e[i]=Ze(s)),n(l.name,s,l.once,l.capture,l.passive,l.params)):s!==c&&(c.fns=s,e[i]=c));for(i in t)$(e[i])&&r((l=Ke(i)).name,t[i],l.capture)}function Qe(e,t,n){var r;e instanceof se&&(e=e.data.hook||(e.data.hook={}));var o=e[t];function i(){n.apply(this,arguments),l(r.fns,i)}$(o)?r=Ze([i]):A(o.fns)&&j(o.merged)?(r=o).fns.push(i):r=Ze([o,i]),r.merged=!0,e[t]=r}function et(e,t,n,r,o){if(A(t)){if(f(t,n))return e[n]=t[n],o||delete t[n],!0;if(f(t,r))return e[n]=t[r],o||delete t[r],!0}return!1}function tt(e){return I(e)?[ue(e)]:Array.isArray(e)?function e(t,n){var r=[];var o,i,a,s;for(o=0;o<t.length;o++)$(i=t[o])||"boolean"==typeof i||(a=r.length-1,s=r[a],Array.isArray(i)?0<i.length&&(nt((i=e(i,(n||"")+"_"+o))[0])&&nt(s)&&(r[a]=ue(s.text+i[0].text),i.shift()),r.push.apply(r,i)):I(i)?nt(s)?r[a]=ue(s.text+i):""!==i&&r.push(ue(i)):nt(i)&&nt(s)?r[a]=ue(s.text+i.text):(j(t._isVList)&&A(i.tag)&&$(i.key)&&A(n)&&(i.key="__vlist"+n+"_"+o+"__"),r.push(i)));return r}(e):void 0}function nt(e){return A(e)&&A(e.text)&&!1===e.isComment}function rt(e,t){return(e.__esModule||ee&&"Module"===e[Symbol.toStringTag])&&(e=e.default),b(e)?t.extend(e):e}function ot(e){return e.isComment&&e.asyncFactory}function it(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(A(n)&&(A(n.componentOptions)||ot(n)))return n}}function at(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&lt(e,t)}function st(e,t,n){n?Xe.$once(e,t):Xe.$on(e,t)}function ct(e,t){Xe.$off(e,t)}function lt(e,t,n){Xe=e,Ye(t,n||{},st,ct),Xe=void 0}function ut(e,t){var n={};if(!e)return n;for(var r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var l in n)n[l].every(ft)&&delete n[l];return n}function ft(e){return e.isComment&&!e.asyncFactory||" "===e.text}function pt(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?pt(e[n],t):t[e[n].key]=e[n].fn;return t}var dt=null;function ht(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function vt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function mt(e,t){if(t){if(e._directInactive=!1,vt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)mt(e.$children[n]);yt(e,"activated")}}function yt(t,n){ie();var e=t.$options[n];if(e)for(var r=0,o=e.length;r<o;r++)try{e[r].call(t)}catch(e){Ne(e,t,n+" hook")}t._hasHookEvent&&t.$emit("hook:"+n),ae()}var gt=[],_t=[],bt={},wt=!1,kt=!1,St=0;function Ot(){var e,t;for(kt=!0,gt.sort(function(e,t){return e.id-t.id}),St=0;St<gt.length;St++)t=(e=gt[St]).id,bt[t]=null,e.run();var n=_t.slice(),r=gt.slice();St=gt.length=_t.length=0,wt=kt=!(bt={}),function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,mt(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&yt(r,"updated")}}(r),Z&&T.devtools&&Z.emit("flush")}var Ct=0,xt=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Ct,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new Q,this.newDepIds=new Q,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!F.test(e)){var n=e.split(".");return function(e){for(var t=0;t<n.length;t++){if(!e)return;e=e[n[t]]}return e}}}(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};xt.prototype.get=function(){var e;ie(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;Ne(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Ge(e),ae(),this.cleanupDeps()}return e},xt.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},xt.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},xt.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==bt[t]){if(bt[t]=!0,kt){for(var n=gt.length-1;St<n&&gt[n].id>e.id;)n--;gt.splice(n+1,0,e)}else gt.push(e);wt||(wt=!0,ze(Ot))}}(this)},xt.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||b(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Ne(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},xt.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},xt.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},xt.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Et={enumerable:!0,configurable:!0,get:R,set:R};function $t(e,t,n){Et.get=function(){return this[t][n]},Et.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Et)}function At(e){e._watchers=[];var t=e.$options;t.props&&function(n,r){var o=n.$options.propsData||{},i=n._props={},a=n.$options._propKeys=[];n.$parent&&me(!1);var e=function(e){a.push(e);var t=Me(e,r,o,n);we(i,e,t),e in n||$t(n,"_props",e)};for(var t in r)e(t);me(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?R:y(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?jt(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var i=n[o];r&&f(r,i)||(void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&$t(e,"_data",i))}var a;be(t,!0)}(e):be(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=K();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;r||(n[o]=new xt(e,a||R,R,It)),o in e||Mt(e,o,i)}}(e,t.computed),t.watch&&t.watch!==G&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)Pt(e,n,r[o]);else Pt(e,n,r)}}(e,t.watch)}function jt(e,t){ie();try{return e.call(t,t)}catch(e){return Ne(e,t,"data()"),{}}finally{ae()}}var It={lazy:!0};function Mt(e,t,n){var r=!K();Et.set="function"==typeof n?(Et.get=r?Tt(t):n,R):(Et.get=n.get?r&&!1!==n.cache?Tt(t):n.get:R,n.set?n.set:R),Object.defineProperty(e,t,Et)}function Tt(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),re.target&&e.depend(),e.value}}function Pt(e,t,n,r){return u(n)&&(n=(r=n).handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Ft(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function Nt(t){var n=Rt(t.$options.inject,t);n&&(me(!1),Object.keys(n).forEach(function(e){we(t,e,n[e])}),me(!0))}function Rt(t,e){if(t){for(var n=Object.create(null),r=ee?Reflect.ownKeys(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}):Object.keys(t),o=0;o<r.length;o++){for(var i=r[o],a=t[i].from,s=e;s;){if(s._provided&&f(s._provided,a)){n[i]=s._provided[a];break}s=s.$parent}if(!s&&"default"in t[i]){var c=t[i].default;n[i]="function"==typeof c?c.call(e):c}}return n}}function Dt(e,t){var n,r,o,i,a;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(b(e))for(i=Object.keys(e),n=new Array(i.length),r=0,o=i.length;r<o;r++)a=i[r],n[r]=t(e[a],a,r);return A(n)&&(n._isVList=!0),n}function Vt(e,t,n,r){var o,i=this.$scopedSlots[e];if(i)n=n||{},r&&(n=N(N({},r),n)),o=i(n)||t;else{var a=this.$slots[e];a&&(a._rendered=!0),o=a||t}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},o):o}function Lt(e){return Ie(this.$options,"filters",e)||S}function Jt(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function Wt(e,t,n,r,o){var i=T.keyCodes[t]||n;return o&&r&&!T.keyCodes[t]?Jt(o,r):i?Jt(i,e):r?w(r)!==t:void 0}function qt(n,r,o,i,a){if(o)if(b(o)){var s;Array.isArray(o)&&(o=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(o));var e=function(t){if("class"===t||"style"===t||c(t))s=n;else{var e=n.attrs&&n.attrs.type;s=i||T.mustUseProp(r,e,t)?n.domProps||(n.domProps={}):n.attrs||(n.attrs={})}t in s||(s[t]=o[t],a&&((n.on||(n.on={}))["update:"+t]=function(e){o[t]=e}))};for(var t in o)e(t)}else;return n}function Bt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||zt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function Ut(e,t,n){return zt(e,"__once__"+t+(n?"_"+n:""),!0),e}function zt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Ht(e[r],t+"_"+r,n);else Ht(e,t,n)}function Ht(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Gt(e,t){if(t)if(u(t)){var n=e.on=e.on?N({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else;return e}function Xt(e){e._o=Ut,e._n=n,e._s=t,e._l=Dt,e._t=Vt,e._q=O,e._i=C,e._m=Bt,e._f=Lt,e._k=Wt,e._b=qt,e._v=ue,e._e=le,e._u=pt,e._g=Gt}function Kt(e,t,n,i,r){var a,s=r.options;f(i,"_uid")?(a=Object.create(i))._original=i:i=(a=i)._original;var o=j(s._compiled),c=!o;this.data=e,this.props=t,this.children=n,this.parent=i,this.listeners=e.on||_,this.injections=Rt(s.inject,i),this.slots=function(){return ut(n,i)},o&&(this.$options=s,this.$slots=this.slots(),this.$scopedSlots=e.scopedSlots||_),s._scopeId?this._c=function(e,t,n,r){var o=mn(a,e,t,n,r,c);return o&&!Array.isArray(o)&&(o.fnScopeId=s._scopeId,o.fnContext=i),o}:this._c=function(e,t,n,r){return mn(a,e,t,n,r,c)}}function Zt(e,t,n,r){var o=fe(e);return o.fnContext=n,o.fnOptions=r,t.slot&&((o.data||(o.data={})).slot=t.slot),o}function Yt(e,t){for(var n in t)e[h(n)]=t[n]}Xt(Kt.prototype);var Qt="@inRecycleList";function en(e,t,n,r){if(o&&o.taskCenter)return"function"==typeof o.taskCenter.registerHook?o.taskCenter.registerHook(e,t,n,r):void 0}function tn(e,n,t){if(b(n))if(t)e.$refs={};else{var r=e.$refs||{};Object.keys(n).forEach(function(e){var t=n[e];r[e]=1===t.length?t[0]:t}),e.$refs=r}}function nn(e,n,r,t){if(b(r)){var o=e.$refs||{};t?Object.keys(r).forEach(function(e){var t=r[e];o[e]&&(1===t.length&&Array.isArray(o[e])?delete o[e][n]:delete o[e])}):(Object.keys(r).forEach(function(e){var t=r[e];1===t.length?(Array.isArray(o[e])||(o[e]=[]),o[e][n]=t[0]):o[e]=t}),e.$refs=o)}}var rn=0;function on(e){var t=e.$options.data,n=e.$options.computed||{},r=e._data?Object.assign({},e._data):"function"==typeof t?jt(t,e):t||{},o={};for(var i in n)o[i]=e[i];return Object.assign({},r,o)}function an(e){void 0===e&&(e={});var r=this,t=e.componentId;P(r,"_vmTemplate",e.vmTemplate),r._uid=t||"virtual-component-"+rn++,r._isVue=!0,e&&e._isComponent?xn(r,e):r.$options=je(En(r.constructor),e||{},r),ht((r._renderProxy=r)._self=r),at(r),yn(r),yt(r,"beforeCreate"),Nt(r),At(r),Ft(r),yt(r,"created"),en(t,"lifecycle","attach",function(e){tn(r,e&&e.refs),yt(r,"beforeMount"),new xt(r,function(){return on(r)},function(){return r._update(r._vnode,!1)}),r._isMounted=!0,yt(r,"mounted")}),en(t,"lifecycle","update",function(e){tn(r,e&&e.refs),r._update(r._vnode,!1)}),en(t,"lifecycle","syncState",function(e,t){if(u(t))for(var n in t)r[n]=t[n];return on(r)}),en(t,"lifecycle","detach",function(e){tn(r,e&&e.refs,!0),r.$destroy(),r._vmTemplate&&(r._vmTemplate.removeVirtualComponent(r._uid),delete r._vmTemplate)})}function sn(e){var t=this,n=t.$options.componentId;(t._isMounted&&yt(t,"beforeUpdate"),t._vnode=e,t._isMounted&&n)&&function(e,t,n){if(o&&o.taskCenter)"function"==typeof o.taskCenter.updateData&&o.taskCenter.updateData(e,t,n)}(n,on(t),function(){yt(t,"updated")})}function cn(e){void 0===e&&(e={});var t=this;t._uid="virtual-component-template-"+rn++,t._isVue=!0,e&&e._isComponent?xn(t,e):t.$options=je(En(t.constructor),e||{},t),at(t._self=t),yn(t),At(t),this.registerVirtualComponent()}function ln(e){var t,n,o,i;delete e.data.attrs[Qt],n=(t=e).componentOptions.Ctor,o=n.extend({}),i=o.prototype.$emit,o.prototype._init=an,o.prototype._update=sn,o.prototype.$emit=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this._uid,o=this._vmTemplate;return r&&o&&(t.push(r),i.apply(o,t)),i.apply(this,t)},t.componentOptions.Ctor=n.extend({methods:{registerVirtualComponent:function(){var r=this;P(r,"_virtualComponents",{}),en(String(r._uid),"lifecycle","create",function(e,t){var n=new o({vmTemplate:r,componentId:e,propsData:t});return n._uid=e,r._virtualComponents&&(r._virtualComponents[e]=n),on(n)})},removeVirtualComponent:function(e){delete this._virtualComponents[e]}},destroyed:function(){delete this._virtualComponents}}),t.componentOptions.Ctor.prototype._init=cn,t.componentOptions.Ctor.prototype._update=R;var r=dn(e),a=r.$options["@render"];if(a)try{return a.call(r)}catch(e){Ne(e,r,"@render")}}var un={init:function(e,t,n,r){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var o=e;un.prepatch(o,o)}else{(e.componentInstance=dn(e,dt,n,r)).$mount(t?e.elm:void 0,t)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,r,o){var i=!!(o||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==_);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=o,e.$attrs=r.data.attrs||_,e.$listeners=n||_,t&&e.$options.props){me(!1);for(var a=e._props,s=e.$options._propKeys||[],c=0;c<s.length;c++){var l=s[c],u=e.$options.props;a[l]=Me(l,u,t,e)}me(!0),e.$options.propsData=t}n=n||_;var f=e.$options._parentListeners;e.$options._parentListeners=n,lt(e,n,f),i&&(e.$slots=ut(o,r.context),e.$forceUpdate())}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,yt(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,_t.push(t)):mt(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,vt(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);yt(t,"deactivated")}}(t,!0):t.$destroy())}},fn=Object.keys(un);function pn(e,t,n,r,o){if(!$(e)){var i=n.$options._base;if(b(e)&&(e=i.extend(e)),"function"==typeof e){var a,s,c,l,u,f,p;if($(e.cid)&&void 0===(e=function(t,n,e){if(j(t.error)&&A(t.errorComp))return t.errorComp;if(A(t.resolved))return t.resolved;if(j(t.loading)&&A(t.loadingComp))return t.loadingComp;if(!A(t.contexts)){var r=t.contexts=[e],o=!0,i=function(){for(var e=0,t=r.length;e<t;e++)r[e].$forceUpdate()},a=D(function(e){t.resolved=rt(e,n),o||i()}),s=D(function(e){A(t.errorComp)&&(t.error=!0,i())}),c=t(a,s);return b(c)&&("function"==typeof c.then?$(t.resolved)&&c.then(a,s):A(c.component)&&"function"==typeof c.component.then&&(c.component.then(a,s),A(c.error)&&(t.errorComp=rt(c.error,n)),A(c.loading)&&(t.loadingComp=rt(c.loading,n),0===c.delay?t.loading=!0:setTimeout(function(){$(t.resolved)&&$(t.error)&&(t.loading=!0,i())},c.delay||200)),A(c.timeout)&&setTimeout(function(){$(t.resolved)&&s(null)},c.timeout))),o=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(e)}(a=e,i,n)))return s=a,c=t,l=n,u=r,f=o,(p=le()).asyncFactory=s,p.asyncMeta={data:c,context:l,children:u,tag:f},p;t=t||{},En(e),A(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var o=t.on||(t.on={});A(o[r])?o[r]=[t.model.callback].concat(o[r]):o[r]=t.model.callback}(e.options,t);var d=function(e,t,n){var r=t.options.props;if(!$(r)){var o={},i=e.attrs,a=e.props;if(A(i)||A(a))for(var s in r){var c=w(s);et(o,a,s,c,!0)||et(o,i,s,c,!1)}return o}}(t,e);if(j(e.options.functional))return function(e,t,n,r,o){var i=e.options,a={},s=i.props;if(A(s))for(var c in s)a[c]=Me(c,s,t||_);else A(n.attrs)&&Yt(a,n.attrs),A(n.props)&&Yt(a,n.props);var l=new Kt(n,a,o,r,e),u=i.render.call(null,l._c,l);if(u instanceof se)return Zt(u,n,l.parent,i);if(Array.isArray(u)){for(var f=tt(u)||[],p=new Array(f.length),d=0;d<f.length;d++)p[d]=Zt(f[d],n,l.parent,i);return p}}(e,d,t,n,r);var h=t.on;if(t.on=t.nativeOn,j(e.options.abstract)){var v=t.slot;t={},v&&(t.slot=v)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<fn.length;n++){var r=fn[n];t[r]=un[r]}}(t);var m,y=e.options.name||o,g=new se("vue-component-"+e.cid+(y?"-"+y:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:d,listeners:h,tag:o,children:r},a);return(m=g).data.attrs&&Qt in m.data.attrs?ln(g):g}}}function dn(e,t,n,r){var o={_isComponent:!0,parent:t,_parentVnode:e,_parentElm:n||null,_refElm:r||null},i=e.data.inlineTemplate;return A(i)&&(o.render=i.render,o.staticRenderFns=i.staticRenderFns),new e.componentOptions.Ctor(o)}var hn=1,vn=2;function mn(e,t,n,r,o,i){return(Array.isArray(n)||I(n))&&(o=r,r=n,n=void 0),j(i)&&(o=vn),function(e,t,n,r,o){if(A(n)&&A(n.__ob__))return le();A(n)&&A(n.is)&&(t=n.is);if(!t)return le();Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);o===vn?r=tt(r):o===hn&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var i,a;if("string"==typeof t){var s;a=e.$vnode&&e.$vnode.ns||T.getTagNamespace(t),i=T.isReservedTag(t)?new se(T.parsePlatformTagName(t),n,r,void 0,void 0,e):A(s=Ie(e.$options,"components",t))?pn(s,n,e,r,t):new se(t,n,r,void 0,void 0,e)}else i=pn(t,n,e,r);return Array.isArray(i)?i:A(i)?(A(a)&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(r=!(n=void 0));if(A(t.children))for(var o=0,i=t.children.length;o<i;o++){var a=t.children[o];A(a.tag)&&($(a.ns)||j(r)&&"svg"!==a.tag)&&e(a,n,r)}}(i,a),A(n)&&function(e){b(e.style)&&Ge(e.style);b(e.class)&&Ge(e.class)}(n),i):le()}(e,t,n,r,o)}function yn(o){o._vnode=null,o._staticTrees=null;var e=o.$options,t=o.$vnode=e._parentVnode,n=t&&t.context;o.$slots=ut(e._renderChildren,n),o.$scopedSlots=_,o._c=function(e,t,n,r){return mn(o,e,t,n,r,!1)},o.$createElement=function(e,t,n,r){return mn(o,e,t,n,r,!0)};var r=t&&t.data;we(o,"$attrs",r&&r.attrs||_,null,!0),we(o,"$listeners",e._parentListeners||_,null,!0)}var gn,_n,bn,wn,kn,Sn,On,Cn=0;function xn(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function En(e){var t=e.options;if(e.super){var n=En(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.extendOptions,o=e.sealedOptions;for(var i in n)n[i]!==o[i]&&(t||(t={}),t[i]=$n(n[i],r[i],o[i]));return t}(e);r&&N(e.extendOptions,r),(t=e.options=je(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function $n(e,t,n){if(Array.isArray(e)){var r=[];n=Array.isArray(n)?n:[n],t=Array.isArray(t)?t:[t];for(var o=0;o<e.length;o++)(0<=t.indexOf(e[o])||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function An(e){this._init(e)}function jn(e){e.cid=0;var a=1;e.extend=function(e){e=e||{};var t=this,n=t.cid,r=e._Ctor||(e._Ctor={});if(r[n])return r[n];var o=e.name||t.options.name,i=function(e){this._init(e)};return((i.prototype=Object.create(t.prototype)).constructor=i).cid=a++,i.options=je(t.options,e),i.super=t,i.options.props&&function(e){var t=e.options.props;for(var n in t)$t(e.prototype,"_props",n)}(i),i.options.computed&&function(e){var t=e.options.computed;for(var n in t)Mt(e.prototype,n,t[n])}(i),i.extend=t.extend,i.mixin=t.mixin,i.use=t.use,x.forEach(function(e){i[e]=t[e]}),o&&(i.options.components[o]=i),i.superOptions=t.options,i.extendOptions=e,i.sealedOptions=N({},i.options),r[n]=i}}function In(e){return e&&(e.Ctor.options.name||e.tag)}function Mn(e,t){return Array.isArray(e)?-1<e.indexOf(t):"string"==typeof e?-1<e.split(",").indexOf(t):(n=e,"[object RegExp]"===r.call(n)&&e.test(t));var n}function Tn(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=In(a.componentOptions);s&&!t(s)&&Pn(n,i,r,o)}}}function Pn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,l(n,t)}An.prototype._init=function(e){var t=this;t._uid=Cn++,t._isVue=!0,e&&e._isComponent?xn(t,e):t.$options=je(En(t.constructor),e||{},t),ht((t._renderProxy=t)._self=t),at(t),yn(t),yt(t,"beforeCreate"),Nt(t),At(t),Ft(t),yt(t,"created"),t.$options.el&&t.$mount(t.$options.el)},gn=An,_n={get:function(){return this._data}},bn={get:function(){return this._props}},Object.defineProperty(gn.prototype,"$data",_n),Object.defineProperty(gn.prototype,"$props",bn),gn.prototype.$set=ke,gn.prototype.$delete=Se,gn.prototype.$watch=function(e,t,n){if(u(t))return Pt(this,e,t,n);(n=n||{}).user=!0;var r=new xt(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}},kn=/^hook:/,(wn=An).prototype.$on=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n<r;n++)this.$on(e[n],t);else(this._events[e]||(this._events[e]=[])).push(t),kn.test(e)&&(this._hasHookEvent=!0);return this},wn.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},wn.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,o=e.length;r<o;r++)this.$off(e[r],t);return n}var i=n._events[e];if(!i)return n;if(!t)return n._events[e]=null,n;if(t)for(var a,s=i.length;s--;)if((a=i[s])===t||a.fn===t){i.splice(s,1);break}return n},wn.prototype.$emit=function(t){var n=this,e=n._events[t];if(e){e=1<e.length?g(e):e;for(var r=g(arguments,1),o=0,i=e.length;o<i;o++)try{e[o].apply(n,r)}catch(e){Ne(e,n,'event handler for "'+t+'"')}}return n},(Sn=An).prototype._update=function(e,t){var n=this;n._isMounted&&yt(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=dt;(dt=n)._vnode=e,o?n.$el=n.__patch__(o,e):(n.$el=n.__patch__(n.$el,e,t,!1,n.$options._parentElm,n.$options._refElm),n.$options._parentElm=n.$options._refElm=null),dt=i,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},Sn.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},Sn.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){yt(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||l(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),yt(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}},Xt((On=An).prototype),On.prototype.$nextTick=function(e){return ze(e,this)},On.prototype._render=function(){var t,n=this,e=n.$options,r=e.render,o=e._parentVnode;o&&(n.$scopedSlots=o.data.scopedSlots||_),n.$vnode=o;try{t=r.call(n._renderProxy,n.$createElement)}catch(e){Ne(e,n,"render"),t=n._vnode}return t instanceof se||(t=le()),t.parent=o,t};var Fn,Nn,Rn,Dn=[String,RegExp,Array],Vn={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Dn,exclude:Dn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Pn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",function(t){Tn(e,function(e){return Mn(t,e)})}),this.$watch("exclude",function(t){Tn(e,function(e){return!Mn(t,e)})})},render:function(){var e=this.$slots.default,t=it(e),n=t&&t.componentOptions;if(n){var r=In(n),o=this.include,i=this.exclude;if(o&&(!r||!Mn(o,r))||i&&r&&Mn(i,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,l(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&Pn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};Fn=An,Rn={get:function(){return T}},Object.defineProperty(Fn,"config",Rn),Fn.util={warn:te,extend:N,mergeOptions:je,defineReactive:we},Fn.set=ke,Fn.delete=Se,Fn.nextTick=ze,Fn.options=Object.create(null),x.forEach(function(e){Fn.options[e+"s"]=Object.create(null)}),N((Fn.options._base=Fn).options.components,Vn),Fn.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(-1<t.indexOf(e))return this;var n=g(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this},Fn.mixin=function(e){return this.options=je(this.options,e),this},jn(Fn),Nn=Fn,x.forEach(function(n){Nn[n]=function(e,t){return t?("component"===n&&u(t)&&(t.name=t.name||e,t=this.options._base.extend(t)),"directive"===n&&"function"==typeof t&&(t={bind:t,update:t}),this.options[n+"s"][e]=t):this.options[n+"s"][e]}}),Object.defineProperty(An.prototype,"$isServer",{get:K}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Kt}),An.version="2.5.16";var Ln=1;function Jn(e){this.instanceId="",this.nodeId=Ln++,this.parentNode=null,this.nodeType=3,this.text=e}function Wn(e){return o.createElement(e)}var qn=Object.freeze({namespaceMap:{},createElement:Wn,createElementNS:function(e,t){return o.createElement(e+":"+t)},createTextNode:function(e){return new Jn(e)},createComment:function(e){return o.createComment(e)},insertBefore:function(e,t,n){if(3!==t.nodeType)e.insertBefore(t,n);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var r=Wn("text");r.setAttr("value",t.text),e.insertBefore(r,n)}},removeChild:function(e,t){3!==t.nodeType?e.removeChild(t):e.setAttr("value","")},appendChild:function(e,t){if(3!==t.nodeType)e.appendChild(t);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var n=Wn("text");n.setAttr("value",t.text),e.appendChild(n)}},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.type},setTextContent:function(e,t){e.parentNode&&e.parentNode.setAttr("value",t)},setAttribute:function(e,t,n){e.setAttr(t,n)},setStyleScope:function(e,t){e.setAttr("@styleScope",t)}}),Bn={create:function(e,t){Un(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Un(e,!0),Un(t))},destroy:function(e){Un(e,!0)}};function Un(e,t){var n=e.data.ref;if(A(n)){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?l(i[n],o):i[n]===o&&(i[n]=void 0):e.data.refInFor?Array.isArray(i[n])?i[n].indexOf(o)<0&&i[n].push(o):i[n]=[o]:i[n]=o}}s("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),s("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0);var zn=s("text,number,password,search,email,tel,url"),Hn=new se("",{},[]),Gn=["create","activate","update","remove","destroy"];function Xn(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&A(e.data)===A(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=A(n=e.data)&&A(n=n.attrs)&&n.type,o=A(n=t.data)&&A(n=n.attrs)&&n.type;return r===o||zn(r)&&zn(o)}(e,t)||j(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&$(t.asyncFactory.error))}function Kn(e,t,n){var r,o,i={};for(r=t;r<=n;++r)A(o=e[r].key)&&(i[o]=r);return i}var Zn={create:Yn,update:Yn,destroy:function(e){Yn(e,Hn)}};function Yn(e,t){(e.data.directives||t.data.directives)&&function(t,n){var e,r,o,i=t===Hn,a=n===Hn,s=er(t.data.directives,t.context),c=er(n.data.directives,n.context),l=[],u=[];for(e in c)r=s[e],o=c[e],r?(o.oldValue=r.value,tr(o,"update",n,t),o.def&&o.def.componentUpdated&&u.push(o)):(tr(o,"bind",n,t),o.def&&o.def.inserted&&l.push(o));if(l.length){var f=function(){for(var e=0;e<l.length;e++)tr(l[e],"inserted",n,t)};i?Qe(n,"insert",f):f()}u.length&&Qe(n,"postpatch",function(){for(var e=0;e<u.length;e++)tr(u[e],"componentUpdated",n,t)});if(!i)for(e in s)c[e]||tr(s[e],"unbind",t,t,a)}(e,t)}var Qn=Object.create(null);function er(e,t){var n,r,o,i=Object.create(null);if(!e)return i;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=Qn),(i[(o=r,o.rawName||o.name+"."+Object.keys(o.modifiers||{}).join("."))]=r).def=Ie(t.$options,"directives",r.name);return i}function tr(t,n,r,e,o){var i=t.def&&t.def[n];if(i)try{i(r.elm,t,r,e,o)}catch(e){Ne(e,r.context,"directive "+t.name+" "+n+" hook")}}var nr=[Bn,Zn];function rr(e,t){if(e.data.attrs||t.data.attrs){var n,r,o=t.elm,i=e.data.attrs||{},a=t.data.attrs||{};a.__ob__&&(a=t.data.attrs=N({},a));var s="function"==typeof o.setAttrs,c={};for(n in a)r=a[n],i[n]!==r&&(s?c[n]=r:o.setAttr(n,r));for(n in i)null==a[n]&&(s?c[n]=void 0:o.setAttr(n));s&&o.setAttrs(c)}}var or={create:rr,update:rr};function ir(e,t){var n=t.elm,r=t.context,o=t.data,i=e.data;if(o.staticClass||o.class||i&&(i.staticClass||i.class)){var a=[],s=i.staticClass;s&&a.push.apply(a,s),i.class&&a.push.apply(a,i.class);var c,l,u,f,p=[],d=o.staticClass;if(d&&p.push.apply(p,d),o.class&&p.push.apply(p,o.class),"function"==typeof n.setClassList)n.setClassList(p);else{var h=(c=a,l=p,u=r.$options.style||{},f={},l.forEach(function(e){var t=u[e];N(f,t)}),c.forEach(function(e){var t=u[e];for(var n in t)f.hasOwnProperty(n)||(f[n]="")}),f);if("function"==typeof n.setStyles)n.setStyles(h);else for(var v in h)n.setStyle(v,h[v])}}}var ar,sr,cr={create:ir,update:ir};function lr(t,e,n,r,o,i){if(r)console.log("Weex do not support event in bubble phase.");else{if(n){var a=e,s=ar;e=function(e){null!==(1===arguments.length?a(e):a.apply(null,arguments))&&ur(t,null,null,s)}}if(sr&&sr._virtualComponents){ar._context=sr;var c=e;e=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=(t[0]||{}).componentId,o=this._context;r&&this._context&&(o=(this._context._virtualComponents||{})[r]||o);try{!function(e,t,n){void 0===n&&(n=null);var r=e.fns;if(!Array.isArray(r))return"function"==typeof r?r.apply(n,t):e.apply(n,t);for(var o=r.slice(),i=0;i<o.length;i++)o[i].apply(n,t)}(c,t,o)}catch(e){Ne(e,o,"Failed to invoke virtual component handler ("+r+")")}}}ar.addEvent(t,e,i)}}function ur(e,t,n,r){(r||ar).removeEvent(e)}function fr(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};ar=t.elm,sr=t.context,Ye(n,r,lr,ur,t.context),sr=ar=void 0}}var pr={create:fr,update:fr},dr=p(h);function hr(e,t){if(e.data.style||t.data.style){var n,r,o=t.elm,i=e.data.style||{},a=t.data.style||{},s=a.__ob__;Array.isArray(a)&&(a=t.data.style=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(a)),s&&(a=t.data.style=N({},a));var c="function"==typeof o.setStyles,l={};for(r in i)a[r]||(c?l[dr(r)]="":o.setStyle(dr(r),""));for(r in a)n=a[r],c?l[dr(r)]=n:o.setStyle(dr(r),n);c&&o.setStyles(l)}}var vr={create:function(e,t){if(t.data.staticStyle){var n=t.elm,r=t.data.staticStyle,o="function"==typeof n.setStyles,i={};for(var a in r)r[a]&&(o?i[dr(a)]=r[a]:n.setStyle(dr(a),r[a]));o&&n.setStyles(i),hr(e,t)}else hr(e,t)},update:hr};function mr(e){if(e){if("object"!=typeof e)return"string"==typeof e?yr(e):void 0;var t={};return!1!==e.css&&N(t,yr(e.name||"v")),N(t,e),t}}var yr=p(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}});J&&!U&&(void 0===window.ontransitionend&&window.onwebkittransitionend,void 0===window.onanimationend&&window.onwebkitanimationend);J&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window);function gr(e,n){var r=n.elm;r._leaveCb&&(r._leaveCb.cancelled=!0,r._leaveCb());var t=mr(n.data.transition);if(t&&!r._enterCb){for(var o=t.enterClass,i=t.enterToClass,a=t.enterActiveClass,s=t.appearClass,c=t.appearToClass,l=t.appearActiveClass,u=t.beforeEnter,f=t.enter,p=t.afterEnter,d=t.enterCancelled,h=t.beforeAppear,v=t.appear,m=t.afterAppear,y=t.appearCancelled,g=dt,_=dt.$vnode;_&&_.parent;)g=(_=_.parent).context;var b=!g._isMounted||!n.isRootInsert;if(!b||v||""===v){var w=b?s:o,k=b?c:i,S=b?l:a,O=b&&h||u,C=b&&"function"==typeof v?v:f,x=b&&m||p,E=b&&y||d,$=C&&1<(C._length||C.length),A=n.context.$options.style||{},j=A[w],I=A["@TRANSITION"]&&A["@TRANSITION"][S]||{},M=function(e,t,n,r,o,i){var a={},s=t[n],c=t[r],l=t[o];if(s)for(var u in s)a[u]=e.style[u];if(l)for(var f in l)0!==f.indexOf("transition")&&(a[f]=l[f]);c&&N(a,c);return a}(r,A,w,k,S,n.context),T=0<Object.keys(M).length,P=r._enterCb=D(function(){P.cancelled?E&&E(r):x&&x(r),r._enterCb=null});if(setTimeout(function(){var e=r.parentNode,t=e&&e._pending&&e._pending[n.key];(t&&t.context===n.context&&t.tag===n.tag&&t.elm._leaveCb&&t.elm._leaveCb(),C&&C(r,P),T)?n.context.$requireWeexModule("animation").transition(r.ref,{styles:M,duration:I.duration||0,delay:I.delay||0,timingFunction:I.timingFunction||"linear"},$?R:P):$||P()},16),O&&O(r),j)if("function"==typeof r.setStyles)r.setStyles(j);else for(var F in j)r.setStyle(F,j[F]);T||$||P()}}}var _r=function(e){var r,t,g={},n=e.modules,_=e.nodeOps;for(r=0;r<Gn.length;++r)for(g[Gn[r]]=[],t=0;t<n.length;++t)A(n[t][Gn[r]])&&g[Gn[r]].push(n[t][Gn[r]]);function i(e){var t=_.parentNode(e);A(t)&&_.removeChild(t,e)}function b(e,t,n,r,o,i,a){if(A(e.elm)&&A(i)&&(e=i[a]=fe(e)),e.isRootInsert=!o,!function(e,t,n,r){var o=e.data;if(A(o)){var i=A(e.componentInstance)&&o.keepAlive;if(A(o=o.hook)&&A(o=o.init)&&o(e,!1,n,r),A(e.componentInstance))return d(e,t),j(i)&&function(e,t,n,r){for(var o,i=e;i.componentInstance;)if(i=i.componentInstance._vnode,A(o=i.data)&&A(o=o.transition)){for(o=0;o<g.activate.length;++o)g.activate[o](Hn,i);t.push(i);break}f(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var s=e.data,c=e.children,l=e.tag;if(A(l)){e.elm=e.ns?_.createElementNS(e.ns,l):_.createElement(l,e),p(e);var u=A(s)&&j(s.appendAsTree);u||(A(s)&&v(e,t),f(n,e.elm,r)),h(e,c,t),u&&(A(s)&&v(e,t),f(n,e.elm,r))}else j(e.isComment)?e.elm=_.createComment(e.text):e.elm=_.createTextNode(e.text),f(n,e.elm,r)}}function d(e,t){A(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,w(e)?(v(e,t),p(e)):(Un(e),t.push(e))}function f(e,t,n){A(e)&&(A(n)?n.parentNode===e&&_.insertBefore(e,t,n):_.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)b(t[r],n,e.elm,null,!0,t,r);else I(e.text)&&_.appendChild(e.elm,_.createTextNode(String(e.text)))}function w(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return A(e.tag)}function v(e,t){for(var n=0;n<g.create.length;++n)g.create[n](Hn,e);A(r=e.data.hook)&&(A(r.create)&&r.create(Hn,e),A(r.insert)&&t.push(e))}function p(e){var t;if(A(t=e.fnScopeId))_.setStyleScope(e.elm,t);else for(var n=e;n;)A(t=n.context)&&A(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t),n=n.parent;A(t=dt)&&t!==e.context&&t!==e.fnContext&&A(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t)}function y(e,t,n,r,o,i){for(;r<=o;++r)b(n[r],i,e,t,!1,n,r)}function k(e){var t,n,r=e.data;if(A(r))for(A(t=r.hook)&&A(t=t.destroy)&&t(e),t=0;t<g.destroy.length;++t)g.destroy[t](e);if(A(t=e.children))for(n=0;n<e.children.length;++n)k(e.children[n])}function S(e,t,n,r){for(;n<=r;++n){var o=t[n];A(o)&&(A(o.tag)?(a(o),k(o)):i(o.elm))}}function a(e,t){if(A(t)||A(e.data)){var n,r=g.remove.length+1;for(A(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&i(e)}return n.listeners=t,n}(e.elm,r),A(n=e.componentInstance)&&A(n=n._vnode)&&A(n.data)&&a(n,t),n=0;n<g.remove.length;++n)g.remove[n](e,t);A(n=e.data.hook)&&A(n=n.remove)?n(e,t):t()}else i(e.elm)}function O(e,t,n,r){for(var o=n;o<r;o++){var i=t[o];if(A(i)&&Xn(e,i))return o}}function C(e,t,n,r){if(e!==t){var o=t.elm=e.elm;if(j(e.isAsyncPlaceholder))A(t.asyncFactory.resolved)?E(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(j(t.isStatic)&&j(e.isStatic)&&t.key===e.key&&(j(t.isCloned)||j(t.isOnce)))t.componentInstance=e.componentInstance;else{var i,a=t.data;A(a)&&A(i=a.hook)&&A(i=i.prepatch)&&i(e,t);var s=e.children,c=t.children;if(A(a)&&w(t)){for(i=0;i<g.update.length;++i)g.update[i](e,t);A(i=a.hook)&&A(i=i.update)&&i(e,t)}$(t.text)?A(s)&&A(c)?s!==c&&function(e,t,n,r,o){for(var i,a,s,c=0,l=0,u=t.length-1,f=t[0],p=t[u],d=n.length-1,h=n[0],v=n[d],m=!o;c<=u&&l<=d;)$(f)?f=t[++c]:$(p)?p=t[--u]:Xn(f,h)?(C(f,h,r),f=t[++c],h=n[++l]):Xn(p,v)?(C(p,v,r),p=t[--u],v=n[--d]):Xn(f,v)?(C(f,v,r),m&&_.insertBefore(e,f.elm,_.nextSibling(p.elm)),f=t[++c],v=n[--d]):(Xn(p,h)?(C(p,h,r),m&&_.insertBefore(e,p.elm,f.elm),p=t[--u]):($(i)&&(i=Kn(t,c,u)),$(a=A(h.key)?i[h.key]:O(h,t,c,u))?b(h,r,e,f.elm,!1,n,l):Xn(s=t[a],h)?(C(s,h,r),t[a]=void 0,m&&_.insertBefore(e,s.elm,f.elm)):b(h,r,e,f.elm,!1,n,l)),h=n[++l]);u<c?y(e,$(n[d+1])?null:n[d+1].elm,n,l,d,r):d<l&&S(0,t,c,u)}(o,s,c,n,r):A(c)?(A(e.text)&&_.setTextContent(o,""),y(o,null,c,0,c.length-1,n)):A(s)?S(0,s,0,s.length-1):A(e.text)&&_.setTextContent(o,""):e.text!==t.text&&_.setTextContent(o,t.text),A(a)&&A(i=a.hook)&&A(i=i.postpatch)&&i(e,t)}}}function x(e,t,n){if(j(n)&&A(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var m=s("attrs,class,staticClass,staticStyle,key");function E(e,t,n,r){var o,i=t.tag,a=t.data,s=t.children;if(r=r||a&&a.pre,t.elm=e,j(t.isComment)&&A(t.asyncFactory))return t.isAsyncPlaceholder=!0;if(A(a)&&(A(o=a.hook)&&A(o=o.init)&&o(t,!0),A(o=t.componentInstance)))return d(t,n),!0;if(A(i)){if(A(s))if(e.hasChildNodes())if(A(o=a)&&A(o=o.domProps)&&A(o=o.innerHTML)){if(o!==e.innerHTML)return!1}else{for(var c=!0,l=e.firstChild,u=0;u<s.length;u++){if(!l||!E(l,s[u],n,r)){c=!1;break}l=l.nextSibling}if(!c||l)return!1}else h(t,s,n);if(A(a)){var f=!1;for(var p in a)if(!m(p)){f=!0,v(t,n);break}!f&&a.class&&Ge(a.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,r,o,i){if(!$(t)){var a,s=!1,c=[];if($(e))s=!0,b(t,c,o,i);else{var l=A(e.nodeType);if(!l&&Xn(e,t))C(e,t,c,r);else{if(l){if(1===e.nodeType&&e.hasAttribute(M)&&(e.removeAttribute(M),n=!0),j(n)&&E(e,t,c))return x(t,c,!0),e;a=e,e=new se(_.tagName(a).toLowerCase(),{},[],void 0,a)}var u=e.elm,f=_.parentNode(u);if(b(t,c,u._leaveCb?null:f,_.nextSibling(u)),A(t.parent))for(var p=t.parent,d=w(t);p;){for(var h=0;h<g.destroy.length;++h)g.destroy[h](p);if(p.elm=t.elm,d){for(var v=0;v<g.create.length;++v)g.create[v](Hn,p);var m=p.data.hook.insert;if(m.merged)for(var y=1;y<m.fns.length;y++)m.fns[y]()}else Un(p);p=p.parent}A(f)?S(0,[e],0,0):A(e.tag)&&k(e)}}return x(t,c,s),t.elm}A(e)&&k(e)}}({nodeOps:qn,modules:[or,cr,pr,vr,{create:gr,activate:gr,remove:function(n,e){var r=n.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var t=mr(n.data.transition);if(!t)return e();if(r._leaveCb)return;var o=t.leaveClass,i=t.leaveToClass,a=t.leaveActiveClass,s=t.beforeLeave,c=t.leave,l=t.afterLeave,u=t.leaveCancelled,f=t.delayLeave,p=c&&1<(c._length||c.length),d=n.context.$options.style||{},h=d[o],v=d[i]||d[a],m=d["@TRANSITION"]&&d["@TRANSITION"][a]||{},y=r._leaveCb=D(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[n.key]=null),y.cancelled?u&&u(r):(e(),l&&l(r)),r._leaveCb=null});f?f(g):g();function g(){var e=n.context.$requireWeexModule("animation");function t(){e.transition(r.ref,{styles:v,duration:m.duration||0,delay:m.delay||0,timingFunction:m.timingFunction||"linear"},p?R:y)}y.cancelled||(n.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[n.key]=n),s&&s(r),h?e.transition(r.ref,{styles:h},t):t(),c&&c(r,y),v||p||y())}}}].concat(nr),LONG_LIST_THRESHOLD:10}),br=Object.getOwnPropertyNames(de);function wr(e,r){var o=e.$el;return o&&"function"==typeof o[r]?function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)}:(te("Can't find component method \""+r+'" on '+o.type),R)}function kr(n,r){Array.isArray(r)&&(!function(p,n){for(var e=function(e,t){var f=br[e];P(n,f,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this.length,o=de[f];"function"==typeof o&&o.apply(this,t);var i=wr(p,"removeData"),a=wr(p,"insertRange"),s=wr(p,"setListData");switch(f){case"push":a(r,t);break;case"pop":i(r-1,1);break;case"shift":i(0,1);break;case"unshift":a(0,t);break;case"splice":var c=t[0],l=t[1],u=t.slice(2);0<l&&i(c,l),0<u.length&&a(c,u);break;case"sort":case"reverse":s(this.slice())}})},t=0,r=br.length;t<r;t++)e(t)}(n,r),r.forEach(function(t,e){u(t)&&!f(t,"[[Watched]]")&&(P(t,"[[Watched]]",!0),n.$watch(function(){for(var e in t)t[e]},function(){wr(n,"updateData")(r.indexOf(t),t)},{deep:!0}))}))}var Sr={name:"recycle-list",methods:{closest:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).closest.apply(e,n)},queryElement:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).queryElement.apply(e,n)},queryElementAll:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).queryElementAll.apply(e,n)},scrollToElement:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).scrollToElement.apply(e,n)},resetLoadmore:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).resetLoadmore.apply(e,n)}},render:function(e){var t=this;if(this._vnode&&this.$options["[[UseCache]]"])return P(this.$options,"[[UseCache]]",!1),this._vnode;var n=this.$options.parent,r=this.$attrs.bindingExpression;return n&&r&&(n.$watch(r,function(){return P(t.$options,"[[UseCache]]",!0)},{deep:!0,immediate:!0}),kr(this,this.$attrs.listData),n.$watch(r,function(e){kr(t,e)})),this._events._attach_slot=function(e){nn(t.$parent||t,e.position,e.refs)},this._events._detach_slot=function(e){nn(t.$parent||t,e.position,e.refs,!0)},e("weex:recycle-list",{on:this._events},this.$slots.default)},renderError:function(e,t){return e("text",{style:{fontSize:"36px",color:"#FF0000"},value:t.toString()})}};function Or(e){if(e.length)return e.map(function(e){var t,n,r=(t=e).tag?t.tag.replace(/vue\-component\-(\d+\-)?/,""):"",o={type:r};if(r){if(o.style=function(e){if(e&&e.data){var t=e.data,n=t.staticStyle,r=t.staticClass;if(e.data.style||e.data.class||n||r){var o=Object.assign({},n,e.data.style),i=e.context.$options.style||{};return[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])}),o}}}(e),e.data&&(o.attr=e.data.attrs,e.data.on&&(o.events=e.data.on)),"span"===r&&((n=e).children&&1===n.children.length&&!n.children[0].tag))return o.attr=o.attr||{},o.attr.value=e.children[0].text.trim(),o}else o.type="span",o.attr={value:(e.text||"").trim()};return e.children&&e.children.length&&(o.children=Or(e.children)),o})}var Cr={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:Or(this.$options._renderChildren||[])}})}},xr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Er(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Er(it(t.children)):e}function $r(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[h(i)]=o[i];return t}function Ar(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var jr={name:"transition",props:xr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag||ot(e)})).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=Er(o);if(!i)return o;if(this._leaving)return Ar(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:I(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s,c,l=(i.data||(i.data={})).transition=$r(this),u=this._vnode,f=Er(u);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),f&&f.data&&(s=i,(c=f).key!==s.key||c.tag!==s.tag)&&!ot(f)&&(!f.componentInstance||!f.componentInstance._vnode.isComment)){var p=f.data.transition=N({},l);if("out-in"===r)return this._leaving=!0,Qe(p,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),Ar(e,o);if("in-out"===r){if(ot(i))return u;var d,h=function(){d()};Qe(l,"afterEnter",h),Qe(l,"enterCancelled",h),Qe(p,"delayLeave",function(e){d=e})}}return o}}},Ir=N({tag:String,moveClass:String},xr);delete Ir.mode;var Mr={RecycleList:Sr,Richtext:Cr,Transition:jr,TransitionGroup:{props:Ir,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(r){return new Promise(function(t,n){e.getComponentRect(r.ref,function(e){e.result?t(e.size):n(new Error("failed to get rect for element: "+r.tag))})})};var r=this.$requireWeexModule("animation");this.animate=function(t,n){return new Promise(function(e){r.transition(t.ref,n,e)})}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=$r(this),s=0;s<o.length;s++){var c=o[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(i.push(c),((n[c.key]=c).data||(c.data={})).transition=a)}if(r){var l=[],u=[];r.forEach(function(e){e.data.transition=a,n[e.key]?l.push(e):u.push(e)}),this.kept=e(t,null,l),this.removed=u}return e(t,null,i)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.getMoveData(e[0].context,t)},methods:{getMoveData:function(e,t){var n=e.$options.style||{};return n["@TRANSITION"]&&n["@TRANSITION"][t]}}}},Tr=s("template,script,style,element,content,slot,link,meta,svg,view,a,div,img,image,text,span,input,switch,textarea,spinner,select,slider,slider-neighbor,indicator,canvas,list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown",!0),Pr=(s("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),s("richtext,transition,transition-group,recycle-list",!0));s("embed,img,image,input,link,meta",!0);function Fr(e){return!(!e.$options||!e.$options.el)}An.mixin({beforeCreate:function(){Fr(this)&&Ue()},destroyed:function(){Fr(this)&&(Je.length=0,Le=Ve=null,Be=We=!1)}}),An.config.mustUseProp=function(e,t,n){return!1},An.config.isReservedTag=Tr,An.config.isRuntimeComponent=Pr,An.config.isUnknownElement=function(e){return!1},An.options.directives={},An.options.components=Mr,An.prototype.__patch__=_r,An.prototype.$mount=function(e,t){return n=this,r=e&&(i=this.$document,(a=i.createComment("root")).hasAttribute=a.removeAttribute=function(){},i.documentElement.appendChild(a),a),o=t,n.$el=r,n.$options.render||(n.$options.render=le),yt(n,"beforeMount"),new xt(n,function(){n._update(n._render(),o)},R,null,!0),o=!1,null==n.$vnode&&(n._isMounted=!0,yt(n,"mounted")),n;var n,r,o,i,a},e.Vue=An}});e(gr);var _r=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var f={};t.createInstanceContext=function(e,t,n){void 0===n&&(n={});var r,o,i,a,s=t.weex,c=(f[e]={instanceId:e,config:s.config,document:s.document,data:n}).Vue=function(e,t){var n={};gr(n,t.document);var r=n.Vue,o=f[e],i=/^weex:/i,a=r.config.isReservedTag||function(){return!1},s=r.config.isRuntimeComponent||function(){return!1};return r.config.isReservedTag=function(e){return!s(e)&&t.supports("@component/"+e)||a(e)||i.test(e)},r.config.parsePlatformTagName=function(e){return e.replace(i,"")},r.prototype.$instanceId=e,r.prototype.$document=o.document,r.prototype.$requireWeexModule=t.requireModule,r.mixin({beforeCreate:function(){var e=this.$options;if(e.el){var t=e.data,n=("function"==typeof t?t():t)||{};e.data=Object.assign(n,o.data),o.app=this}},mounted:function(){if(this.$options.el&&t.document&&o.app===this)try{t.document.taskCenter.send("dom",{action:"createFinish"},[])}catch(e){}}}),r.prototype.$getConfig=function(){if(o.app instanceof r)return o.config},r}(e,s),l=(r=e,o=s.requireModule,i=f[r],a=o("timer"),{setTimeout:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){a.clearTimeout(e)},clearInterval:function(e){a.clearInterval(e)}}),u=Object.assign({Vue:c},l);return Object.freeze(u),u},t.destroyInstance=function(e){var t=f[e];if(t&&t.app instanceof t.Vue){try{t.app.$destroy(),t.document.destroy()}catch(e){}delete t.document,delete t.app}delete f[e]},t.refreshInstance=function(e,t){var n=f[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");if(n.Vue&&n.Vue.set)for(var r in t)n.Vue.set(n.app,r,t[r]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])}}),br=e(_r),wr=_r.createInstanceContext,kr=_r.destroyInstance,Sr=_r.refreshInstance,Or=Object.freeze({default:br,__moduleExports:_r,createInstanceContext:wr,destroyInstance:kr,refreshInstance:Sr});var Cr=Object.freeze({$:function(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm},$el:function(e){var t=this._ids[e];if(t)return t.el},$vm:function(e){var t=this._ids[e];if(t)return t.vm},$renderThen:function(e){return this._app.differ.then(function(){e()})},$scrollTo:function(e,t){console.warn("[JS Framework] Vm#$scrollTo is deprecated, please use \"require('@weex-module/dom').scrollTo(el, options)\" instead");var n=this.$el(e);n&&this._app.requireModule("dom").scrollToElement(n.ref,{offset:t})},$transition:function(e,n,r){var o=this,i=this.$el(e);i&&n&&n.styles&&this._app.requireModule("animation").transition(i.ref,n,function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];o._setStyle(i,n.styles),r&&r.apply(void 0,e)})},$getConfig:function(e){var t=this._app.options;return"function"==typeof e&&(console.warn("[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, this api now can directly RETURN config info."),e(t)),t},$sendHttp:function(e,t){console.warn("[JS Framework] Vm#$sendHttp is deprecated, please use \"require('@weex-module/stream').sendHttp(params, callback)\" instead"),this._app.requireModule("stream").sendHttp(e,t)},$openURL:function(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead"),this._app.requireModule("event").openURL(e)},$setTitle:function(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead"),this._app.requireModule("pageInfo").setTitle(e)},$call:function(e,t){for(var n=[],r=arguments.length-2;0<r--;)n[r]=arguments[r+2];console.warn("[JS Framework] Vm#$call is deprecated, please use \"require('@weex-module/moduleName')\" instead");var o=this._app.requireModule(e);o&&o[t]&&o[t].apply(o,n)}});function xr(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];if("function"==typeof Object.assign)Object.assign.apply(Object,[e].concat(t));else{var r=t.shift();for(var o in r)e[o]=r[o];t.length&&xr.apply(void 0,[e].concat(t))}return e}function Er(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function $r(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var Ar=Object.prototype.hasOwnProperty;function jr(e,t){return Ar.call(e,t)}function Ir(n,r){return function(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}}function Mr(e){return null!==e&&"object"==typeof e}var Tr=Object.prototype.toString,Pr="[object Object]";function Fr(e){return Tr.call(e)===Pr}function Nr(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}var Rr,Dr="__proto__"in{};function Vr(){return"object"==typeof nativeSet?nativeSet.create():new Rr}function Lr(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}"undefined"!=typeof Set&&Set.toString().match(/native code/)?Rr=Set:((Rr=function(){this.set=Object.create(null)}).prototype.has=function(e){return void 0!==this.set[e]},Rr.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},Rr.prototype.clear=function(){this.set=Object.create(null)});var Jr=/^@weex-component\//,Wr=/^@weex-module\//,qr=/^\.{1,2}\//,Br=/\.js$/,Ur=function(e){return!!e.match(Jr)},zr=function(e){return!!e.match(Wr)},Hr=function(e){return!!e.match(qr)},Gr=function(e){return!Ur(e)&&!zr(e)&&!Hr(e)};function Xr(e){return e.replace(Jr,"").replace(Wr,"")}function Kr(e){return e.replace(Br,"")}var Zr=0;function Yr(){this.id=Zr++,this.subs=[]}Yr.target=null;var Qr=[];function eo(){Yr.target=null,Qr=[]}Yr.prototype.addSub=function(e){this.subs.push(e)},Yr.prototype.removeSub=function(e){$r(this.subs,e)},Yr.prototype.depend=function(){Yr.target&&Yr.target.addDep(this)},Yr.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var to=0;function no(e,t,n,r){r&&xr(this,r);var o="function"==typeof t;(this.vm=e)._watchers.push(this),this.expression=t,this.cb=n,this.id=++to,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=Vr(),this.newDepIds=Vr(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}no.prototype.get=function(){var e;e=this,Yr.target&&Qr.push(Yr.target),Yr.target=e;var t=this.getter.call(this.vm,this.vm);return this.deep&&function e(t,n){var r,o,i,a;n||(n=ro).clear();i=Array.isArray(t);a=Mr(t);if(i||a){if(t.__ob__){var s=t.__ob__.dep.id;if(n.has(s))return;n.add(s)}if(i)for(r=t.length;r--;)e(t[r],n);else if(a)for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}}(t),Yr.target=Qr.pop(),this.cleanupDeps(),t},no.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},no.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},no.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},no.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(Mr(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},no.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},no.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},no.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||$r(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1,this.vm=this.cb=this.value=null}};var ro=Vr();var oo=Array.prototype,io=Object.create(oo);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=oo[a];Er(io,a,function(){for(var e=arguments,t=arguments.length,n=new Array(t);t--;)n[t]=e[t];var r,o=s.apply(this,n),i=this.__ob__;switch(a){case"push":case"unshift":r=n;break;case"splice":r=n.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})}),Er(oo,"$set",function(e,t){return console.warn('[JS Framework] "Array.prototype.$set" is not a standard API, it will be removed in the next version.'),e>=this.length&&(this.length=e+1),this.splice(e,1,t)[0]}),Er(oo,"$remove",function(e){console.warn('[JS Framework] "Array.prototype.$remove" is not a standard API, it will be removed in the next version.'),this.length&&("number"!=typeof e&&(e=this.indexOf(e)),-1<e&&this.splice(e,1))});var ao=Object.getOwnPropertyNames(io);function so(e){(this.value=e,this.dep=new Yr,Er(e,"__ob__",this),Array.isArray(e))?((Dr?co:lo)(e,io,ao),this.observeArray(e)):this.walk(e)}function co(e,t){e.__proto__=t}function lo(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];Er(e,i,t[i])}}function uo(e,t){var n;if(Mr(e))return jr(e,"__ob__")&&e.__ob__ instanceof so?n=e.__ob__:(Array.isArray(e)||Fr(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new so(e)),n&&t&&n.addVm(t),n}so.prototype.walk=function(e){for(var t in e)this.convert(t,e[t])},so.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)uo(e[t])},so.prototype.convert=function(e,t){!function(o,e,i){var a=new Yr,t=Object.getOwnPropertyDescriptor(o,e);if(t&&!1===t.configurable)return;var s=t&&t.get,n=t&&t.set,c=uo(i);Object.defineProperty(o,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(o):i;if(Yr.target&&(a.depend(),c&&c.dep.depend(),Array.isArray(e)))for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend();return e},set:function(e){var t=s?s.call(o):i;e!==t&&(n?n.call(o,e):i=e,c=uo(e),a.notify())}})}(this.value,e,t)},so.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},so.prototype.removeVm=function(e){$r(this.vms,e)};var fo=["$index","$value","$event"];function po(t,n){(-1<fo.indexOf(n)||!Nr(n))&&Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return t._data[n]},set:function(e){t._data[n]=e}})}function ho(e){var t=e._data;Fr(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)po(e,n[r]);uo(t,e)}function vo(){}function mo(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};o.set="function"==typeof r?(o.get=yo(r,e),vo):(o.get=r.get?!1!==r.cache?yo(r.get,e):Ir(r.get,e):vo,r.set?Ir(r.set,e):vo),Object.defineProperty(e,n,o)}}function yo(e,t){var n=new no(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Yr.target&&n.depend(),n.value}}var go={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},_o=go.nativeComponentMap,bo={attr:"setAttr",style:"setStyle",event:"addEvent"};function wo(e,t,n){var r,o,i,a,s,c;Oo(e,t,n.id,e),r=e,o=t,i=n.attr,xo(r,o,"attr",i),function(e,t,n){if("function"!=typeof n&&!Array.isArray(n))return;if(Array.isArray(n)&&!n.length)return t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=$o(e,n,function(e){Co(t,r,e)});Co(t,r,o)}else Co(t,r,n)}(e,t,n.classList),a=e,s=t,c=n.style,xo(a,s,"style",c),function(e,t,n){if(!n)return;var r=Object.keys(n),o=r.length;for(;o--;){var i=r[o],a=n[i];"string"==typeof a&&((a=e[a])||console.warn('[JS Framework] The event handler "'+a+'" is not defined.')),s=e,c=i,l=a,t.addEvent(c,Ir(l,s))}var s,c,l}(e,t,n.events)}function ko(e,t,n,r){void 0===r&&(r={}),function(e,t,n){var r=t._options&&t._options.style||{};if(!n._rootEl)return;var o="@originalRootEl";function i(e,t){"array"===Lr(e)&&e.unshift(t)}if(r[o]=n._rootEl.classStyle,"function"==typeof e){var a=$o(t,e,function(e){i(e,o),Co(n._rootEl,r,e)});i(a,o),Co(n._rootEl,r,a)}else null!=e&&(i(e,o),Co(n._rootEl,r,e))}(n.classList,e,t),function(r,o,i){var e=function(t){var e=r[t];if("function"==typeof e){var n=$o(o,e,function(e){i._rootEl&&i._rootEl.setStyle(t,e)});i._rootEl.setStyle(t,n)}else i._rootEl&&i._rootEl.setStyle(t,e)};for(var t in r)e(t)}(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function So(r,o,i,a){if(r){var e=function(t){if(!o||o[t]){var e=r[t];if("function"==typeof e){var n=$o(i,e,function(e){a[t]=e});a[t]=n}else a[t]=e}};for(var t in r)e(t)}}function Oo(t,e,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return e||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;((n=i.call(t))||0===n)&&(t._ids[n]=o),$o(t,i,function(e){e&&(t._ids[e]=o)})}else n&&"string"==typeof n&&(t._ids[n]=o)}function Co(e,n,r){"string"==typeof r&&(r=r.split(/\s+/)),r.forEach(function(e,t){r.splice.apply(r,[t,1].concat(e.split(/\s+/)))});for(var o={},t=r.length,i=function(e){var t=n[r[e]];t&&Object.keys(t).forEach(function(e){o[e]=t[e]})},a=0;a<t;a++)i(a);e.setClassStyle(o)}function xo(e,t,n,r){if(r)for(var o=Object.keys(r),i=o.length;i--;){var a=o[i],s=r[a];"function"==typeof s?Eo(e,t,n,a,s):t[bo[n]](a,s)}}function Eo(r,o,e,i,t){var a=bo[e],n=$o(r,t,function(e){function t(){o[a](i,e)}var n=r&&r._app&&r._app.differ;n?n.append("element",o.depth||0,o.ref,t):t()});o[a](i,n)}function $o(e,t,n){return e._static?t.call(e,e):new no(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function Ao(e,t){var n=e._app.doc.createComment("start"),r=e._app.doc.createComment("end"),o=jo++;if(t.element){var i=t.updateMark;i?(i.element&&(i=i.end),t.element.insertAfter(r,i),t.element.insertAfter(n,i),t.updateMark=r):(t.element.insertBefore(n,t.end),t.element.insertBefore(r,t.end)),t=t.element}else t.appendChild(n),t.appendChild(r);return{start:n,end:r,element:t,blockId:o}}var jo=1;function Io(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=Mo(e,t,o);return n.updateMark=t.element?t.end:t,i}if(!t.element)return n.element.insertBefore(t,r);n.element.insertBefore(t.start,r),n.element.insertBefore(t.end,r)}else{if(!t.element)return n.appendChild(t);n.appendChild(t.start),n.appendChild(t.end)}}function Mo(e,t,n){return t.element?function(e,t){var n=t.parentNode;if(n){for(var r,o=e.start,i=[o];o&&o!==e.end;)o=o.nextSibling,i.push(o);var a=t;return i.every(function(e){return r=n.insertAfter(e,a),a=e,-1!==r}),r}}(t,n):function(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}(t,n)}function To(e,t,n){void 0===n&&(n=!1),t.element?function(e,t){void 0===t&&(t=!1);var n=[],r=e.start.nextSibling;for(;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||Po(e.start);n.forEach(function(e){Po(e)}),t||Po(e.end)}(t,n):Po(t),t._vm&&t._vm.$emit("hook:destroyed")}function Po(e){var t=e.parentNode;t&&t.removeChild(e)}function Fo(e,t,n,r){if(-1!==(e._app||{}).lastSignal){if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),c=t,Array.isArray(c))return i=t,a=r,s=Ao(o=e,n),void i.forEach(function(e){Fo(o,e,s,a)});var o,i,a,s,c,l,u,f;if(r=r||{},"content"===(l=t).type||"slot"===l.type)return console.debug('[JS Framework] compile "content" block by',t),void(e._content=Ao(e,n));if(u=t,!r.hasOwnProperty("repeat")&&u.repeat)return console.debug('[JS Framework] compile "repeat" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `repeat` directive!"):function(e,t,n){var r=t.repeat,o="function"==typeof r,i=r.getter||r.expression||r;"function"!=typeof i&&(i=function(){return[]});var a=r.key||"$index",s=r.value||"$value",c=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,l=Ao(e,n);l.children=[],l.data=[],l.vms=[],function(c,i,l,e){var u=l.vms,f=l.children,t=e.getter,p=e.trackBy,d=e.oldStyle,h=e.key,v=e.value;function m(e,t,n){var r;d?Mr(r=e)?(r[h]=t,r.hasOwnProperty("INDEX")||Object.defineProperty(r,"INDEX",{value:function(){console.warn('[JS Framework] "INDEX" in repeat is deprecated, please use "$index" instead')}})):(console.warn("[JS Framework] Each list item must be an object in old-style repeat, please use `repeat={{v in list}}` instead."),(r={})[h]=t,r[v]=e):((r={})[h]=t,r[v]=e);var o=function(e,t){var n=Object.create(e);n._data=t,ho(n),mo(n),(n._realParent=e)._static&&(n._static=e._static);return n}(n,r);u.push(o),Fo(o,i,l,{repeat:e})}var n=Ro(c,l,t,"repeat",function(e){if(console.debug('[JS Framework] the "repeat" item has changed',e),l&&e){var r=f.slice(),o=u.slice(),t=l.data.slice(),i={},a={};e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;null!=n&&""!==n&&(i[n]=e)});var s=[];t.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;i.hasOwnProperty(n)?(a[n]={item:e,index:t,key:n,target:r[t],vm:o[t]},s.push(e)):To(0,r[t])}),f.length=0,u.length=0,l.data=e.slice(),l.updateMark=l.start,e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t,r=a[n];r?(r.item===s[0]?s.shift():(s.$remove(r.item),Mo(0,r.target,l.updateMark)),f.push(r.target),u.push(r.vm),d?r.vm=e:r.vm[v]=e,r.vm[h]=t,l.updateMark=r.target):m(e,t,c)}),delete l.updateMark}});l.data=n.slice(0),n.forEach(function(e,t){m(e,t,c)})}(e,t,l,{getter:i,key:a,value:s,trackBy:c,oldStyle:o})}(e,t,n));if(f=t,!r.hasOwnProperty("shown")&&f.shown)return console.debug('[JS Framework] compile "if" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `if` directive!"):function(e,t,n,r){var o={shown:!0},i=Ao(e,n);n.element&&n.children&&n.children.push(i);r.repeat&&(o.repeat=r.repeat);a=e,s=t,c=i,l=o,u=Ro(a,c,s.shown,"shown",function(e){console.debug('[JS Framework] the "if" item was changed',e),c&&!!c.display!=!!e&&(c.display=!!e,e?Fo(a,s,c,l):To(0,c,!0))}),c.display=!!u,u&&Fo(a,s,c,l);var a,s,c,l,u}(e,t,n,r));var p=r.type||t.type;if(d=r,"function"!=typeof p||d.hasOwnProperty("type")){var d,h,v,m,y,g,_,b,w=p,k=function(e,t,n){var r;e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]);e._options&&e._options.components&&(r=e._options.components[n]);t.component&&(r=r||{});return r}(e,t,w);if(k)return console.debug("[JS Framework] compile composed component by",t),v=k,m=t,y=n,g=w,_=r,b=new(h=e).constructor(g,v,h,y,void 0,{"hook:init":function(){h._static&&(this._static=h._static),Oo(h,null,m.id,this),this._externalBinding={parent:h,template:m}},"hook:created":function(){!function(e,t,n,r){n=n||{};var o=((t=t||{})._options||{}).props;Array.isArray(o)&&(o=o.reduce(function(e,t){return e[t]=!0,e},{})),So(r,o,e,t),So(n.attr,o,e,t)}(h,this,m,_.repeat)},"hook:ready":function(){this._content&&No(h,m,this._content)}}),void ko(h,b,m,y);console.debug("[JS Framework] compile native component by",t),function(e,t,n,r){var o;(function(e){var t=e.type,n=_o[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===Lr(e[r])&&"object"===Lr(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])})(t),o="_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),a=r,e._app.doc.createBody(a)):(console.debug("[JS Framework] compile to create element for "+r),i=r,e._app.doc.createElement(i));var i;var a;if(!e._rootEl){e._rootEl=o;var s=e._externalBinding||{},c=s.template,l=s.parent;if(c&&c.events&&l&&o)for(var u in c.events){var f=l[c.events[u]];f&&o.addEvent(u,Ir(f,l))}}wo(e,o,t),t.attr&&t.attr.append&&(t.append=t.attr.append);t.append&&(o.attr=o.attr||{},o.attr.append=t.append);var p="tree"===t.append,d=e._app||{};-1===d.lastSignal||p||(console.debug("[JS Framework] compile to append single node for",o),d.lastSignal=Io(e,o,n));-1!==d.lastSignal&&No(e,t,o);-1!==d.lastSignal&&p&&(console.debug("[JS Framework] compile to append whole tree for",o),d.lastSignal=Io(e,o,n))}(e,t,n,w)}else!function(n,r,e,t,o){var i=xr({type:t.call(n)},o),a=Ao(n,e);e.element&&e.children&&e.children.push(a);$o(n,t,function(e){var t=xr({type:e},o);To(0,a,!0),Fo(n,r,a,t)}),Fo(n,r,a,i)}(e,t,n,p,r)}}function No(t,e,n){var r=t._app||{},o=e.children;o&&o.length&&o.every(function(e){return Fo(t,e,n),-1!==r.lastSignal})}function Ro(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return $o(e,n,function(e){a.latestValue=e,i&&!a.recorded&&i.append(r,s,t.blockId,function(){var e=a.latestValue;o(e),a.recorded=!1,a.latestValue=void 0}),a.recorded=!0})}function Do(e,t){if(t instanceof Do)return t;this.timestamp=Date.now(),this.detail=t,this.type=e;var n=!1;this.stop=function(){n=!0},this.hasStopped=function(){return n}}function Vo(e,t){var n=this,r=this._vmEvents[e];if(r){var o=new Do(e,t);r.forEach(function(e){e.call(n,o)})}}function Lo(e,t){var n=new Do(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Jo(t,e){var n=new Do(t,e);this.$emit(t,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(e){e.$broadcast(t,n)})}function Wo(e,t){if(e&&"function"==typeof t){var n=this._vmEvents,r=n[e]||[];r.push(t),n[e]=r,"hook:ready"===e&&this._ready&&this.$emit("hook:ready")}}function qo(e,t){if(e){var n=this._vmEvents;if(t){var r=n[e];r&&r.$remove(t)}else delete n[e]}}var Bo,Uo=["init","created","ready","destroyed"];function zo(e,t,n,r,o,i){n=n||{},this._parent=n._realParent?n._realParent:n,this._app=n._app||{},n._childrenVms&&n._childrenVms.push(this),!t&&this._app.customComponentMap&&(t=this._app.customComponentMap[e]);var a,s,c,l,u=(t=t||{}).data||{};(this._options=t,this._methods=t.methods||{},this._computed=t.computed||{},this._css=t.style||{},this._ids={},this._vmEvents={},this._childrenVms=[],this._type=e,function(t,e){var n=t._options||{},r=n.events||{};for(var o in r)t.$on(o,r[o]);for(var i in e)t.$on(i,e[i]);Uo.forEach(function(e){t.$on("hook:"+e,n[e])})}(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof u?u():u,o&&xr(this._data,o),(a=this)._watchers=[],ho(a),mo(a),function(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}(a),console.debug('[JS Framework] "created" lifecycle in Vm('+this._type+")"),this.$emit("hook:created"),this._created=!0,t.methods&&t.methods.ready&&(console.warn('"exports.methods.ready" is deprecated, please use "exports.created" instead'),t.methods.ready.call(this)),this._app.doc)&&(this._parentEl=r||this._app.doc.documentElement,c=(s=this)._options||{},l=c.template||{},c.replace?l.children&&1===l.children.length?Fo(s,l.children[0],s._parentEl):Fo(s,l.children,s._parentEl):Fo(s,l,s._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+s._type+")"),s.$emit("hook:ready"),s._ready=!0)}(Bo=zo.prototype).$emit=Vo,Bo.$dispatch=Lo,Bo.$broadcast=Jo,Bo.$on=Wo,Bo.$off=qo,zo.prototype.$watch=function(e,t){$o(this,e,t)},zo.set=function e(t,n,r){if(Array.isArray(t))return t.splice(n,1,r);if(jr(t,n))t[n]=r;else if(t._isVue)e(t._data,n,r);else{var o=t.__ob__;if(o){if(o.convert(n,r),o.dep.notify(),o.vms)for(var i=o.vms.length;i--;)po(o.vms[i],n);return r}t[n]=r}},zo.delete=function(e,t){if(jr(e,t)){delete e[t];var n=e.__ob__;if(n){if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;)o=n.vms[r],Nr(i=t)||delete o[i]}else e._isVue&&delete e._data[t]}var o,i};var Ho={};function Go(n,r){var e=function(e){var t=Ho[e];t||(t={},Ho[e]=t),Array.isArray(n[e])&&n[e].forEach(function(e){"string"==typeof e&&(e={name:e}),t[e.name]&&!r||(t[e.name]=e)})};for(var t in n)e(t)}function Xo(e,t){return e.customComponentMap[t]}function Ko(e,t,n){var r=e.customComponentMap;r[t]?console.error("[JS Framework] define a component("+t+") that already exists"):r[t]=n}var Zo=n(function(e,r){var f;r=e.exports=H,"object"==typeof process&&process.env,f=function(){},r.SEMVER_SPEC_VERSION="2.0.0";var o=256,i=Number.MAX_SAFE_INTEGER||9007199254740991,c=r.re=[],t=r.src=[],n=0,a=n++;t[a]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var l=n++;t[l]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var u=n++;t[u]="("+t[a]+")\\.("+t[a]+")\\.("+t[a]+")";var p=n++;t[p]="("+t[s]+")\\.("+t[s]+")\\.("+t[s]+")";var d=n++;t[d]="(?:"+t[a]+"|"+t[l]+")";var h=n++;t[h]="(?:"+t[s]+"|"+t[l]+")";var v=n++;t[v]="(?:-("+t[d]+"(?:\\."+t[d]+")*))";var m=n++;t[m]="(?:-?("+t[h]+"(?:\\."+t[h]+")*))";var y=n++;t[y]="[0-9A-Za-z-]+";var g=n++;t[g]="(?:\\+("+t[y]+"(?:\\."+t[y]+")*))";var _=n++,b="v?"+t[u]+t[v]+"?"+t[g]+"?";t[_]="^"+b+"$";var w="[v=\\s]*"+t[p]+t[m]+"?"+t[g]+"?",k=n++;t[k]="^"+w+"$";var S=n++;t[S]="((?:<|>)?=?)";var O=n++;t[O]=t[s]+"|x|X|\\*";var C=n++;t[C]=t[a]+"|x|X|\\*";var x=n++;t[x]="[v=\\s]*("+t[C]+")(?:\\.("+t[C]+")(?:\\.("+t[C]+")(?:"+t[v]+")?"+t[g]+"?)?)?";var E=n++;t[E]="[v=\\s]*("+t[O]+")(?:\\.("+t[O]+")(?:\\.("+t[O]+")(?:"+t[m]+")?"+t[g]+"?)?)?";var $=n++;t[$]="^"+t[S]+"\\s*"+t[x]+"$";var A=n++;t[A]="^"+t[S]+"\\s*"+t[E]+"$";var j=n++;t[j]="(?:^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])";var I=n++;t[I]="(?:~>?)";var M=n++;t[M]="(\\s*)"+t[I]+"\\s+",c[M]=new RegExp(t[M],"g");var T=n++;t[T]="^"+t[I]+t[x]+"$";var P=n++;t[P]="^"+t[I]+t[E]+"$";var F=n++;t[F]="(?:\\^)";var N=n++;t[N]="(\\s*)"+t[F]+"\\s+",c[N]=new RegExp(t[N],"g");var R=n++;t[R]="^"+t[F]+t[x]+"$";var D=n++;t[D]="^"+t[F]+t[E]+"$";var V=n++;t[V]="^"+t[S]+"\\s*("+w+")$|^$";var L=n++;t[L]="^"+t[S]+"\\s*("+b+")$|^$";var J=n++;t[J]="(\\s*)"+t[S]+"\\s*("+w+"|"+t[x]+")",c[J]=new RegExp(t[J],"g");var W=n++;t[W]="^\\s*("+t[x]+")\\s+-\\s+("+t[x]+")\\s*$";var q=n++;t[q]="^\\s*("+t[E]+")\\s+-\\s+("+t[E]+")\\s*$";var B=n++;t[B]="(<|>)?=?\\s*\\*";for(var U=0;U<35;U++)f(U,t[U]),c[U]||(c[U]=new RegExp(t[U]));function z(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof H)return e;if("string"!=typeof e)return null;if(e.length>o)return null;if(!(t.loose?c[k]:c[_]).test(e))return null;try{return new H(e,t)}catch(e){return null}}function H(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof H){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>o)throw new TypeError("version is longer than "+o+" characters");if(!(this instanceof H))return new H(e,t);f("SemVer",e,t),this.options=t,this.loose=!!t.loose;var n=e.trim().match(t.loose?c[k]:c[_]);if(!n)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>i||this.major<0)throw new TypeError("Invalid major version");if(this.minor>i||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>i||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map(function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(0<=t&&t<i)return t}return e}):this.prerelease=[],this.build=n[5]?n[5].split("."):[],this.format()}r.parse=z,r.valid=function(e,t){var n=z(e,t);return n?n.version:null},r.clean=function(e,t){var n=z(e.trim().replace(/^[=v]+/,""),t);return n?n.version:null},(r.SemVer=H).prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},H.prototype.toString=function(){return this.version},H.prototype.compare=function(e){return f("SemVer.compare",this.version,this.options,e),e instanceof H||(e=new H(e,this.options)),this.compareMain(e)||this.comparePre(e)},H.prototype.compareMain=function(e){return e instanceof H||(e=new H(e,this.options)),X(this.major,e.major)||X(this.minor,e.minor)||X(this.patch,e.patch)},H.prototype.comparePre=function(e){if(e instanceof H||(e=new H(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;var t=0;do{var n=this.prerelease[t],r=e.prerelease[t];if(f("prerelease compare",t,n,r),void 0===n&&void 0===r)return 0;if(void 0===r)return 1;if(void 0===n)return-1;if(n!==r)return X(n,r)}while(++t)},H.prototype.inc=function(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t),this.inc("pre",t);break;case"prerelease":0===this.prerelease.length&&this.inc("patch",t),this.inc("pre",t);break;case"major":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case"patch":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case"pre":if(0===this.prerelease.length)this.prerelease=[0];else{for(var n=this.prerelease.length;0<=--n;)"number"==typeof this.prerelease[n]&&(this.prerelease[n]++,n=-2);-1===n&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},r.inc=function(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new H(e,n).inc(t,r).version}catch(e){return null}},r.diff=function(e,t){{if(Q(e,t))return null;var n=z(e),r=z(t);if(n.prerelease.length||r.prerelease.length){for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return"pre"+o;return"prerelease"}for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return o}},r.compareIdentifiers=X;var G=/^[0-9]+$/;function X(e,t){var n=G.test(e),r=G.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:t<e?1:0}function K(e,t,n){return new H(e,n).compare(new H(t,n))}function Z(e,t,n){return 0<K(e,t,n)}function Y(e,t,n){return K(e,t,n)<0}function Q(e,t,n){return 0===K(e,t,n)}function ee(e,t,n){return 0!==K(e,t,n)}function te(e,t,n){return 0<=K(e,t,n)}function ne(e,t,n){return K(e,t,n)<=0}function re(e,t,n,r){var o;switch(t){case"===":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e===n;break;case"!==":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e!==n;break;case"":case"=":case"==":o=Q(e,n,r);break;case"!=":o=ee(e,n,r);break;case">":o=Z(e,n,r);break;case">=":o=te(e,n,r);break;case"<":o=Y(e,n,r);break;case"<=":o=ne(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}function oe(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof oe){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof oe))return new oe(e,t);f("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ie?this.value="":this.value=this.operator+this.semver.version,f("comp",this)}r.rcompareIdentifiers=function(e,t){return X(t,e)},r.major=function(e,t){return new H(e,t).major},r.minor=function(e,t){return new H(e,t).minor},r.patch=function(e,t){return new H(e,t).patch},r.compare=K,r.compareLoose=function(e,t){return K(e,t,!0)},r.rcompare=function(e,t,n){return K(t,e,n)},r.sort=function(e,n){return e.sort(function(e,t){return r.compare(e,t,n)})},r.rsort=function(e,n){return e.sort(function(e,t){return r.rcompare(e,t,n)})},r.gt=Z,r.lt=Y,r.eq=Q,r.neq=ee,r.gte=te,r.lte=ne,r.cmp=re,r.Comparator=oe;var ie={};function ae(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof ae)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new ae(e.raw,t);if(e instanceof oe)return new ae(e.value,t);if(!(this instanceof ae))return new ae(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function se(e){return!e||"x"===e.toLowerCase()||"*"===e}function ce(e,t,n,r,o,i,a,s,c,l,u,f,p){return((t=se(n)?"":se(r)?">="+n+".0.0":se(o)?">="+n+"."+r+".0":">="+t)+" "+(s=se(c)?"":se(l)?"<"+(+c+1)+".0.0":se(u)?"<"+c+"."+(+l+1)+".0":f?"<="+c+"."+l+"."+u+"-"+f:"<="+s)).trim()}function le(e,t,n){for(var r=0;r<e.length;r++)if(!e[r].test(t))return!1;if(n||(n={}),!t.prerelease.length||n.includePrerelease)return!0;for(r=0;r<e.length;r++)if(f(e[r].semver),e[r].semver!==ie&&0<e[r].semver.prerelease.length){var o=e[r].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}function ue(e,t,n){try{t=new ae(t,n)}catch(e){return!1}return t.test(e)}function fe(e,t,n,r){var o,i,a,s,c;switch(e=new H(e,r),t=new ae(t,r),n){case">":o=Z,i=ne,a=Y,s=">",c=">=";break;case"<":o=Y,i=te,a=Z,s="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ue(e,t,r))return!1;for(var l=0;l<t.set.length;++l){var u=t.set[l],f=null,p=null;if(u.forEach(function(e){e.semver===ie&&(e=new oe(">=0.0.0")),f=f||e,p=p||e,o(e.semver,f.semver,r)?f=e:a(e.semver,p.semver,r)&&(p=e)}),f.operator===s||f.operator===c)return!1;if((!p.operator||p.operator===s)&&i(e,p.semver))return!1;if(p.operator===c&&a(e,p.semver))return!1}return!0}oe.prototype.parse=function(e){var t=this.options.loose?c[V]:c[L],n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1],"="===this.operator&&(this.operator=""),n[2]?this.semver=new H(n[2],this.options.loose):this.semver=ie},oe.prototype.toString=function(){return this.value},oe.prototype.test=function(e){return f("Comparator.test",e,this.options.loose),this.semver===ie||("string"==typeof e&&(e=new H(e,this.options)),re(e,this.operator,this.semver,this.options))},oe.prototype.intersects=function(e,t){if(!(e instanceof oe))throw new TypeError("a Comparator is required");var n;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return n=new ae(e.value,t),ue(this.value,n,t);if(""===e.operator)return n=new ae(this.value,t),ue(e.semver,n,t);var r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),o=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),i=this.semver.version===e.semver.version,a=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),s=re(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=re(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||c},(r.Range=ae).prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},ae.prototype.toString=function(){return this.range},ae.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?c[q]:c[W];e=e.replace(n,ce),f("hyphen replace",e),e=e.replace(c[J],"$1$2$3"),f("comparator trim",e,c[J]),e=(e=(e=e.replace(c[M],"$1~")).replace(c[N],"$1^")).split(/\s+/).join(" ");var r=t?c[V]:c[L],o=e.split(" ").map(function(e){return t=e,n=this.options,f("comp",t,n),s=n,t=t.trim().split(/\s+/).map(function(e){return function(a,e){f("caret",a,e),e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[D]:c[R];return a.replace(t,function(e,t,n,r,o){var i;return f("caret",a,e,t,n,r,o),i=se(t)?"":se(n)?">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?"0"===t?">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":">="+t+"."+n+".0 <"+(+t+1)+".0.0":o?(f("replaceCaret pr",o),"-"!==o.charAt(0)&&(o="-"+o),"0"===t?"0"===n?">="+t+"."+n+"."+r+o+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+o+" <"+(+t+1)+".0.0"):(f("no pr"),"0"===t?"0"===n?">="+t+"."+n+"."+r+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+" <"+(+t+1)+".0.0"),f("caret return",i),i})}(e,s)}).join(" "),f("caret",t),a=n,t=t.trim().split(/\s+/).map(function(e){return function(a,e){e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[P]:c[T];return a.replace(t,function(e,t,n,r,o){var i;return f("tilde",a,e,t,n,r,o),i=se(t)?"":se(n)?">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":o?(f("replaceTilde pr",o),"-"!==o.charAt(0)&&(o="-"+o),">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0"):">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0",f("tilde return",i),i})}(e,a)}).join(" "),f("tildes",t),f("replaceXRanges",o=t,i=n),t=o.split(/\s+/).map(function(e){return function(u,e){u=u.trim(),e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[A]:c[$];return u.replace(t,function(e,t,n,r,o,i){f("xRange",u,e,t,n,r,o,i);var a=se(n),s=a||se(r),c=s||se(o),l=c;return"="===t&&l&&(t=""),a?e=">"===t||"<"===t?"<0.0.0":"*":t&&l?(s&&(r=0),c&&(o=0),">"===t?(t=">=",s?(n=+n+1,o=r=0):c&&(r=+r+1,o=0)):"<="===t&&(t="<",s?n=+n+1:r=+r+1),e=t+n+"."+r+"."+o):s?e=">="+n+".0.0 <"+(+n+1)+".0.0":c&&(e=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0"),f("xRange return",e),e})}(e,i)}).join(" "),f("xrange",t),f("replaceStars",r=t,n),t=r.trim().replace(c[B],""),f("stars",t),t;var t,n,r,o,i,a,s},this).join(" ").split(/\s+/);return this.options.loose&&(o=o.filter(function(e){return!!e.match(r)})),o=o.map(function(e){return new oe(e,this.options)},this)},ae.prototype.intersects=function(n,r){if(!(n instanceof ae))throw new TypeError("a Range is required");return this.set.some(function(e){return e.every(function(t){return n.set.some(function(e){return e.every(function(e){return t.intersects(e,r)})})})})},r.toComparators=function(e,t){return new ae(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})},ae.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new H(e,this.options));for(var t=0;t<this.set.length;t++)if(le(this.set[t],e,this.options))return!0;return!1},r.satisfies=ue,r.maxSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&-1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.minSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.validRange=function(e,t){try{return new ae(e,t).range||"*"}catch(e){return null}},r.ltr=function(e,t,n){return fe(e,t,"<",n)},r.gtr=function(e,t,n){return fe(e,t,">",n)},r.outside=fe,r.prerelease=function(e,t){var n=z(e,t);return n&&n.prerelease.length?n.prerelease:null},r.intersects=function(e,t,n){return e=new ae(e,n),t=new ae(t,n),e.intersects(t)},r.coerce=function(e){if(e instanceof H)return e;if("string"!=typeof e)return null;var t=e.match(c[j]);return null!=t?z((t[1]||"0")+"."+(t[2]||"0")+"."+(t[3]||"0")):null}});Zo.SEMVER_SPEC_VERSION,Zo.re,Zo.src,Zo.parse,Zo.valid,Zo.clean,Zo.SemVer,Zo.inc,Zo.diff,Zo.compareIdentifiers,Zo.rcompareIdentifiers,Zo.major,Zo.minor,Zo.patch,Zo.compare,Zo.compareLoose,Zo.rcompare,Zo.sort,Zo.rsort,Zo.gt,Zo.lt,Zo.eq,Zo.neq,Zo.gte,Zo.lte,Zo.cmp,Zo.Comparator,Zo.Range,Zo.toComparators,Zo.satisfies,Zo.maxSatisfying,Zo.minSatisfying,Zo.validRange,Zo.ltr,Zo.gtr,Zo.outside,Zo.prerelease,Zo.intersects,Zo.coerce;function Yo(e){if(Zo.valid(e))return e;for(var t=(e="string"==typeof e?e:"").split("."),n=0,r=[];n<3;){var o="string"==typeof t[n]&&t[n]?t[n]:"0";r.push(o),n++}return r.join(".")}function Qo(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return r.errorMessage="Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n,0<=o.indexOf("osversion")?r.code=1001:0<=o.indexOf("appversion")?r.code=1002:0<=o.indexOf("weexversion")?r.code=1003:0<=o.indexOf("devicemodel")&&(r.code=1004),r}function ei(e,t,n,r){var o;if(console.debug("[JS Framework] bootstrap for "+t),Ur(t))o=Xr(t);else{if(!Gr(t))return new Error("Wrong component name: "+t);if(!Xo(e,o=Kr(t)))return new Error("It's not a component: "+t)}if("string"==typeof(n=Fr(n)?n:{}).transformerVersion&&"string"==typeof global.transformerVersion&&!Zo.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=function(e,t){t=Fr(t=t||global.WXEnvironment)?t:{};var n={isDowngrade:!1};if("function"===Lr(e)){var r=e.call(this,t,{semver:Zo,normalizeVersion:Yo});n=(r=!!r)?Qo("custom","","custom params"):n}else{var o=(e=Fr(e)?e:{})[(t.platform||"unknow").toLowerCase()]||{};for(var i in t){var a=i,s=a.toLowerCase(),c=t[i],l=0<=s.indexOf("version"),u=0<=s.indexOf("devicemodel"),f=o[i];if(f&&l){var p=Yo(f),d=Yo(t[i]);if(Zo.satisfies(d,p)){n=Qo(a,c,f);break}}else if(u&&0<=("array"===Lr(f)?f:[f]).indexOf(c)){n=Qo(a,c,f);break}}}return n}(n.downgrade);if(i.isDowngrade)return e.callTasks([{module:"instanceWrap",method:"error",args:[i.errorType,i.code,i.errorMessage]}]),new Error("Downgrade["+i.code+"]: "+i.errorMessage);n.viewport&&function(e,t){if(void 0===t&&(t={}),e&&e.callTasks)e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}(e,n.viewport),e.vm=new zo(o,null,{_app:e},null,r)}var ti=function(o,e){for(var t,n,r,i=[],a=arguments.length-2;0<a--;)i[a]=arguments[a+2];if(console.debug("[JS Framework] define a component "+e),"function"==typeof(r=1<i.length?i[1]:i[0])&&(n=r,r=null),n){var s={exports:{}};n(function(e){if(Ur(e)){var t=Xr(e);return Xo(o,t)}if(zr(e)){var n=Xr(e);return o.requireModule(n)}if(Hr(e)||Gr(e)){var r=Kr(e);return o.commonModules[r]}},s.exports,s),r=s.exports}if(Ur(e)){var c=Xr(e);Ko(o,c,r)}else if(zr(e)){Go(((t={})[Xr(e)]=r,t))}else if(Hr(e)){var l=Kr(e);o.commonModules[l]=r}else if(Gr(e)){var u=Kr(e);r.template||r.style||r.methods?Ko(o,u,r):o.commonModules[u]=r}};function ni(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&function e(t){delete t._app;delete t._computed;delete t._css;delete t._data;delete t._ids;delete t._methods;delete t._options;delete t._parent;delete t._parentEl;delete t._rootEl;if(t._watchers){for(var n=t._watchers.length;n--;)t._watchers[n].teardown();delete t._watchers}if(t._childrenVms){for(var r=t._childrenVms.length;r--;)e(t._childrenVms[r]);delete t._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+t._type+")");t.$emit("hook:destroyed");delete t._type;delete t._vmEvents}(e.vm),e.id="",e.options=null,e.blocks=null,e.vm=null,e.doc.taskCenter.destroyCallback(),e.doc.destroy(),e.doc=null,e.customComponentMap=null,e.commonModules=null}function ri(e){e.differ.flush()}function oi(r,e,o,t){var i;console.debug("[JS Framework] Intialize an instance with:\n",o);var n,a=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return ti.apply(void 0,[r].concat(e))},s=function(e,t,n){i=ei(r,e,t,n||o),ri(r),r.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+r.id+")")},c=zo,l=r.doc,u=function(e){return r.requireModule(Xr(e))},f={config:r.options,define:a,bootstrap:s,requireModule:u,document:l,Vm:c};Object.freeze(f),"function"==typeof e?n=e.toString().substr(12):e&&(n=e.toString()),n='(function(global){\n\n"use strict";\n\n '+n+" \n\n})(Object.create(this))";var p=global.WXEnvironment,d={};if(p&&"Web"!==p.platform){var h=r.requireModule("timer");Object.assign(d,{setTimeout:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setTimeout(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setInterval(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){h.clearTimeout(e)},clearInterval:function(e){h.clearInterval(e)}})}var v=Object.assign({define:a,require:function(t){return function(e){i=ei(r,t,{},e)}},bootstrap:s,register:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return function(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),Ko(e,t,n)}.apply(void 0,[r].concat(e))},render:function(e,t){i=ei(r,e,{},t)},__weex_define__:a,__weex_bootstrap__:s,__weex_document__:l,__weex_require__:u,__weex_viewmodel__:c,weex:f},d,t);return function(e,t){if("function"!=typeof compileAndRunBundle)return!1;var n=void 0,r=!1,o="(function (",i=[],a=[];for(var s in e)i.push(s),a.push(e[s]);for(var c=0;c<i.length-1;++c)o+=i[c],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var l=e.weex||{},u=l.config||{};(n=compileAndRunBundle(o,u.bundleUrl,u.bundleDigest,u.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}(v,n)||function(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}(v,n),i}var ii=function(e){this.id=e,this.map=[],this.hooks=[]};function ai(e,t){var n=e[t];for(var r in n)n[r]()}function si(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new go.Document(e,this.options.bundleUrl,null,go.Listener),this.differ=new ii(e)}ii.prototype.isEmpty=function(){return 0===this.map.length},ii.prototype.append=function(e,t,n,r){var o=this;void 0===t&&(t=0),this.hasTimer||(this.hasTimer=!0,setTimeout(function(){o.hasTimer=!1,o.flush(!0)},0));var i=this.map;i[t]||(i[t]={});var a=i[t];a[e]||(a[e]={}),"element"===e?(a[e][n]||(a[e][n]=[]),a[e][n].push(r)):a[e][n]=r},ii.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){ai(e,"repeat"),ai(e,"shown"),function(e,t){var n=e[t];for(var r in n){var o=n[r];o.forEach(function(e){e()})}}(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},ii.prototype.then=function(e){this.hooks.push(e)},si.prototype.requireModule=function(e){return function(r,o){var e=Ho[o],t={},n=function(n){Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return r.callTasks({module:o,method:n,args:e})}},set:function(e){if("function"==typeof e)return r.callTasks({module:o,method:n,args:[e]})}})};for(var i in e)n(i);return t}(this,e)},si.prototype.updateActions=function(){return ri(this)},si.prototype.callTasks=function(e){return t=this,"array"!==Lr(n=e)&&(n=[n]),n.forEach(function(e){r=t.doc.taskCenter.send("module",{module:e.module,method:e.method},e.args)}),r;var t,n,r},Object.freeze(si),Object.freeze(si.prototype);var ci={};var li=go.nativeComponentMap;function ui(e){"object"==typeof e&&function(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}(zo,e)}global.registerMethods=ui;var fi={fireEvent:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function t(n,e,r,o,i){if(console.debug('[JS Framework] Fire a "'+r+'" event on an element('+e+") in instance("+n.id+")"),!Array.isArray(e)){var a=n.doc.getRef(e);if(a){var s=n.doc.fireEvent(a,r,o,i);return n.differ.flush(),n.doc.taskCenter.send("dom",{action:"updateFinish"},[]),s}return new Error('invalid element reference "'+e+'"')}e.some(function(e){return!1!==t(n,e,r,o)})}.apply(void 0,[ci[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function(e,t,n,r){console.debug("[JS Framework] Invoke a callback("+t+") with",n,"in instance("+e.id+")");var o=e.doc.taskCenter.callback(t,n,r);return ri(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}.apply(void 0,[ci[e]].concat(t))}};ui(Cr),Object.freeze(zo);var pi=Object.freeze({registerComponents:function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?li[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(li[e.type]=e))})},registerModules:function(e){"object"==typeof e&&Go(e)},registerMethods:ui,createInstance:function(e,t,n,r,o){var i=(o||{}).services;eo();var a,s=ci[e];return n=n||{},(a=s?new Error('invalid instance id "'+e+'"'):(s=new si(e,n),oi(ci[e]=s,t,r,i)))instanceof Error?a:s},init:function(e){go.Document=e.Document,go.Element=e.Element,go.Comment=e.Comment,go.sendTasks=e.sendTasks,go.Listener=e.Listener},refreshInstance:function(e,t){var n=ci[e];return n?function(e,t){console.debug("[JS Framework] Refresh with",t,"in instance["+e.id+"]");var n=e.vm;return n&&t?("function"==typeof n.refreshData?n.refreshData(t):xr(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}(n,t):new Error('invalid instance id "'+e+'"')},destroyInstance:function(e){"function"==typeof markupState&&markupState(),eo();var t=ci[e];if(!t)return new Error('invalid instance id "'+e+'"');ni(t),delete ci[e];var n=Math.round(e);return 0<n&&(n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory()),ci},receiveTasks:function(r,e){if(ci[r]&&Array.isArray(e)){var o=[];return e.forEach(function(e){var t=fi[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),o.push(t.apply(void 0,n)))}),o}return new Error('invalid instance id "'+r+'" or tasks')},getRoot:function(e){var t,n=ci[e];return n?(t=(n.doc||{}).body||{}).toJSON?t.toJSON():{}:new Error('invalid instance id "'+e+'"')}}),di={Vanilla:yr,Vue:Or,Rax:e(n(function(e){e.exports=function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}return o.m=n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.getInstance=r,t.init=function(e){c=e.Document,e.Element,e.Comment},t.createInstanceContext=function(e,t,n){var r=l[e],o=t.weex;{if(null!=r)throw new Error('Instance id "'+e+'" existed when create instance');var i=o.config.bundleUrl;i?i.split("//")[0]||(i="https:"+i):(console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".'),i="about:blank");var a=new c(e,i);r=l[e]={document:a,instanceId:e,bundleUrl:i,__weex_data__:n,uid:0};var s={instanceId:e,bundleUrl:i,document:a,__weex_document__:a,__weex_options__:t,__weex_data__:n||{},callNative:function(){},__weex_config__:t};return s}},t.refreshInstance=function(e,t){var n=r(e).document;n.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),n.taskCenter.send("dom",{action:"refreshFinish"},[])},t.destroyInstance=function(e){var t=r(e),n=(t.bundleCode,t.document);n.documentElement.fireEvent("destory",{timestamp:Date.now()}),n.destroy&&n.destroy();n.taskCenter&&n.taskCenter.destroyCallback&&n.taskCenter.destroyCallback();delete l[e]};var c=void 0,l={};function r(e){var t=l[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}t.default=t}])})),Weex:pi};var hi,vi,mi,yi,gi=Object.freeze({$userTrack:function(e,t,n,r){console.error("[Upgrade Warning] $userTrack will be removed in the next version!"),console.error("[JS Framework] Vm#$userTrack is deprecated, please use \"require('@weex-module/userTrack').commit(type, name, comName, param)\" instead"),this._app.requireModule("userTrack").commit(e,t,n,r)},$sendMtop:function(e,t){console.error("[Upgrade Warning] $sendMtop will be removed in the next version!"),console.error("[JS Framework] Vm#$sendMtop is deprecated, please use \"require('@weex-module/stream').sendMtop(params, callback)\" instead"),"undefined"==typeof window?this._app.requireModule("windvane").call({class:"MtopWVPlugin",method:"send",data:e},t):this._app.requireModule("stream").sendMtop(e,t)},$callWindvane:function(e,t){console.error("[Upgrade Warning] $callWindvane will be removed in the next version!"),console.error("[JS Framework] Vm#$callWindvane is deprecated, please use \"require('@weex-module/windvane').call(params, callback)\" instead"),this._app.requireModule("windvane").call(e,t)},$setSpm:function(e,t){console.error("[Upgrade Warning] $setSpm will be removed in the next version!"),console.error("[JS Framework] Vm#$setSpm is deprecated, please use \"require('@weex-module/pageInfo').setSpm(a, b)\" instead"),this._app.requireModule("pageInfo").setSpm(e,t)},$getUserInfo:function(e){console.error("[Upgrade Warning] $getUserInfo will be removed in the next version!"),console.error("[JS Framework] Vm#$getUserInfo is deprecated, please use \"require('@weex-module/user').getUserInfo(callback)\" instead"),this._app.requireModule("user").getUserInfo(e)},$login:function(e){console.error("[Upgrade Warning] $login will be removed in the next version!"),console.error("[JS Framework] Vm#$login is deprecated, please use \"require('@weex-module/user').login(callback)\" instead"),this._app.requireModule("user").login(e)},$logout:function(e){console.error("[Upgrade Warning] $logout will be removed in the next version!"),console.error("[JS Framework] Vm#$logout is deprecated, please use \"require('@weex-module/user').logout(callback)\" instead"),this._app.requireModule("user").logout(e)}}),_i=n(function(e,t){console.log("Start windmill weex-vue-plugin (0.3.2) framework. Build at 2018-09-18 13:06"),e.exports=function(){"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{writable:!0,enumerable:!1,configurable:!0,value:function(e,t){var n=arguments;if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var r=Object(e),o=1;o<arguments.length;o++){var i=n[o];if(null!=i)for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(r[a]=i[a])}return r}});var t,i=(t=1e5,function(){var e=String(t);return t+=1,e});function s(t,n,e){void 0===e&&(e=!0);var r=void 0!==global?global:"undefined"!=typeof self?self:new Function("return this")();try{Object.defineProperty(r,t,{value:n,configurable:!0,enumerable:!0,writable:!e})}catch(e){r[t]=n}}function c(e){return Object.prototype.toString.call(e).slice(8,-1)}function l(e){return"Object"===c(e)}function o(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n]}function f(o,i){var a;return void 0===i&&(i=0),"function"!=typeof setTimeout||"function"!=typeof clearTimeout?(console.warn("[Warn] There is no timer API in the current context."),o):function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this;clearTimeout(a),a=setTimeout(function(){return o.apply(r,t)},i)}}var n=function(){},u={},a=["Android","iOS"];function r(e,t){return"object"==typeof process&&process&&process.env&&"test"===process.env.PURPOSE?"function"==typeof __test_logger__&&(n=__test_logger__,!0):(u.debugMode,!0)}function p(e,t){r()&&n("log",e)}function d(e,t){r()&&n("debug",e)}function h(e,t){r()&&n("warn",e)}function v(e,t){r()&&n("error",e)}function m(e){if(v(e),"test"!==process.env.PURPOSE)throw new Error(e)}n=function(e,t){var n,r="["+((n=e).charAt(0).toUpperCase()+n.slice(1))+"][wml-r] "+t;return u.isWeex&&-1<a.indexOf(u.platform)?console.log(r):console.error(r)};var y={network:["request","uploadFile"],miniApp:["setAppShareInfo","hideLauncherLoading","setWebViewTop","setWebViewBackgroundImage"],mtop:["request"],storage:["length","setItem","getItem","removeItem"],memoryStorage:["setItem","getItem"],tabBar:["show","hide"],navigator:["push","pop","openMessagePage","reloadPage","getBackStack","popToHome","navigateTo","redirectTo","switchTab"],user:["login","logout","info"],modal:["alert","confirm","toast","showLoading","hideLoading"],navigatorBar:["show","hide","setTitle","setRightItem","setStyle","setDrawer","setActionSheet","hasIndexBadge","scaleIndexBadge","resetIndexBadge","getHeight","openDrawer","isDrawerOpened","closeDrawer","setLeftItem","showMenu","hideMenu","getStatusBarHeight","setNavigationBar"],clipboard:["writeText","readText"],picker:["pick","pickDate","pickTime","chooseCity"],webSocket:["webSocket","send","close","onOpen","onMessage","onClose","onError"],calendar:["addEvent","checkEvent","removeEvent"],connection:["getType","getDownlinkMax","onChange"],screen:["setAlwaysOn","setBrightness","getScreenBrightness"],broadcast:["createChannel","postMessage","onMessage","close"],share:["doShare"],cookie:["read","write","getAllObjects"],audio:["load","play","pause","stop","setVolume","canPlayType"],wopc:["authLogin","checkAuthSession","doAuth","getSessionKey","setSessionKey"],WopcMtopPlugin:["request"],device:["onShake","vibrate"],keyboard:["hideKeyboard"],contact:["choosePhoneContact"],location:["getLocation"],alipay:["tradePay"],userTrack:["commit","commitut","commitEvent","customAdvance","pageAppear","pageDisappear","skipPage","updatePageUtparam","updateNextPageUtparam"],"nuvajs-exec":["exec"],aluWVJSBridge:["userIsLogin","refreshAlipayCookie"],TBDeviceInfo:["getUtdid"],actionSheet:["showActionSheet"],image:["chooseImage","previewImage","compressImage","getImageInfo","saveImage"],media:["startVoice","stopVoice"],audioRecord:["startRecord","stopRecord","cancelRecord"],audioPlayer:["playVoice","pauseVoice","stopVoice"],file:["saveFile","getFileInfo","getFileList","removeFile"],video:["chooseVideo","getVideoInfo"],phone:["makePhoneCall"],compass:["startCompass","stopCompass","onCompassChange"],tbsecurity:["secureToken"]};function g(o,e){var i=e||function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=o()).$call.apply(e,n)};return function(o){if(!o)return d("Require a universal module proxy."),{call:i};var e=y[o];if(Array.isArray(e)){d('Require the "'+o+'" module.');var t={};return e.forEach(function(r){t[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return i.apply(void 0,[o+"."+r].concat(t))}}),t}h('Require unknown module "'+o+"\".It may not exist or haven't been registered.")}}var _="[[WorkerPageReady]]",b="[[RendererPageReady]]",w="[[SendInitialState]]",k="[[ReceivedInitialState]]",S="[[WorkerPageStateChange]]",O="[[RendererPageStateChange]]",C="__WINDMILL_MODULE_GETTER__",e=function(){};e.prototype.$on=function(e,t){return void 0===t&&(t=o),d('$on "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$on."),t===o&&m("bind event "+e+" with no callback through windmill.$on."),this.bridge.onReceiveMessage({data:{type:e},origin:this.label,type:"Event"},t)},e.prototype.$once=function(e,t){return void 0===t&&(t=o),d('$once "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$once."),t===o&&m("bind event "+e+" with no callback through windmill.$once."),this.bridge.onReceiveMessage({data:{type:e,once:!0},origin:this.label,type:"Event"},t)},e.prototype.$off=function(e,t){return d('$off "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$off."),this.bridge.unbindEventListener("Event."+e,t)},e.prototype.$cycle=function(e,t){return void 0===t&&(t=o),d('$cycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||m("invalid lifecycle name "+e+" for windmill.$cycle."),t===o&&m("hook lifecycle "+e+" with no callback function through windmill.$cycle."),"AppWorker"!==this.label&&/^app:/.test(e)&&m("Shouldn't bind lifecycle hook for app in a page client."),this.bridge.onReceiveMessage({type:"Lifecycle",origin:this.label,data:{type:e}},t)},e.prototype.$decycle=function(e,t){return d('$decycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||m("invalid lifecycle name "+e+" for windmill.$decycle."),this.bridge.unbindEventListener("Lifecycle."+e,t)},e.prototype.$emit=function(e,t,n){return void 0===t&&(t={}),d('$emit("'+e+'")'),!e&&m("invalid event name "+e+" for windmill.$emit."),n&&n!==this.label?this.bridge.postMessage({data:{type:e,data:t},origin:this.label,target:n,type:"Event"}):this.bridge.emitEvent(""+e,t)},e.prototype.$callAsync=function(n,r){var o=this;return void 0===r&&(r={}),d('$callAsync "'+n+'"'),n||m("invalid method name "+n+" for windmill.$callAsync."),new Promise(function(e,t){o.bridge.dispatchMessage({type:"ModuleCall",origin:o.label,target:"AppWorker",data:{method:n,params:r}},e,t,!1)})},e.prototype.$call=function(e,t,n,r){return void 0===t&&(t={}),void 0===n&&(n=o),void 0===r&&(r=o),d('$call "'+e+'", params: '+JSON.stringify(t)),e||m("invalid method name "+e+" for windmill.$call."),this.bridge.dispatchMessage({type:"ModuleCall",origin:this.label,target:"AppWorker",data:{method:e,params:t}},n,r,!0)},e.prototype.$registerModules=function(e){!function(r,o){if(void 0===o&&(o=!1),!l(r))return v("Invalid parameter type! The module definition is not a plain object.");var e=function(t){var e=r[t];y[t]?o||h('The "'+t+'" module has already been registered.It would be overridden.'):y[t]=[];var n=y[t];Array.isArray(e)?e.forEach(function(e){-1===n.indexOf(e)?n.push(e):o||h('The "'+e+'" of the "'+t+'" module has already been registered.')}):v('Invalid parameter type! The method list of the "'+t+'" module should be an Array.')};for(var t in r)e(t)}(e,!0)},e.prototype.$getAvailableModules=function(){return function(e){var t={};try{t=JSON.parse(JSON.stringify(e))}catch(e){}return t}(y)};var x="[[EVENT_MAP]]";function E(e,t){var n=e[x];return Array.isArray(n[t])||(n[t]=[]),n[t]}var $,A=function(){d("Create new EventEmitter."),Object.defineProperty(this,x,{configurable:!1,enumerable:!1,writable:!1,value:{}})};function j(t){var n;try{n=JSON.stringify(t)}catch(e){n=t}m("failed to postMessage: "+n)}function I(e,t,n,r,o,i){var a=t+"."+n;return e.WindVane?e.WindVane.call(t,n,r,o,i):m("should have WindVane in global context"+(a?" to call "+a:"")+".")}A.prototype.on=function(e,t){d('EventEmitter: on("'+e+'")');var n=E(this,e);return n.push({listener:t,once:!1,callCount:0}),this},A.prototype.once=function(e,t){d('EventEmitter: once("'+e+'")');var n=E(this,e);return n.push({listener:t,once:!0,callCount:0}),this},A.prototype.off=function(e,t){d('EventEmitter: off("'+e+'"'+(t?", listener":"")+")");var n=this[x];if(t){var r=n[e];if(Array.isArray(r)){var o=r.findIndex(function(e){return e.listener===t});-1!==o&&r.splice(o,1)}}else delete n[e];return this};var M=!(A.prototype.emit=function(t){for(var e=arguments,n=[],r=arguments.length-1;0<r--;)n[r]=e[r+1];d('EventEmitter: emit("'+t+'", '+JSON.stringify(n)+")");var o=this[x],i=o[t];return Array.isArray(i)&&(o[t]=i.filter(function(e){try{e.listener.apply(null,n),e.callCount+=1}catch(e){return v('Failed to emit "'+t+'" event.'),v(e.toString()),!0}return!e.once})),this}),T=function(){this._messages=[]};T.prototype.postMessage=function(e){d("cache message in lazyMsgModule. "+JSON.stringify(e)),this._messages.push(e)},T.prototype.replaceWith=function(e){P=!1,this._messageModule=e,this._flush()},T.prototype._flush=function(){var t=this;this._messages.forEach(function(e){return t._messageModule.postMessage(e)})};var P,F,N=new T;function R(e,t){var n,r=e?(n=e).requireModule("@weex/windmill")||n.requireModule("windmill"):function(){if(!$){var t="undefined"!=typeof window?window:global;$={postMessage:function(e){return I(t,"Windmill","postMessage",e,function(){},j)},onmessage:function(e){if(console.debug("Set onMessage for webview."),!M)return M=!0,I(t,"Windmill","onMessage",{},e,j)}}}return $}();if(!r)return m("can't find message module ("+(e?"windmill module":"message module in webview")+")."),P=!0,N;if("function"==typeof t){d('Set the "onmessage" method to the bridge through callback.');try{r.onmessage(t)}catch(e){v('Failed to set the "onmessage" method to the bridge through callback.'),v(e.toString())}}return P&&N.replaceWith(r),r}function D(e){var t=e.match(/([^@]+)(@\S+)/);return t&&t[1]||e}var V=function(e,t){var a=this;void 0===t&&(t={}),d("Create a new RendererBridge."),F=t.isWeex,this._emitter=new A,d("Register onmessage api for "+(F?"Weex windmill module":"webview")+"."),F&&(this._weex=e),this._onMessage=function(e){if(d("Receive message from the worker. (message: "+JSON.stringify(e)+")"),!l(e)&&(v("The parameter of onmessage should be a plain object! Not "+c(e)),"string"==typeof e))try{e=JSON.parse(e)}catch(e){return void v("Failed to parse the message string. "+e.toString())}var t=e.type,n=e.data;void 0===n&&(n={});var r=e.origin,o=e.callbackId;switch(t){case"Callback":a._emitter.emit("callback@AppWorker:"+o,n);break;case"Event":var i=D(n.type);a._emitter.emit(t+"."+i,Object.assign({origin:r},n,{type:i}));break;case"Lifecycle":a._emitter.emit(t+"."+n.lifecycle,n.options);break;case"SetData":a._emitter.emit("Event.setdata",n);break;default:m('Unknown message type received from worker: "'+t+'"')}},R(e,this._onMessage)};V.prototype.dispatchMessage=function(t,n,r,e){d("Dispatch message to worker. (message: "+JSON.stringify(t)+")"),t.callbackId=this._genCallbackId(function(e){return e.status&&"SUCCESS"===e.status?n(e):(e.status,v("call API "+t.data.method+" from renderer failed: "+e.status+", "+e.error),r(e))},{keepAlive:e});try{t.keepAlive=!0,this.postMessage(t)}catch(e){r(e)}},V.prototype.postMessage=function(e){try{d("Call postMessage to worker. (message: "+JSON.stringify(e)+")"),R(this._weex,this._onMessage).postMessage(e)}catch(e){m(e.message||e.toString()||"postMessage failed.")}},V.prototype._genCallbackId=function(e,t){var n=t.keepAlive,r=t.callbackId,o=r||i();return this._emitter[n?"on":"once"]("callback@AppWorker:"+o,e),o},V.prototype.onReceiveMessage=function(e,t){var n=e.type,r=e.data;void 0===r&&(r={});var o=r.type;"Event"===n&&(o=D(o),r.type=o);var i=r.once?"once":"on";this._emitter[i](n+"."+o,t)},V.prototype.unbindEventListener=function(e,t){this._emitter.off(D(e),t)},V.prototype.emitEvent=function(e,t){void 0===t&&(t={});var n=D(e);this._emitter.emit("Event."+n,{type:n,data:t})};var L=function(n){function e(e,t){n.call(this),e&&l(e.config)&&(this._name=e.config.pageName||"",this.label=e.config.clientId||"",e.config.availableModules?(this.$registerModules(e.config.availableModules),this._gotAvailableModulesFromWeex=!0):h("No available modules in weex options.")),d("Create a new RendererRuntime. ("+this.label+", "+this._name+")"),this.bridge=new V(e,t),this._init()}return n&&(e.__proto__=n),((e.prototype=Object.create(n&&n.prototype)).constructor=e).prototype._init=function(){var t=this;this.bridge.onReceiveMessage({origin:"AppWorker",target:this.label,type:"Event",data:{type:"registerModules"}},function(e){e&&"registerModules"===e.type&&(d("Register available modules in renderer. ("+Object.keys(e.data)+")"),t.$registerModules(e.data))})},e.prototype.ready=function(){this.bridge.dispatchMessage({origin:this.label,target:"AppWorker",type:"Event",data:{type:"[[RendererRuntimeReady]]",data:{label:this.label,handshake:!this._gotAvailableModulesFromWeex}}},o,o)},e}(e),J=["$on","$once","$off","$emit","$cycle","$decycle","$call","$callAsync","$navTo","$getAvailableModules"];function W(e,t){var n=!(!e||!e.requireModule);!function(e){if(!e||!e.platform)return console.error("set logger environment failed.");Object.assign(u,e)}({platform:n&&e.config.env.platform,debugMode:n&&e.config.env.debugMode,isWeex:n}),d("Setup Windmill renderer framework."),e&&!e.requireModule&&(t=e,e=void 0),t||(t={}),d("Instantiate renderer in "+(((t=Object.assign({},t)).isWeex=n)?"Weex container":"WindVane container")+".");var o,i,r=new L(e,t),a=(o=r,i={},J.forEach(function(r){"function"==typeof o[r]&&(i[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)})}),i);return d("Prepare runtime APIs: "+JSON.stringify(J)),t.exposeModuleGetter&&s(C,g(function(){return a})),r.ready(),a}var q=/^@(windmill|weex)\/([\w_-]+)/;function B(i,e,t){if(!i.config||"windmill"!==i.config.container)return i;if("function"!=typeof i.requireModule)return i;var a=i.requireModule,s=t||g(function(){return e});return i.requireModule=function(e){var t="weex",n=e,r=q.exec(e);switch(r?(t=r[1],n=r[2]):"string"==typeof i.config.container&&(t=i.config.container),t){case"weex":return a.call(i,n);case"windmill":var o=s(n);return!o&&i.isRegisteredModule(n)?(h('Trying to call weex module "'+n+'" in windmill context!This is NOT a good practice, please use windmill module instead!'),a.call(i,n)):o;default:v('Failed to require scoped module "'+n+'", the "'+t+'" scope is unknown.')}},i}function U(s,c,e){var l={},n=e&&e.normalizeEventName||function(e){return e},r=!(!e||!e.noTriggerWorker);function o(e,t,n,r){void 0===r&&(r=!1);var o=c.getId();l[o]||(l[o]={});var i=l[o];if(i[e]||(i[e]=[]),i[e].push({handler:t,wrap:n}),r)return s.$once(e,n);s.$on(e,n)}var i={on:function(e,t){o(n(e),t,function(e){t.call(c.getVm(),e.data)})},once:function(e,t){o(n(e),t,function(e){t.call(c.getVm(),e.data)},!0)},off:function(e,t){!function(e,n){var t=c.getId(),r=l[t];if(!r)return h("Unbind event from page "+t+" with no event handlers.");var o,i,a=r[e];a?n?(a.forEach(function(e,t){e.handler===n&&(o=e,i=t)}),o&&o.wrap&&(a.splice(i,1),s.$off(e,o.wrap))):((l[t]||(l[t]={}))[e]=[],s.$off(e)):h("Unbind event '"+e+"' which has no event handler.")}(n(e),t)},emit:function(e,t){s.$emit(n(e),t),r&&s.$emit(e+"@"+c.getId(),t,"AppWorker")},call:"default"},a=function(){};return["on","off","emit","once","call"].reduce(function(e,t){var o,n="$"+t,r=i[t];return e[n]="function"==typeof r?r:"default"===r?(o=n,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=s[o];return r.apply(void 0,t)}):a,e},{})}var z="AppWorker";function H(e){switch(c(e)){case"Object":for(var t in e)H(e[t]);break;case"Array":e.forEach(H)}}return function(e){var a=e.createInstanceContext,t=Object.assign({},e);return t.createInstanceContext=function(e,t,n){var r=t&&t.weex;if(!r||"windmill"!==r.config.container)return a(e,t,n);var l,u,o=Object.assign({},a(e,t,n)),i=W(r);return o.weex=B(r,i),o.requireModule=function(e){return r.requireModule(e)},o.__vue_page__=(l=o,u=i,function(){function e(e,t){var n=this,r=t||l,o=r.Vue,i=r.weex,a=i.config,s=a.clientId,c=a.pageName;if(p("Create Page with id "+s+", pageName "+c+"."),this._id=i.config.clientId||null,this._name=i.config.pageName||null,this._vm=null,this._instanceContext=t||l,this._Vue=o,this._weex=i,this._windmill=u,this._hold=!1,this._options=e,this._state="function"==typeof e.data?e.data():e.data,e.data=function(){return n._state},o.prototype.$page=U(this._windmill,this),d("bind with $page: "+Object.keys(o.prototype.$page)),e._noLazy){p("Init vm instantly in Page constructor with no lazy.");try{this._initVm()}catch(e){v("[windmill-vue-renderer] init vm instantly failed: "+(e&&e.message))}}this._shakeHandsBeforeInit(),this._windmill.$once(w,this._onStateInit.bind(this))}return e.prototype.getVm=function(){return this._vm},e.prototype.getId=function(){return this._id},e.prototype._initVm=function(){var n=this,e=this._vm=new this._Vue(this._options),t=e.$options.data,r=0;e.$watch(function(){for(var e in t)H(t[e]);return r=(r+1)%2},function(e,t){n._hold?n._hold=!1:n._debouncedWatcherCb(e,t)},{sync:!0})},e.prototype._shakeHandsBeforeInit=function(){d("start handshaking with worker."),this._sendPageReady(),this._windmill.$once(_,this._onWorkerReady.bind(this))},e.prototype._sendPageReady=function(){d("Send "+b+" to worker."),this._windmill.$emit(b+"@"+this._id,{},z)},e.prototype._onWorkerReady=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(_+" event received: "+n+".");var e=t.data,r=e.clientId,o=e.pageName;r&&(this._id=r),o&&(this._name=o),this._sendPageReady()},e.prototype._onStateInit=function(t){var n,r=this;try{n=JSON.stringify(t)}catch(e){n=t+""}d(w+" event received: "+n),this._windmill.$off(_),this._windmill.$on(S,this._onDataSync.bind(this));var e=t.data,o=t.origin,i=e.clientId,a=e.pageName,s=i||o;s&&(this._id=s),a&&(this._name=a),this._state=Object.assign(this._state||{},e.initialState||{}),this._windmill.$emit(k+"@"+this._id,{},z);var c=this._vm;if(d("debounce watcher callback for page data watcher binding."),this._debouncedWatcherCb=f(function(e,t){d("emit "+O+" event."),r._windmill.$emit(O+"@"+r._id,r._vm&&r._vm.$options.data,z)},1e3/60),c)this._mergeData(e);else try{p("Init vm after "+w+"."),this._initVm()}catch(e){v("[windmill-vue-renderer] "+(e&&e.message))}},e.prototype._onDataSync=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(S+" event received: "+n);var e=t.data;this._mergeData(e,!0)},e.prototype._mergeData=function(e,t){void 0===t&&(t=!1);var n=this._vm,r=n.$options.data;for(var o in e)t&&(this._hold=!0),n.$set(r,o,e[o])},e}()),Object.freeze(o),o},t}}()});di.Vue=_i(di.Vue),function(e){var t=lr.init,n=lr.config;n.frameworks=e;var r=fn.native,o=fn.transformer;for(var i in hr)lr.service.register(i,hr[i]);lr.freezePrototype(),global.frameworkVersion=r,global.transformerVersion=o;var a=t(n),s=function(r){global[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=a[r].apply(a,e);return n instanceof Error&&console.error(n.toString()),n}};for(var c in a)s(c)}(di),Object.freeze(Object),Object.freeze(Array),un(hi=Object.prototype,"__defineGetter__",vi="Object.prototype"),un(hi,"__defineSetter__",vi),un(hi,"__lookupGetter__",vi),un(hi,"__lookupSetter__",vi),un(hi,"constructor",vi),un(hi,"hasOwnProperty",vi),un(hi,"isPrototypeOf",vi),un(hi,"propertyIsEnumerable",vi),un(hi,"toLocaleString",vi),un(hi,"toString",vi),un(hi,"valueOf",vi),Object.seal(hi),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),un(mi=Error.prototype,"name",yi="Error.prototype"),un(mi,"message",yi),un(mi,"toString",yi),un(mi,"constructor",yi),Object.seal(mi),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype),global.registerMethods(gi)});
//# sourceMappingURL=weex-js-framework.min.js.map