(this.nativeLog||function(e){console.log(e)})("START JS FRAMEWORK 0.22.5, Build 2017-10-09 15:50."),this.getJSFMVersion=function(){return"0.22.5"};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";function e(e){qn.Document=e.Document,qn.Element=e.Element,qn.Comment=e.Comment,qn.sendTasks=e.sendTasks}function t(e,t,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new qn.Document(e,n.bundleUrl),a={},s={id:e,data:r,document:i,callbacks:a},u=0;i.addCallback=function(e){return u++,a[u]=e,u},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},zn[e]=s;var c=Object.assign({Document:qn.Document,Element:qn.Element,Comment:qn.Comment,sendTasks:function(t){return qn.sendTasks(e,t,-1)},options:n,document:i},o),l=[],f=[];for(var p in c)l.push(p),f.push(c[p]);return l.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(l)))).apply(void 0,f),qn.sendTasks(e,[{module:"dom",method:"createFinish",args:[]}],-1),s}function n(e){delete zn[e]}function r(e){return zn[e].document.body.toJSON()}function o(e,t){var n={fireEvent:function(e,t,n,r,o){var i=zn[e],a=i.document,s=a.getRef(t);return a.fireEvent(s,n,r,o)},callback:function(e,t,n,r){return zn[e].document.handleCallback(t,n,r)}};if((zn[e]||{}).document&&Array.isArray(t)){var r=[];return t.forEach(function(t){var o=n[t.method],i=[].concat(t.args);"function"==typeof o&&(i.unshift(e),r.push(o.apply(void 0,i)))}),r}}function i(e){return e&&e.__esModule?e.default:e}function a(e,t){return t={exports:{}},e(t,t.exports),t.exports}function s(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm}function u(e){var t=this._ids[e];if(t)return t.el}function c(e){var t=this._ids[e];if(t)return t.vm}function l(e){return this._app.differ.then(function(){e()})}function f(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);if(n){this._app.requireModule("dom").scrollToElement(n.ref,{offset:t})}}function p(e,t,n){var r=this,o=this.$el(e);if(o&&t&&t.styles){this._app.requireModule("animation").transition(o.ref,t,function(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];r._setStyle(o,t.styles),n&&n.apply(void 0,e)})}}function d(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}function h(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)}function v(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead"),this._app.requireModule("event").openURL(e)}function y(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead"),this._app.requireModule("pageInfo").setTitle(e)}function m(e,t){for(var n=[],r=arguments.length-2;r-- >0;)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 _(e){for(var t=[],n=arguments.length-1;n-- >0;)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&&_.apply(void 0,[e].concat(t))}return e}function g(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function b(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function w(e,t){return fr.call(e,t)}function x(e,t){return function(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}}function E(e){return null!==e&&"object"==typeof e}function O(e){return pr.call(e)===dr}function C(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function S(){return"object"==typeof nativeSet?nativeSet.create():new Bn}function k(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}function j(e){return e.replace(vr,"").replace(yr,"")}function A(e){return e.replace(_r,"")}function I(){this.id=Er++,this.subs=[]}function T(e){I.target&&Or.push(I.target),I.target=e}function N(){I.target=Or.pop()}function P(){I.target=null,Or=[]}function M(e,t,n,r){r&&_(this,r);var o="function"==typeof t;this.vm=e,e._watchers.push(this),this.expression=t,this.cb=n,this.id=++Cr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=S(),this.newDepIds=S(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}function $(e,t){var n,r,o,i;if(t||(t=Sr,t.clear()),o=Array.isArray(e),i=E(e),o||i){if(e.__ob__){var a=e.__ob__.dep.id;if(t.has(a))return;t.add(a)}if(o)for(n=e.length;n--;)$(e[n],t);else if(i)for(r=Object.keys(e),n=r.length;n--;)$(e[r[n]],t)}}function R(e){if(this.value=e,this.dep=new I,g(e,"__ob__",this),Array.isArray(e)){(hr?D:F)(e,jr,Ar),this.observeArray(e)}else this.walk(e)}function D(e,t){e.__proto__=t}function F(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];g(e,i,t[i])}}function L(e,t){if(E(e)){var n;return w(e,"__ob__")&&e.__ob__ instanceof R?n=e.__ob__:(Array.isArray(e)||O(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new R(e)),n&&t&&n.addVm(t),n}}function W(e,t,n){var r=new I,o=Object.getOwnPropertyDescriptor(e,t);if(!o||!1!==o.configurable){var i=o&&o.get,a=o&&o.set,s=L(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=i?i.call(e):n;if(I.target&&(r.depend(),s&&s.dep.depend(),Array.isArray(t)))for(var o=void 0,a=0,u=t.length;a<u;a++)(o=t[a])&&o.__ob__&&o.__ob__.dep.depend();return t},set:function(t){t!==(i?i.call(e):n)&&(a?a.call(e,t):n=t,s=L(t),r.notify())}})}}function U(e,t,n){if(Array.isArray(e))return e.splice(t,1,n);if(w(e,t))return void(e[t]=n);if(e._isVue)return void U(e._data,t,n);var r=e.__ob__;if(!r)return void(e[t]=n);if(r.convert(t,n),r.dep.notify(),r.vms)for(var o=r.vms.length;o--;){var i=r.vms[o];B(i,t)}return n}function V(e,t){if(w(e,t)){delete e[t];var n=e.__ob__;if(!n)return void(e._isVue&&delete e._data[t]);if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;){var o=n.vms[r];q(o,t)}}}function B(e,t){(Ir.indexOf(t)>-1||!C(t))&&Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}function q(e,t){C(t)||delete e[t]}function z(e){e._watchers=[],J(e),G(e),K(e)}function J(e){var t=e._data;O(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)B(e,n[r]);L(t,e)}function H(){}function G(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};"function"==typeof r?(o.get=X(r,e),o.set=H):(o.get=r.get?!1!==r.cache?X(r.get,e):x(r.get,e):H,o.set=r.set?x(r.set,e):H),Object.defineProperty(e,n,o)}}function X(e,t){var n=new M(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),I.target&&n.depend(),n.value}}function K(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}function Z(e){var t=e.type,n=Nr[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===k(e[r])&&"object"===k(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])}function Q(e,t,n){oe(e,t,n.id,e),ie(e,t,n.attr),se(e,t,n.classList),ue(e,t,n.style),le(e,t,n.events)}function Y(e,t,n,r){t=t||{},n=n||{};var o=t._options||{},i=o.props;Array.isArray(i)&&(i=i.reduce(function(e,t){return e[t]=!0,e},{})),te(r,i,e,t),te(n.attr,i,e,t)}function ee(e,t,n,r){void 0===r&&(r={}),re(n.classList,e,t),ne(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function te(e,t,n,r){if(e){for(var o in e)!function(o){if(!t||t[o]){var i=e[o];if("function"==typeof i){var a=de(n,i,function(e){r[o]=e});r[o]=a}else r[o]=i}}(o)}}function ne(e,t,n){for(var r in e)!function(r){var o=e[r];if("function"==typeof o){var i=de(t,o,function(e){n._rootEl&&n._rootEl.setStyle(r,e)});n._rootEl.setStyle(r,i)}else n._rootEl&&n._rootEl.setStyle(r,o)}(r)}function re(e,t,n){function r(e,t){"array"===k(e)&&e.unshift(t)}var o=t._options&&t._options.style||{};if(n._rootEl){var i="@originalRootEl";if(o[i]=n._rootEl.classStyle,"function"==typeof e){var a=de(t,e,function(e){r(e,i),ae(n._rootEl,o,e)});r(a,i),ae(n._rootEl,o,a)}else null!=e&&(r(e,i),ae(n._rootEl,o,e))}}function oe(e,t,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return t||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;n=i.call(e),(n||0===n)&&(e._ids[n]=o),de(e,i,function(t){t&&(e._ids[t]=o)})}else n&&"string"==typeof n&&(e._ids[n]=o)}function ie(e,t,n){fe(e,t,"attr",n)}function ae(e,t,n){"string"==typeof n&&(n=n.split(/\s+/)),n.forEach(function(e,t){n.splice.apply(n,[t,1].concat(e.split(/\s+/)))});for(var r={},o=n.length,i=0;i<o;i++)!function(e){var o=t[n[e]];o&&Object.keys(o).forEach(function(e){r[e]=o[e]})}(i);e.setClassStyle(r)}function se(e,t,n){if("function"==typeof n||Array.isArray(n)){if(Array.isArray(n)&&!n.length)return void t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=de(e,n,function(e){ae(t,r,e)});ae(t,r,o)}else ae(t,r,n)}}function ue(e,t,n){fe(e,t,"style",n)}function ce(e,t,n,r){t.addEvent(n,x(r,e))}function le(e,t,n){if(n)for(var r=Object.keys(n),o=r.length;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.')),ce(e,t,i,a)}}function fe(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?pe(e,t,n,a,s):t[Pr[n]](a,s)}}function pe(e,t,n,r,o){var i=Pr[n],a=de(e,o,function(n){function o(){t[i](r,n)}var a=e&&e._app&&e._app.differ;a?a.append("element",t.depth||0,t.ref,o):o()});t[i](r,a)}function de(e,t,n){return e._static?t.call(e,e):new M(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function he(e,t){return e._app.doc.createBody(t)}function ve(e,t){return e._app.doc.createElement(t)}function ye(e,t){var n=me(e),r=_e(e),o=Mr++;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}}function me(e){return e._app.doc.createComment("start")}function _e(e){return e._app.doc.createComment("end")}function ge(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=be(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 be(e,t,n){return t.element?xe(t,n):we(t,n)}function we(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}function xe(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}}function Ee(e,t,n){void 0===n&&(n=!1),t.element?Ce(t,n):Oe(t),t._vm&&t._vm.$emit("hook:destroyed")}function Oe(e){var t=e.parentNode;t&&t.removeChild(e)}function Ce(e,t){void 0===t&&(t=!1);for(var n=[],r=e.start.nextSibling;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||Oe(e.start),n.forEach(function(e){Oe(e)}),t||Oe(e.end)}function Se(e){var t=e._options||{},n=t.template||{};t.replace?n.children&&1===n.children.length?ke(e,n.children[0],e._parentEl):ke(e,n.children,e._parentEl):ke(e,n,e._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+e._type+")"),e.$emit("hook:ready"),e._ready=!0}function ke(e,t,n,r){if(-1!==(e._app||{}).lastSignal){if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),je(t))return void Me(e,t,n,r);if(r=r||{},Ae(t))return console.debug('[JS Framework] compile "content" block by',t),void(e._content=ye(e,n));if(Ie(t,r))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!"):$e(e,t,n));if(Te(t,r))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!"):Re(e,t,n,r));var o=r.type||t.type;if(Ne(o,r))return void De(e,t,n,o,r);var i=o,a=Pe(e,t,i);if(a)return console.debug("[JS Framework] compile composed component by",t),void Fe(e,a,t,n,i,r);console.debug("[JS Framework] compile native component by",t),Le(e,t,n,i)}}function je(e){return Array.isArray(e)}function Ae(e){return"content"===e.type||"slot"===e.type}function Ie(e,t){return!t.hasOwnProperty("repeat")&&e.repeat}function Te(e,t){return!t.hasOwnProperty("shown")&&e.shown}function Ne(e,t){return"function"==typeof e&&!t.hasOwnProperty("type")}function Pe(e,t,n){var r;return e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]),e._options&&e._options.components&&(r=e._options.components[n]),t.component&&(r=r||{}),r}function Me(e,t,n,r){var o=ye(e,n);t.forEach(function(t){ke(e,t,o,r)})}function $e(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",u=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,c=ye(e,n);c.children=[],c.data=[],c.vms=[],Ue(e,t,c,{getter:i,key:a,value:s,trackBy:u,oldStyle:o})}function Re(e,t,n,r){var o={shown:!0},i=ye(e,n);n.element&&n.children&&n.children.push(i),r.repeat&&(o.repeat=r.repeat),Ve(e,t,i,o)}function De(e,t,n,r,o){var i=r.call(e),a=_({type:i},o),s=ye(e,n);n.element&&n.children&&n.children.push(s),de(e,r,function(n){var r=_({type:n},o);Ee(e,s,!0),ke(e,t,s,r)}),ke(e,t,s,a)}function Fe(e,t,n,r,o,i){var a=e.constructor,s=new a(o,t,e,r,void 0,{"hook:init":function(){e._static&&(this._static=e._static),oe(e,null,n.id,this),this._externalBinding={parent:e,template:n}},"hook:created":function(){Y(e,this,n,i.repeat)},"hook:ready":function(){this._content&&We(e,n,this._content)}});ee(e,s,n,r)}function Le(e,t,n,r){Z(t);var o;if("_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),o=he(e,r)):(console.debug("[JS Framework] compile to create element for "+r),o=ve(e,r)),!e._rootEl){e._rootEl=o;var i=e._externalBinding||{},a=i.template,s=i.parent;if(a&&a.events&&s&&o)for(var u in a.events){var c=s[a.events[u]];c&&o.addEvent(u,x(c,s))}}Q(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 l="tree"===t.append,f=e._app||{};-1===f.lastSignal||l||(console.debug("[JS Framework] compile to append single node for",o),f.lastSignal=ge(e,o,n)),-1!==f.lastSignal&&We(e,t,o),-1!==f.lastSignal&&l&&(console.debug("[JS Framework] compile to append whole tree for",o),f.lastSignal=ge(e,o,n))}function We(e,t,n){var r=e._app||{},o=t.children;o&&o.length&&o.every(function(t){return ke(e,t,n),-1!==r.lastSignal})}function Ue(e,t,n,r){function o(e,r,o){var a;c?(a=e,E(e)?(a[l]=r,a.hasOwnProperty("INDEX")||Object.defineProperty(a,"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."),a={},a[l]=r,a[f]=e)):(a={},a[l]=r,a[f]=e);var s=qe(o,a);i.push(s),ke(s,t,n,{repeat:e})}var i=n.vms,a=n.children,s=r.getter,u=r.trackBy,c=r.oldStyle,l=r.key,f=r.value,p=Be(e,n,s,"repeat",function(t){if(console.debug('[JS Framework] the "repeat" item has changed',t),n&&t){var r=a.slice(),s=i.slice(),p=n.data.slice(),d={},h={};t.forEach(function(e,t){var n=u?e[u]:c?e[l]:t;null!=n&&""!==n&&(d[n]=e)});var v=[];p.forEach(function(t,n){var o=u?t[u]:c?t[l]:n;d.hasOwnProperty(o)?(h[o]={item:t,index:n,key:o,target:r[n],vm:s[n]},v.push(t)):Ee(e,r[n])}),a.length=0,i.length=0,n.data=t.slice(),n.updateMark=n.start,t.forEach(function(t,r){var s=u?t[u]:c?t[l]:r,p=h[s];p?(p.item===v[0]?v.shift():(v.$remove(p.item),be(e,p.target,n.updateMark,!0)),a.push(p.target),i.push(p.vm),c?p.vm=t:p.vm[f]=t,p.vm[l]=r,n.updateMark=p.target):o(t,r,e)}),delete n.updateMark}});n.data=p.slice(0),p.forEach(function(t,n){o(t,n,e)})}function Ve(e,t,n,r){var o=Be(e,n,t.shown,"shown",function(o){console.debug('[JS Framework] the "if" item was changed',o),n&&!!n.display!=!!o&&(n.display=!!o,o?ke(e,t,n,r):Ee(e,n,!0))});n.display=!!o,o&&ke(e,t,n,r)}function Be(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return de(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 qe(e,t){var n=Object.create(e);return n._data=t,J(n),G(n),n._realParent=e,e._static&&(n._static=e._static),n}function ze(e,t){if(t instanceof ze)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 Je(e,t){var n=this,r=this._vmEvents,o=r[e];if(o){var i=new ze(e,t);o.forEach(function(e){e.call(n,i)})}}function He(e,t){var n=new ze(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Ge(e,t){var n=new ze(e,t);this.$emit(e,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(t){t.$broadcast(e,n)})}function Xe(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 Ke(e,t){if(e){var n=this._vmEvents;if(!t)return void delete n[e];var r=n[e];r&&r.$remove(t)}}function Ze(e,t){var n=e._options||{},r=n.events||{};for(var o in r)e.$on(o,r[o]);for(var i in t)e.$on(i,t[i]);$r.forEach(function(t){e.$on("hook:"+t,n[t])})}function Qe(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]),t=t||{};var a=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,Ze(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof a?a():a,o&&_(this._data,o),z(this),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,Se(this))}function Ye(e,t){for(var n in e)!function(n){var r=Rr[n];r||(r={},Rr[n]=r),e[n].forEach(function(e){"string"==typeof e&&(e={name:e}),r[e.name]&&!t||(r[e.name]=e)})}(n)}function et(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}function tt(e,t){var n=Rr[t],r={};for(var o in n)!function(n){Object.defineProperty(r,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var r=[],o=arguments.length;o--;)r[o]=arguments[o];return e.callTasks({module:t,method:n,args:r})}},set:function(r){if("function"==typeof r)return e.callTasks({module:t,method:n,args:[r]})}})}(o);return r}function nt(e,t){return e.customComponentMap[t]}function rt(e,t,n){var r=e.customComponentMap;if(r[t])return void console.error("[JS Framework] define a component("+t+") that already exists");r[t]=n}function ot(e){if(Dr.valid(e))return e;e="string"==typeof e?e:"";for(var t=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 it(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return r.errorMessage=function(e,t,n){return"Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n}(e,t,n),o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r}function at(e,t){t=t||global.WXEnvironment,t=O(t)?t:{};var n={isDowngrade:!1};if("function"===k(e)){var r=e.call(this,t,{semver:Dr,normalizeVersion:ot});r=!!r,n=r?it("custom","","custom params"):n}else{e=O(e)?e:{};var o=t.platform||"unknow",i=o.toLowerCase(),a=e[i]||{};for(var s in t){var u=s,c=u.toLowerCase(),l=t[s],f=c.indexOf("version")>=0,p=c.indexOf("devicemodel")>=0,d=a[s];if(d&&f){var h=ot(d),v=ot(t[s]);if(Dr.satisfies(v,h)){n=it(u,l,d);break}}else if(p){var y="array"===k(d)?d:[d];if(y.indexOf(l)>=0){n=it(u,l,d);break}}}}return n}function st(e,t){if(void 0===t&&(t={}),e&&e.callTasks)return e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}function ut(e,t,n,r){console.debug("[JS Framework] bootstrap for "+t);var o;if(gr(t))o=j(t);else{if(!xr(t))return new Error("Wrong component name: "+t);if(o=A(t),!nt(e,o))return new Error("It's not a component: "+t)}if(n=O(n)?n:{},"string"==typeof n.transformerVersion&&"string"==typeof global.transformerVersion&&!Dr.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=at(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&&st(e,n.viewport),e.vm=new Qe(o,null,{_app:e},null,r)}function ct(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),rt(e,t,n)}function lt(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):_(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}function ft(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&pt(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 pt(e){if(delete e._app,delete e._computed,delete e._css,delete e._data,delete e._ids,delete e._methods,delete e._options,delete e._parent,delete e._parentEl,delete e._rootEl,e._watchers){for(var t=e._watchers.length;t--;)e._watchers[t].teardown();delete e._watchers}if(e._childrenVms){for(var n=e._childrenVms.length;n--;)pt(e._childrenVms[n]);delete e._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+e._type+")"),e.$emit("hook:destroyed"),delete e._type,delete e._vmEvents}function dt(e){var t=e.doc||{},n=t.body||{};return n.toJSON?n.toJSON():{}}function ht(e,t,n,r,o){if(console.debug('[JS Framework] Fire a "'+n+'" event on an element('+t+") in instance("+e.id+")"),Array.isArray(t))return void t.some(function(t){return!1!==ht(e,t,n,r)});var i=e.doc.getRef(t);if(i){var a=e.doc.fireEvent(i,n,r,o);return e.differ.flush(),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),a}return new Error('invalid element reference "'+t+'"')}function vt(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 yt(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}function yt(e){e.differ.flush()}function mt(e,t){var n;return"array"!==k(t)&&(t=[t]),t.forEach(function(t){n=e.doc.taskCenter.send("module",{module:t.module,method:t.method},t.args)}),n}function _t(e,t,n,r){console.debug("[JS Framework] Intialize an instance with:\n",n);var o,i=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return Fr.apply(void 0,[e].concat(t))},a=function(t,r,i){o=ut(e,t,r,i||n),yt(e),e.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+e.id+")")},s=Qe,u=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return ct.apply(void 0,[e].concat(t))},c=function(t,n){o=ut(e,t,{},n)},l=function(t){return function(n){o=ut(e,t,{},n)}},f=e.doc,p=function(t){return e.requireModule(j(t))},d={config:e.options,define:i,bootstrap:a,requireModule:p,document:f,Vm:s};Object.freeze(d);var h;"function"==typeof t?h=t.toString().substr(12):t&&(h=t.toString()),h='(function(global){\n\n"use strict";\n\n '+h+" \n\n})(Object.create(this))";var v=global.WXEnvironment,y={};if(v&&"Web"!==v.platform){var m=e.requireModule("timer");Object.assign(y,{setTimeout:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=function(){t[0].apply(t,t.slice(2))};return m.setTimeout(r,t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=function(){t[0].apply(t,t.slice(2))};return m.setInterval(r,t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){m.clearTimeout(e)},clearInterval:function(e){m.clearInterval(e)}})}var _=Object.assign({define:i,require:l,bootstrap:a,register:u,render:c,__weex_define__:i,__weex_bootstrap__:a,__weex_document__:f,__weex_require__:p,__weex_viewmodel__:s,weex:d},y,r);return bt(_,h)||gt(_,h),o}function gt(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);return n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}function bt(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 u=0;u<i.length-1;++u)o+=i[u],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var c=e.weex||{},l=c.config||{};n=compileAndRunBundle(o,l.bundleUrl,l.bundleDigest,l.codeCachePath),n&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}function wt(e,t){var n=e[t];for(var r in n)n[r]()}function xt(e,t){var n=e[t];for(var r in n){n[r].forEach(function(e){e()})}}function Et(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new Tr.Document(e,this.options.bundleUrl,null,Tr.Listener),this.differ=new Lr(e)}function Ot(e,t,n,r,o){var i=o||{},a=i.services;P();var s=Wr[e];n=n||{};var u;return s?u=new Error('invalid instance id "'+e+'"'):(s=new Et(e,n),Wr[e]=s,u=_t(s,t,r,a)),u instanceof Error?u:s}function Ct(e){Tr.Document=e.Document,Tr.Element=e.Element,Tr.Comment=e.Comment,Tr.sendTasks=e.sendTasks,Tr.Listener=e.Listener}function St(e,t){var n=Wr[e];return n?lt(n,t):new Error('invalid instance id "'+e+'"')}function kt(e){"function"==typeof markupState&&markupState(),P();var t=Wr[e];if(!t)return new Error('invalid instance id "'+e+'"');ft(t),delete Wr[e];var n=Math.round(e);if(n>0){n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory()}return Wr}function jt(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Ur[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(Ur[e.type]=e))})}function At(e){"object"==typeof e&&Ye(e)}function It(e){"object"==typeof e&&et(Qe,e)}function Tt(e,t){if(Wr[e]&&Array.isArray(t)){var n=[];return t.forEach(function(t){var r=Vr[t.method],o=[].concat(t.args);"function"==typeof r&&(o.unshift(e),n.push(r.apply(void 0,o)))}),n}return new Error('invalid instance id "'+e+'" or tasks')}function Nt(e){var t=Wr[e];return t?dt(t):new Error('invalid instance id "'+e+'"')}function Pt(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=qs(t),this.reject=qs(n)}function Mt(){if(Rt(),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("debug")&&global.nativeLog.apply(global,Ft(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("log")&&global.nativeLog.apply(global,Ft(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("info")&&global.nativeLog.apply(global,Ft(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("warn")&&global.nativeLog.apply(global,Ft(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("error")&&global.nativeLog.apply(global,Ft(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];Dt("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Dt("error")&&console.__ori__.error.apply(console,e)}}}function $t(){Lu={},global.console=Wu}function Rt(){Fu.forEach(function(e){var t=Fu.indexOf(e);Lu[e]={},Fu.forEach(function(n){Fu.indexOf(n)<=t&&(Lu[e][n]=!0)})})}function Dt(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return Lu[t]&&Lu[t][e]}function Ft(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}function Lt(){if(void 0===setTimeout&&"function"==typeof Vu){var e={},t=0;global.setTimeout=function(n,r){e[++t]=n,Vu(t.toString(),r)},global.setTimeoutCallback=function(t){"function"==typeof e[t]&&(e[t](),delete e[t])}}}function Wt(){global.setTimeout=Uu,global.setTimeoutCallback=null}function Ut(){Object.freeze(Object),Object.freeze(Array),Vt(),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),Bt(),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype)}function Vt(){var e=Object.prototype,t="Object.prototype";qt(e,"__defineGetter__",t),qt(e,"__defineSetter__",t),qt(e,"__lookupGetter__",t),qt(e,"__lookupSetter__",t),qt(e,"constructor",t),qt(e,"hasOwnProperty",t),qt(e,"isPrototypeOf",t),qt(e,"propertyIsEnumerable",t),qt(e,"toLocaleString",t),qt(e,"toString",t),qt(e,"valueOf",t),Object.seal(e)}function Bt(){var e=Error.prototype,t="Error.prototype";qt(e,"name",t),qt(e,"message",t),qt(e,"toString",t),qt(e,"constructor",t),Object.seal(e)}function qt(e,t,n){if(e.hasOwnProperty(t)){var r=e[t];Object.defineProperty(e,t,{get:function(){return r},set:function(r){if(this===e)throw Error("Cannot assign to read only property "+t+" of "+n);return Object.defineProperty(this,t,{value:r,writable:!0}),r}})}}function zt(){return(Bu++).toString()}function Jt(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function Ht(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 Gt(e){if("function"!=typeof atob)return new ArrayBuffer(0);var t=atob(e),n=new Uint8Array(t.length);return Array.prototype.forEach.call(t,function(e,t){n[t]=e.charCodeAt(0)}),n.buffer}function Xt(e){var t=Jt(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:Ht(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:Ht(e.buffer)};default:return JSON.stringify(e)}}function Kt(e){if("Object"===Jt(e)){if(e["@type"]&&"binary"===e["@type"])return Gt(e.base64||"");var t={};for(var n in e)t[n]=Kt(e[n]);return t}return"Array"===Jt(e)?e.map(Kt):e}function Zt(e,t){e&&(zu[e]=t)}function Qt(e){return zu[e]}function Yt(e){delete zu[e]}function en(e){var t=zu[e];return t&&t.taskCenter?t.taskCenter:null}function tn(e,t,n){var r=e.documentElement;if(!(r.pureChildren.length>0||t.parentNode)){var o=r.children,i=o.indexOf(n);i<0?o.push(t):o.splice(i,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,on(t,r)):(t.children.forEach(function(e){e.parentNode=t}),rn(e,t),t.docId=e.id,t.ownerDocument=e,on(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),nn(e,t)):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function nn(e,t){var n=t.toJSON(),r=n.children;delete n.children;var o=e.taskCenter.send("dom",{action:"createBody"},[n]);return r&&r.forEach(function(t){o=e.taskCenter.send("dom",{action:"addElement"},[n.ref,t,-1])}),o}function rn(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function on(e,t){e.parentNode=t,t.docId&&(e.docId=t.docId,e.ownerDocument=t.ownerDocument,e.ownerDocument.nodeMap[e.nodeId]=e,e.depth=t.depth+1),e.children.forEach(function(t){on(t,e)})}function an(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function sn(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function un(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&&(i.previousSibling=e)),n}function cn(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 u=t[s-1],c=t[s];return t.splice(s,0,e),r&&(u&&(u.nextSibling=e),e.previousSibling=u,e.nextSibling=c,c&&(c.previousSibling=e)),o===s?-1:n}function ln(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)}}function fn(e,t){if(t&&t.length){var n=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Hu);t.forEach(function(t){n.prototype[t]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o=en(this.docId);if(o)return o.send("component",{ref:this.ref,component:e,method:t},n)}}),Gu[e]=n}}function pn(e){return Gu[e]}function dn(e,t){Qt(e).nodeMap[t.nodeId]=t}function hn(){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},t=Yu.prototype;for(var n in e)!function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return Qu(e,[{module:"dom",method:n,args:t}],"-1")}}(n);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return Qu(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return Qu(e,[{module:t,method:n,args:r}])}}function vn(e,t){mn(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),nc.push({name:e,options:t}))}function yn(e){nc.some(function(t,n){if(t.name===e)return nc.splice(n,1),!0})}function mn(e){return _n(e)>=0}function _n(e){return nc.map(function(e){return e.name}).indexOf(e)}function gn(e){var t=rc.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}function bn(e,t,n){var r=Object.create(null);return r.service=Object.create(null),nc.forEach(function(o){var i=(o.name,o.options),a=i.create;if(a){var s=a(e,t,n);Object.assign(r.service,s),Object.assign(r,s.instance)}}),delete r.service.instance,Object.freeze(r.service),r}function wn(e){if(oc[e])return oc[e].framework}function xn(e,t,n,r){if(oc[e])return new Error('invalid instance id "'+e+'"');var o=gn(t);n=JSON.parse(JSON.stringify(n||{})),n.env=JSON.parse(JSON.stringify(global.WXEnvironment||{}));var i={config:n,created:Date.now(),framework:o};i.services=bn(e,i,tc),oc[e]=i;var a=ec[o];return a?a.createInstance(e,t,n,r,i):new Error('invalid bundle type "'+o+'".')}function En(e){ic[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];"registerComponents"===e&&On(t[0]);for(var r in ec){var o=ec[r];o&&o[e]&&o[e].apply(o,t)}}}function On(e){Array.isArray(e)&&e.forEach(function(e){e&&e.type&&e.methods&&fn(e.type,e.methods)})}function Cn(e){ic[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=wn(r);if(o&&ec[o]){var i=(s=ec[o])[e].apply(s,t),a={framework:o};return"refreshInstance"===e?nc.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:tc})}):"destroyInstance"===e&&(nc.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:tc})}),delete oc[r]),i}return new Error('invalid instance id "'+r+'"');var s}}function Sn(e,t){ic[t]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=wn(r);return o&&ec[o]?(i=ec[o])[e].apply(i,t):new Error('invalid instance id "'+r+'"');var i}}function kn(e){tc=e||{},ec=tc.frameworks||{},hn();for(var t in ec){ec[t].init(e)}return["registerComponents","registerModules","registerMethods"].forEach(En),["destroyInstance","refreshInstance","receiveTasks","getRoot"].forEach(Cn),Sn("receiveTasks","callJS"),ic}function jn(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}function An(e,t){var n=t||global.callNative;return"function"!=typeof n&&console.error("[JS Runtime] no default handler"),function(t){Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var o=Tn(e,t[r],n);if(-1===o)return o}}}function In(e,t){return"dom"===e&&uc[t]&&"function"==typeof global[uc[t]]}function Tn(e,t,n){var r=t.module,o=t.method,i=t.args;return In(r,o)?global[uc[o]].apply(global,[e].concat(i,["-1"])):n(e,[t],"-1")}function Nn(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)}function Pn(){Ut(),Object.freeze(lc.Comment),Object.freeze(lc.Listener),Object.freeze(lc.Document.prototype),Object.freeze(lc.Comment.prototype),Object.freeze(lc.Listener.prototype)}function Mn(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()}function $n(){}function Rn(e,t,n,r){console.warn("[Upgrade Warning] $userTrack will be removed in the next version!"),console.warn("[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)}function Dn(e,t){if(console.warn("[Upgrade Warning] $sendMtop will be removed in the next version!"),console.warn("[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)}else{this._app.requireModule("stream").sendMtop(e,t)}}function Fn(e,t){console.warn("[Upgrade Warning] $callWindvane will be removed in the next version!"),console.warn("[JS Framework] Vm#$callWindvane is deprecated, please use \"require('@weex-module/windvane').call(params, callback)\" instead"),this._app.requireModule("windvane").call(e,t)}function Ln(e,t){console.warn("[Upgrade Warning] $setSpm will be removed in the next version!"),console.warn("[JS Framework] Vm#$setSpm is deprecated, please use \"require('@weex-module/pageInfo').setSpm(a, b)\" instead"),this._app.requireModule("pageInfo").setSpm(e,t)}function Wn(e){console.warn("[Upgrade Warning] $getUserInfo will be removed in the next version!"),console.warn("[JS Framework] Vm#$getUserInfo is deprecated, please use \"require('@weex-module/user').getUserInfo(callback)\" instead"),this._app.requireModule("user").getUserInfo(e)}function Un(e){console.warn("[Upgrade Warning] $login will be removed in the next version!"),console.warn("[JS Framework] Vm#$login is deprecated, please use \"require('@weex-module/user').login(callback)\" instead"),this._app.requireModule("user").login(e)}function Vn(e){console.warn("[Upgrade Warning] $logout will be removed in the next version!"),console.warn("[JS Framework] Vm#$logout is deprecated, please use \"require('@weex-module/user').logout(callback)\" instead"),this._app.requireModule("user").logout(e)}var Bn,qn={},zn={},Jn=Object.freeze({init:e,createInstance:t,destroyInstance:n,getRoot:r,receiveTasks:o}),Hn="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{},Gn=a(function(e){e.exports=function(e,t){function n(e){return void 0===e||null===e}function r(e){return void 0!==e&&null!==e}function o(e){return!0===e}function i(e){return!1===e}function a(e){return"string"==typeof e||"number"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}function u(e){return"[object Object]"===kn.call(e)}function c(e){return"[object RegExp]"===kn.call(e)}function l(e){var t=parseFloat(e);return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function p(e){var t=parseFloat(e);return isNaN(t)?e:t}function d(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]}}function h(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function v(e,t){return An.call(e,t)}function y(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}function m(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function _(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function g(e,t){for(var n in t)e[n]=t[n];return e}function b(e){for(var t={},n=0;n<e.length;n++)e[n]&&g(t,e[n]);return t}function w(e,t,n){}function x(e,t){if(e===t)return!0;var n=s(e),r=s(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var o=Array.isArray(e),i=Array.isArray(t);if(o&&i)return e.length===t.length&&e.every(function(e,n){return x(e,t[n])});if(o||i)return!1;var a=Object.keys(e),u=Object.keys(t);return a.length===u.length&&a.every(function(n){return x(e[n],t[n])})}catch(e){return!1}}function E(e,t){for(var n=0;n<e.length;n++)if(x(e[n],t))return n;return-1}function O(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}function C(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function S(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function k(e){if(!Vn.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}function j(e,t,n){if(Wn.errorHandler)Wn.errorHandler.call(null,e,t,n);else{if(!zn||"undefined"==typeof console)throw e;console.error(e)}}function A(e){return"function"==typeof e&&/native code/.test(e.toString())}function I(e){ar.target&&sr.push(ar.target),ar.target=e}function T(){ar.target=sr.pop()}function N(e,t,n){e.__proto__=t}function P(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];S(e,i,t[i])}}function M(e,t){if(s(e)){var n;return v(e,"__ob__")&&e.__ob__ instanceof pr?n=e.__ob__:fr.shouldConvert&&!tr()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new pr(e)),t&&n&&n.vmCount++,n}}function $(e,t,n,r,o){var i=new ar,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,u=a&&a.set,c=!o&&M(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return ar.target&&(i.depend(),c&&c.dep.depend(),Array.isArray(t)&&F(t)),t},set:function(t){var r=s?s.call(e):n;t===r||t!==t&&r!==r||(u?u.call(e,t):n=t,c=!o&&M(t),i.notify())}})}}function R(e,t,n){if(Array.isArray(e)&&l(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(v(e,t))return e[t]=n,n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?($(r.value,t,n),r.dep.notify(),n):(e[t]=n,n)}function D(e,t){if(Array.isArray(e)&&l(t))return void e.splice(t,1);var n=e.__ob__;e._isVue||n&&n.vmCount||v(e,t)&&(delete e[t],n&&n.dep.notify())}function F(e){for(var t=void 0,n=0,r=e.length;n<r;n++)t=e[n],t&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&F(t)}function L(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),a=0;a<i.length;a++)n=i[a],r=e[n],o=t[n],v(e,n)?u(r)&&u(o)&&L(r,o):R(e,n,o);return e}function W(e,t,n){return n?e||t?function(){var r="function"==typeof t?t.call(n):t,o="function"==typeof e?e.call(n):e;return r?L(r,o):o}:void 0:t?e?function(){return L("function"==typeof t?t.call(this):t,"function"==typeof e?e.call(this):e)}:t:e}function U(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function V(e,t){var n=Object.create(e||null);return t?g(n,t):n}function B(e){var t=e.props;if(t){var n,r,o,i={};if(Array.isArray(t))for(n=t.length;n--;)"string"==typeof(r=t[n])&&(o=Tn(r),i[o]={type:null});else if(u(t))for(var a in t)r=t[a],o=Tn(a),i[o]=u(r)?r:{type:r};e.props=i}}function q(e){var t=e.inject;if(Array.isArray(t))for(var n=e.inject={},r=0;r<t.length;r++)n[t[r]]=t[r]}function z(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})}}function J(e,t,n){function r(r){var o=dr[r]||hr;u[r]=o(e[r],t[r],n,r)}"function"==typeof t&&(t=t.options),B(t),q(t),z(t);var o=t.extends;if(o&&(e=J(e,o,n)),t.mixins)for(var i=0,a=t.mixins.length;i<a;i++)e=J(e,t.mixins[i],n);var s,u={};for(s in e)r(s);for(s in t)v(e,s)||r(s);return u}function H(e,t,n,r){if("string"==typeof n){var o=e[t];if(v(o,n))return o[n];var i=Tn(n);if(v(o,i))return o[i];var a=Nn(i);if(v(o,a))return o[a];var s=o[n]||o[i]||o[a];return s}}function G(e,t,n,r){var o=t[e],i=!v(n,e),a=n[e];if(Z(Boolean,o.type)&&(i&&!v(o,"default")?a=!1:Z(String,o.type)||""!==a&&a!==Mn(e)||(a=!0)),void 0===a){a=X(r,o,e);var s=fr.shouldConvert;fr.shouldConvert=!0,M(a),fr.shouldConvert=s}return a}function X(e,t,n){if(v(t,"default")){var r=t.default;return e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n]?e._props[n]:"function"==typeof r&&"Function"!==K(t.type)?r.call(e):r}}function K(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function Z(e,t){if(!Array.isArray(t))return K(t)===K(e);for(var n=0,r=t.length;n<r;n++)if(K(t[n])===K(e))return!0;return!1}function Q(e){return new vr(void 0,void 0,void 0,String(e))}function Y(e,t){var n=new vr(e.tag,e.data,e.children,e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return n.ns=e.ns,n.isStatic=e.isStatic,n.key=e.key,n.isComment=e.isComment,n.isCloned=!0,t&&e.children&&(n.children=ee(e.children)),n}function ee(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++)r[o]=Y(e[o],t);return r}function te(e){function t(){var e=arguments,n=t.fns;if(!Array.isArray(n))return n.apply(null,arguments);for(var r=n.slice(),o=0;o<r.length;o++)r[o].apply(null,e)}return t.fns=e,t}function ne(e,t,r,o,i){var a,s,c,l,f;for(a in e)s=c=e[a],l=t[a],f=gr(a),u(s)&&(c=s.handler,f.params=s.params),n(c)||(n(l)?(n(c.fns)&&(c=e[a]=te(c)),r(f.name,c,f.once,f.capture,f.passive,f.params)):c!==l&&(l.fns=c,e[a]=l));for(a in t)n(e[a])&&(f=gr(a),o(f.name,t[a],f.capture))}function re(e,t,i){function a(){i.apply(this,arguments),h(s.fns,a)}var s,u=e[t];n(u)?s=te([a]):r(u.fns)&&o(u.merged)?(s=u,s.fns.push(a)):s=te([u,a]),s.merged=!0,e[t]=s}function oe(e,t,o){var i=t.options.props;if(!n(i)){var a={},s=e.attrs,u=e.props;if(r(s)||r(u))for(var c in i){var l=Mn(c);ie(a,u,c,l,!0)||ie(a,s,c,l,!1)}return a}}function ie(e,t,n,o,i){if(r(t)){if(v(t,n))return e[n]=t[n],i||delete t[n],!0;if(v(t,o))return e[n]=t[o],i||delete t[o],!0}return!1}function ae(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}function se(e){return a(e)?[Q(e)]:Array.isArray(e)?ce(e):void 0}function ue(e){return r(e)&&r(e.text)&&i(e.isComment)}function ce(e,t){var i,s,u,c=[];for(i=0;i<e.length;i++)s=e[i],n(s)||"boolean"==typeof s||(u=c[c.length-1],Array.isArray(s)?c.push.apply(c,ce(s,(t||"")+"_"+i)):a(s)?ue(u)?u.text+=String(s):""!==s&&c.push(Q(s)):ue(s)&&ue(u)?c[c.length-1]=Q(u.text+s.text):(o(e._isVList)&&r(s.tag)&&n(s.key)&&r(t)&&(s.key="__vlist"+t+"_"+i+"__"),c.push(s)));return c}function le(e,t){return e.__esModule&&e.default&&(e=e.default),s(e)?t.extend(e):e}function fe(e,t,n,r,o){var i=_r();return i.asyncFactory=e,i.asyncMeta={data:t,context:n,children:r,tag:o},i}function pe(e,t,i){if(o(e.error)&&r(e.errorComp))return e.errorComp;if(r(e.resolved))return e.resolved;if(o(e.loading)&&r(e.loadingComp))return e.loadingComp;if(!r(e.contexts)){var a=e.contexts=[i],u=!0,c=function(){for(var e=0,t=a.length;e<t;e++)a[e].$forceUpdate()},l=O(function(n){e.resolved=le(n,t),u||c()}),f=O(function(t){r(e.errorComp)&&(e.error=!0,c())}),p=e(l,f);return s(p)&&("function"==typeof p.then?n(e.resolved)&&p.then(l,f):r(p.component)&&"function"==typeof p.component.then&&(p.component.then(l,f),r(p.error)&&(e.errorComp=le(p.error,t)),r(p.loading)&&(e.loadingComp=le(p.loading,t),0===p.delay?e.loading=!0:setTimeout(function(){n(e.resolved)&&n(e.error)&&(e.loading=!0,c())},p.delay||200)),r(p.timeout)&&setTimeout(function(){n(e.resolved)&&f(null)},p.timeout))),u=!1,e.loading?e.loadingComp:e.resolved}e.contexts.push(i)}function de(e){return e.isComment&&e.asyncFactory}function he(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(r(n)&&(r(n.componentOptions)||de(n)))return n}}function ve(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&_e(e,t)}function ye(e,t,n){n?mr.$once(e,t):mr.$on(e,t)}function me(e,t){mr.$off(e,t)}function _e(e,t,n){mr=e,ne(t,n||{},ye,me,e)}function ge(e,t){var n={};if(!e)return n;for(var r=[],o=0,i=e.length;o<i;o++){var a=e[o];if(a.context!==t&&a.functionalContext!==t||!a.data||null==a.data.slot)r.push(a);else{var s=a.data.slot,u=n[s]||(n[s]=[]);"template"===a.tag?u.push.apply(u,a.children):u.push(a)}}return r.every(be)||(n.default=r),n}function be(e){return e.isComment||" "===e.text}function we(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?we(e[n],t):t[e[n].key]=e[n].fn;return t}function xe(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 Ee(e,t,n){e.$el=t,e.$options.render||(e.$options.render=_r),je(e,"beforeMount");var r;return r=function(){e._update(e._render(),n)},e._watcher=new jr(e,r,w),n=!1,null==e.$vnode&&(e._isMounted=!0,je(e,"mounted")),e}function Oe(e,t,n,r,o){var i=!!(o||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==Un);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=o,e.$attrs=r.data&&r.data.attrs||Un,e.$listeners=n||Un,t&&e.$options.props){fr.shouldConvert=!1;for(var a=e._props,s=e.$options._propKeys||[],u=0;u<s.length;u++){var c=s[u];a[c]=G(c,e.$options.props,t,e)}fr.shouldConvert=!0,e.$options.propsData=t}if(n){var l=e.$options._parentListeners;e.$options._parentListeners=n,_e(e,n,l)}i&&(e.$slots=ge(o,r.context),e.$forceUpdate())}function Ce(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function Se(e,t){if(t){if(e._directInactive=!1,Ce(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++)Se(e.$children[n]);je(e,"activated")}}function ke(e,t){if(!(t&&(e._directInactive=!0,Ce(e))||e._inactive)){e._inactive=!0;for(var n=0;n<e.$children.length;n++)ke(e.$children[n]);je(e,"deactivated")}}function je(e,t){var n=e.$options[t];if(n)for(var r=0,o=n.length;r<o;r++)try{n[r].call(e)}catch(n){j(n,e,t+" hook")}e._hasHookEvent&&e.$emit("hook:"+t)}function Ae(){Sr=wr.length=xr.length=0,Er={},Or=Cr=!1}function Ie(){Cr=!0;var e,t;for(wr.sort(function(e,t){return e.id-t.id}),Sr=0;Sr<wr.length;Sr++)e=wr[Sr],t=e.id,Er[t]=null,e.run();var n=xr.slice(),r=wr.slice();Ae(),Pe(n),Te(r),nr&&Wn.devtools&&nr.emit("flush")}function Te(e){for(var t=e.length;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&je(r,"updated")}}function Ne(e){e._inactive=!1,xr.push(e)}function Pe(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,Se(e[t],!0)}function Me(e){var t=e.id;if(null==Er[t]){if(Er[t]=!0,Cr){for(var n=wr.length-1;n>Sr&&wr[n].id>e.id;)n--;wr.splice(n+1,0,e)}else wr.push(e);Or||(Or=!0,or(Ie))}}function $e(e){Ar.clear(),Re(e,Ar)}function Re(e,t){var n,r,o=Array.isArray(e);if((o||s(e))&&Object.isExtensible(e)){if(e.__ob__){var i=e.__ob__.dep.id;if(t.has(i))return;t.add(i)}if(o)for(n=e.length;n--;)Re(e[n],t);else for(r=Object.keys(e),n=r.length;n--;)Re(e[r[n]],t)}}function De(e,t,n){Ir.get=function(){return this[t][n]},Ir.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Ir)}function Fe(e){e._watchers=[];var t=e.$options;t.props&&Le(e,t.props),t.methods&&ze(e,t.methods),t.data?We(e):M(e._data={},!0),t.computed&&Ve(e,t.computed),t.watch&&t.watch!==Kn&&Je(e,t.watch)}function Le(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;fr.shouldConvert=i;for(var a in t)!function(i){o.push(i);var a=G(i,t,n,e);$(r,i,a),i in e||De(e,"_props",i)}(a);fr.shouldConvert=!0}function We(e){var t=e.$options.data;t=e._data="function"==typeof t?Ue(t,e):t||{},u(t)||(t={});for(var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);o--;){var i=n[o];r&&v(r,i)||C(i)||De(e,"_data",i)}M(t,!0)}function Ue(e,t){try{return e.call(t)}catch(e){return j(e,t,"data()"),{}}}function Ve(e,t){var n=e._computedWatchers=Object.create(null),r=tr();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;r||(n[o]=new jr(e,a||w,w,Tr)),o in e||Be(e,o,i)}}function Be(e,t,n){var r=!tr();"function"==typeof n?(Ir.get=r?qe(t):n,Ir.set=w):(Ir.get=n.get?r&&!1!==n.cache?qe(t):n.get:w,Ir.set=n.set?n.set:w),Object.defineProperty(e,t,Ir)}function qe(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ar.target&&t.depend(),t.value}}function ze(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?w:m(t[n],e)}function Je(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)He(e,n,r[o]);else He(e,n,r)}}function He(e,t,n,r){return u(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Ge(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function Xe(e){var t=Ke(e.$options.inject,e);t&&(fr.shouldConvert=!1,Object.keys(t).forEach(function(n){$(e,n,t[n])}),fr.shouldConvert=!0)}function Ke(e,t){if(e){for(var n=Object.create(null),r=rr?Reflect.ownKeys(e):Object.keys(e),o=0;o<r.length;o++)for(var i=r[o],a=e[i],s=t;s;){if(s._provided&&a in s._provided){n[i]=s._provided[a];break}s=s.$parent}return n}}function Ze(e,t,n,o,i){var a={},s=e.options.props;if(r(s))for(var u in s)a[u]=G(u,s,t||Un);else r(n.attrs)&&Qe(a,n.attrs),r(n.props)&&Qe(a,n.props);var c=Object.create(o),l=function(e,t,n,r){return ot(c,e,t,n,r,!0)},f=e.options.render.call(null,l,{data:n,props:a,children:i,parent:o,listeners:n.on||Un,injections:Ke(e.options.inject,o),slots:function(){return ge(i,o)}});return f instanceof vr&&(f.functionalContext=o,f.functionalOptions=e.options,n.slot&&((f.data||(f.data={})).slot=n.slot)),f}function Qe(e,t){for(var n in t)e[Tn(n)]=t[n]}function Ye(e,t,i,a,u){if(!n(e)){var c=i.$options._base;if(s(e)&&(e=c.extend(e)),"function"==typeof e){var l;if(n(e.cid)&&(l=e,void 0===(e=pe(l,c,i))))return fe(l,t,i,a,u);t=t||{},gt(e),r(t.model)&&rt(e.options,t);var f=oe(t,e,u);if(o(e.options.functional))return Ze(e,f,t,i,a);var p=t.on;if(t.on=t.nativeOn,o(e.options.abstract)){var d=t.slot;t={},d&&(t.slot=d)}tt(t);var h=e.options.name||u;return new vr("vue-component-"+e.cid+(h?"-"+h:""),t,void 0,void 0,void 0,i,{Ctor:e,propsData:f,listeners:p,tag:u,children:a},l)}}}function et(e,t,n,o){var i=e.componentOptions,a={_isComponent:!0,parent:t,propsData:i.propsData,_componentTag:i.tag,_parentVnode:e,_parentListeners:i.listeners,_renderChildren:i.children,_parentElm:n||null,_refElm:o||null},s=e.data.inlineTemplate;return r(s)&&(a.render=s.render,a.staticRenderFns=s.staticRenderFns),new i.Ctor(a)}function tt(e){e.hook||(e.hook={});for(var t=0;t<Pr.length;t++){var n=Pr[t],r=e.hook[n],o=Nr[n];e.hook[n]=r?nt(o,r):o}}function nt(e,t){return function(n,r,o,i){e(n,r,o,i),t(n,r,o,i)}}function rt(e,t){var n=e.model&&e.model.prop||"value",o=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var i=t.on||(t.on={});r(i[o])?i[o]=[t.model.callback].concat(i[o]):i[o]=t.model.callback}function ot(e,t,n,r,i,s){return(Array.isArray(n)||a(n))&&(i=r,r=n,n=void 0),o(s)&&(i=$r),it(e,t,n,r,i)}function it(e,t,n,o,i){if(r(n)&&r(n.__ob__))return _r();if(r(n)&&r(n.is)&&(t=n.is),!t)return _r();Array.isArray(o)&&"function"==typeof o[0]&&(n=n||{},n.scopedSlots={default:o[0]},o.length=0),i===$r?o=se(o):i===Mr&&(o=ae(o));var a,s;if("string"==typeof t){var u;s=e.$vnode&&e.$vnode.ns||Wn.getTagNamespace(t),a=Wn.isReservedTag(t)?new vr(Wn.parsePlatformTagName(t),n,o,void 0,void 0,e):r(u=H(e.$options,"components",t))?Ye(u,n,e,o,t):new vr(t,n,o,void 0,void 0,e)}else a=Ye(t,n,e,o);return r(a)?(s&&at(a,s),a):_r()}function at(e,t){if(e.ns=t,"foreignObject"!==e.tag&&r(e.children))for(var o=0,i=e.children.length;o<i;o++){var a=e.children[o];r(a.tag)&&n(a.ns)&&at(a,t)}}function st(e,t){var n,o,i,a,u;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),o=0,i=e.length;o<i;o++)n[o]=t(e[o],o);else if("number"==typeof e)for(n=new Array(e),o=0;o<e;o++)n[o]=t(o+1,o);else if(s(e))for(a=Object.keys(e),n=new Array(a.length),o=0,i=a.length;o<i;o++)u=a[o],n[o]=t(e[u],u,o);return r(n)&&(n._isVList=!0),n}function ut(e,t,n,r){var o=this.$scopedSlots[e];if(o)return n=n||{},r&&(n=g(g({},r),n)),o(n)||t;var i=this.$slots[e];return i||t}function ct(e){return H(this.$options,"filters",e,!0)||Rn}function lt(e,t,n){var r=Wn.keyCodes[t]||n;return Array.isArray(r)?-1===r.indexOf(e):r!==e}function ft(e,t,n,r,o){if(n)if(s(n)){Array.isArray(n)&&(n=b(n));var i;for(var a in n)!function(a){if("class"===a||"style"===a||jn(a))i=e;else{var s=e.attrs&&e.attrs.type;i=r||Wn.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}if(!(a in i)&&(i[a]=n[a],o)){(e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}}}(a)}else;return e}function pt(e,t){var n=this._staticTrees[e];return n&&!t?Array.isArray(n)?ee(n):Y(n):(n=this._staticTrees[e]=this.$options.staticRenderFns[e].call(this._renderProxy),ht(n,"__static__"+e,!1),n)}function dt(e,t,n){return ht(e,"__once__"+t+(n?"_"+n:""),!0),e}function ht(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&vt(e[r],t+"_"+r,n);else vt(e,t,n)}function vt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function yt(e,t){if(t)if(u(t)){var n=e.on=e.on?g({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(i,o):i}}else;return e}function mt(e){e._vnode=null,e._staticTrees=null;var t=e.$vnode=e.$options._parentVnode,n=t&&t.context;e.$slots=ge(e.$options._renderChildren,n),e.$scopedSlots=Un,e._c=function(t,n,r,o){return ot(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return ot(e,t,n,r,o,!0)};var r=t&&t.data;$(e,"$attrs",r&&r.attrs||Un,null,!0),$(e,"$listeners",e.$options._parentListeners||Un,null,!0)}function _t(e,t){var n=e.$options=Object.create(e.constructor.options);n.parent=t.parent,n.propsData=t.propsData,n._parentVnode=t._parentVnode,n._parentListeners=t._parentListeners,n._renderChildren=t._renderChildren,n._componentTag=t._componentTag,n._parentElm=t._parentElm,n._refElm=t._refElm,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function gt(e){var t=e.options;if(e.super){var n=gt(e.super);if(n!==e.superOptions){e.superOptions=n;var r=bt(e);r&&g(e.extendOptions,r),t=e.options=J(n,e.extendOptions),t.name&&(t.components[t.name]=e)}}return t}function bt(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]=wt(n[i],r[i],o[i]));return t}function wt(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++)(t.indexOf(e[o])>=0||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function xt(e){this._init(e)}function Et(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=_(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}}function Ot(e){e.mixin=function(e){return this.options=J(this.options,e),this}}function Ct(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name,a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=J(n.options,e),a.super=n,a.options.props&&St(a),a.options.computed&&kt(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,Fn.forEach(function(e){a[e]=n[e]}),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=g({},a.options),o[r]=a,a}}function St(e){var t=e.options.props;for(var n in t)De(e.prototype,"_props",n)}function kt(e){var t=e.options.computed;for(var n in t)Be(e.prototype,n,t[n])}function jt(e){Fn.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}function At(e){return e&&(e.Ctor.options.name||e.tag)}function It(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!c(e)&&e.test(t)}function Tt(e,t,n){for(var r in e){var o=e[r];if(o){var i=At(o.componentOptions);i&&!n(i)&&(o!==t&&Nt(o),e[r]=null)}}}function Nt(e){e&&e.componentInstance.$destroy()}function Pt(e){return new t.Element(e)}function Mt(e,n){return new t.Element(e+":"+n)}function $t(e){return new t.TextNode(e)}function Rt(e){return new t.Comment(e)}function Dt(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=Pt("text");r.setAttr("value",t.text),e.insertBefore(r,n)}}function Ft(e,t){if(3===t.nodeType)return void e.setAttr("value","");e.removeChild(t)}function Lt(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=Pt("text");n.setAttr("value",t.text),e.appendChild(n)}}function Wt(e){return e.parentNode}function Ut(e){return e.nextSibling}function Vt(e){return e.type}function Bt(e,t){e.parentNode.setAttr("value",t)}function qt(e,t,n){e.setAttr(t,n)}function zt(e,t){var n=e.data.ref;if(n){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?h(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}}function Jt(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&r(e.data)===r(t.data)&&Ht(e,t)||o(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&n(t.asyncFactory.error))}function Ht(e,t){if("input"!==e.tag)return!0;var n,o=r(n=e.data)&&r(n=n.attrs)&&n.type,i=r(n=t.data)&&r(n=n.attrs)&&n.type;return o===i||qr(o)&&qr(i)}function Gt(e,t,n){var o,i,a={};for(o=t;o<=n;++o)i=e[o].key,r(i)&&(a[i]=o);return a}function Xt(e,t){(e.data.directives||t.data.directives)&&Kt(e,t)}function Kt(e,t){var n,r,o,i=e===zr,a=t===zr,s=Zt(e.data.directives,e.context),u=Zt(t.data.directives,t.context),c=[],l=[];for(n in u)r=s[n],
o=u[n],r?(o.oldValue=r.value,Yt(o,"update",t,e),o.def&&o.def.componentUpdated&&l.push(o)):(Yt(o,"bind",t,e),o.def&&o.def.inserted&&c.push(o));if(c.length){var f=function(){for(var n=0;n<c.length;n++)Yt(c[n],"inserted",t,e)};i?re(t.data.hook||(t.data.hook={}),"insert",f):f()}if(l.length&&re(t.data.hook||(t.data.hook={}),"postpatch",function(){for(var n=0;n<l.length;n++)Yt(l[n],"componentUpdated",t,e)}),!i)for(n in s)u[n]||Yt(s[n],"unbind",e,e,a)}function Zt(e,t){var n=Object.create(null);if(!e)return n;var r,o;for(r=0;r<e.length;r++)o=e[r],o.modifiers||(o.modifiers=Gr),n[Qt(o)]=o,o.def=H(t.$options,"directives",o.name,!0);return n}function Qt(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function Yt(e,t,n,r,o){var i=e.def&&e.def[t];if(i)try{i(n.elm,e,n,r,o)}catch(r){j(r,n.context,"directive "+e.name+" "+t+" hook")}}function en(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=g({},a));for(n in a)r=a[n],i[n]!==r&&o.setAttr(n,r);for(n in i)null==a[n]&&o.setAttr(n)}}function tn(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 u=[],c=o.staticClass;c&&u.push.apply(u,c),o.class&&u.push.apply(u,o.class);var l=nn(a,u,r);for(var f in l)n.setStyle(f,l[f])}}function nn(e,t,n){var r=n.$options.style||{},o={};return t.forEach(function(e){g(o,r[e])}),e.forEach(function(e){var t=r[e];for(var n in t)o.hasOwnProperty(n)||(o[n]="")}),o}function rn(e,t,n,r,o,i){if(r)return void console.log("Weex do not support event in bubble phase.");if(n){var a=t,s=Wr;t=function(t){null!==(1===arguments.length?a(t):a.apply(null,arguments))&&on(e,null,null,s)}}Wr.addEvent(e,t,i)}function on(e,t,n,r){(r||Wr).removeEvent(e)}function an(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};Wr=t.elm,ne(n,r,rn,on,t.context)}}function sn(e,t){if(!t.data.staticStyle)return void un(e,t);var n=t.elm,r=t.data.staticStyle;for(var o in r)r[o]&&n.setStyle(Yr(o),r[o]);un(e,t)}function un(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=cn(a)),s&&(a=t.data.style=g({},a));for(r in i)a[r]||o.setStyle(Yr(r),"");for(r in a)n=a[r],o.setStyle(Yr(r),n)}}function cn(e){for(var t={},n=0;n<e.length;n++)e[n]&&g(t,e[n]);return t}function ln(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&g(t,to(e.name||"v")),g(t,e),t}return"string"==typeof e?to(e):void 0}}function fn(e,t){var n=t.elm;n._leaveCb&&(n._leaveCb.cancelled=!0,n._leaveCb());var r=ln(t.data.transition);if(r&&!n._enterCb){for(var o=r.enterClass,i=r.enterToClass,a=r.enterActiveClass,s=r.appearClass,u=r.appearToClass,c=r.appearActiveClass,l=r.beforeEnter,f=r.enter,p=r.afterEnter,d=r.enterCancelled,h=r.beforeAppear,v=r.appear,y=r.afterAppear,m=r.appearCancelled,_=br,g=br.$vnode;g&&g.parent;)g=g.parent,_=g.context;var b=!_._isMounted||!t.isRootInsert;if(!b||v||""===v){var x=b?s:o,E=b?u:i,C=b?c:a,S=b?h||l:l,k=b&&"function"==typeof v?v:f,j=b?y||p:p,A=b?m||d:d,I=k&&(k._length||k.length)>1,T=t.context.$options.style||{},N=T[x],P=T["@TRANSITION"]&&T["@TRANSITION"][C]||{},M=dn(n,T,x,E,C,t.context),$=Object.keys(M).length>0,R=n._enterCb=O(function(){R.cancelled?A&&A(n):j&&j(n),n._enterCb=null});if(setTimeout(function(){var e=n.parentNode,r=e&&e._pending&&e._pending[t.key];if(r&&r.context===t.context&&r.tag===t.tag&&r.elm._leaveCb&&r.elm._leaveCb(),k&&k(n,R),$){t.context.$requireWeexModule("animation").transition(n.ref,{styles:M,duration:P.duration||0,delay:P.delay||0,timingFunction:P.timingFunction||"linear"},I?w:R)}else I||R()},16),S&&S(n),N)for(var D in N)n.setStyle(D,N[D]);$||I||R()}}}function pn(e,t){function n(){function t(){n.transition(r.ref,{styles:y,duration:m.duration||0,delay:m.delay||0,timingFunction:m.timingFunction||"linear"},d?w:_)}var n=e.context.$requireWeexModule("animation");_.cancelled||(e.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[e.key]=e),u&&u(r),v?n.transition(r.ref,{styles:v},t):t(),c&&c(r,_),y||d||_())}var r=e.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var o=ln(e.data.transition);if(!o)return t();if(!r._leaveCb){var i=o.leaveClass,a=o.leaveToClass,s=o.leaveActiveClass,u=o.beforeLeave,c=o.leave,l=o.afterLeave,f=o.leaveCancelled,p=o.delayLeave,d=c&&(c._length||c.length)>1,h=e.context.$options.style||{},v=h[i],y=h[a]||h[s],m=h["@TRANSITION"]&&h["@TRANSITION"][s]||{},_=r._leaveCb=O(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[e.key]=null),_.cancelled?f&&f(r):(t(),l&&l(r)),r._leaveCb=null});p?p(n):n()}}function dn(e,t,n,r,o,i){var a={},s=t[n],u=t[r],c=t[o];if(s)for(var l in s)a[l]=e.style[l];if(c)for(var f in c)0!==f.indexOf("transition")&&(a[f]=c[f]);return u&&g(a,u),a}function hn(e){return e.tag?e.tag.replace(/vue\-component\-(\d+\-)?/,""):""}function vn(e){return e.children&&1===e.children.length&&!e.children[0].tag}function yn(e){var t=String(e).match(so);return t?Number(t[1]):e}function mn(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||{};[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])});for(var a in o)o[a]=yn(o[a]);return o}}}function _n(e){if(e.length)return e.map(function(e){var t=hn(e),n={type:t};if(t){if(n.style=mn(e),e.data&&(n.attr=e.data.attrs,e.data.on&&(n.events=e.data.on)),"span"===t&&vn(e))return n.attr=n.attr||{},n.attr.value=e.children[0].text.trim(),n}else n.type="span",n.attr={value:(e.text||"").trim()};return e.children&&e.children.length&&(n.children=_n(e.children)),n})}function gn(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?gn(he(t.children)):e}function bn(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[Tn(i)]=o[i];return t}function wn(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function xn(e){for(;e=e.parent;)if(e.data.transition)return!0}function En(e,t){return t.key===e.key&&t.tag===e.tag}function On(){}function Cn(){}function Sn(e,n){var r=new t.Comment("root");return r.hasAttribute=r.removeAttribute=function(){},n.documentElement.appendChild(r),r}var kn=Object.prototype.toString,jn=(d("slot,component",!0),d("key,ref,slot,is")),An=Object.prototype.hasOwnProperty,In=/-(\w)/g,Tn=y(function(e){return e.replace(In,function(e,t){return t?t.toUpperCase():""})}),Nn=y(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),Pn=/\B([A-Z])/g,Mn=y(function(e){return e.replace(Pn,"-$1").toLowerCase()}),$n=function(e,t,n){return!1},Rn=function(e){return e},Dn="data-server-rendered",Fn=["component","directive","filter"],Ln=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated"],Wn={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:$n,isReservedAttr:$n,isUnknownElement:$n,getTagNamespace:w,parsePlatformTagName:Rn,mustUseProp:$n,_lifecycleHooks:Ln},Un=Object.freeze({}),Vn=/[^\w.$]/,Bn=w,qn="__proto__"in{},zn="undefined"!=typeof window,Jn=zn&&window.navigator.userAgent.toLowerCase(),Gn=(Jn&&/msie|trident/.test(Jn),Jn&&Jn.indexOf("msie 9.0"),Jn&&Jn.indexOf("edge/")>0),Xn=(Jn&&Jn.indexOf("android"),Jn&&/iphone|ipad|ipod|ios/.test(Jn)),Kn=(Jn&&/chrome\/\d+/.test(Jn),{}.watch),Zn=!1;if(zn)try{var Qn={};Object.defineProperty(Qn,"passive",{get:function(){Zn=!0}}),window.addEventListener("test-passive",null,Qn)}catch(e){}var Yn,er,tr=function(){return void 0===Yn&&(Yn=!zn&&void 0!==Hn&&"server"===Hn.process.env.VUE_ENV),Yn},nr=zn&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,rr="undefined"!=typeof Symbol&&A(Symbol)&&"undefined"!=typeof Reflect&&A(Reflect.ownKeys),or=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t<e.length;t++)e[t]()}var t,n=[],r=!1;if("undefined"!=typeof Promise&&A(Promise)){var o=Promise.resolve(),i=function(e){console.error(e)};t=function(){o.then(e).catch(i),Xn&&setTimeout(w)}}else if("undefined"==typeof MutationObserver||!A(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())t=function(){setTimeout(e,0)};else{var a=1,s=new MutationObserver(e),u=document.createTextNode(String(a));s.observe(u,{characterData:!0}),t=function(){a=(a+1)%2,u.data=String(a)}}return function(e,o){var i;if(n.push(function(){if(e)try{e.call(o)}catch(e){j(e,o,"nextTick")}else i&&i(o)}),r||(r=!0,t()),!e&&"undefined"!=typeof Promise)return new Promise(function(e,t){i=e})}}();er="undefined"!=typeof Set&&A(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 ir=0,ar=function(){this.id=ir++,this.subs=[]};ar.prototype.addSub=function(e){this.subs.push(e)},ar.prototype.removeSub=function(e){h(this.subs,e)},ar.prototype.depend=function(){ar.target&&ar.target.addDep(this)},ar.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},ar.target=null;var sr=[],ur=Array.prototype,cr=Object.create(ur);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=ur[e];S(cr,e,function(){for(var n=arguments,r=[],o=arguments.length;o--;)r[o]=n[o];var i,a=t.apply(this,r),s=this.__ob__;switch(e){case"push":case"unshift":i=r;break;case"splice":i=r.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})});var lr=Object.getOwnPropertyNames(cr),fr={shouldConvert:!0},pr=function(e){if(this.value=e,this.dep=new ar,this.vmCount=0,S(e,"__ob__",this),Array.isArray(e)){(qn?N:P)(e,cr,lr),this.observeArray(e)}else this.walk(e)};pr.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)$(e,t[n],e[t[n]])},pr.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)M(e[t])};var dr=Wn.optionMergeStrategies;dr.data=function(e,t,n){return n?W(e,t,n):t&&"function"!=typeof t?e:W.call(this,e,t)},Ln.forEach(function(e){dr[e]=U}),Fn.forEach(function(e){dr[e+"s"]=V}),dr.watch=function(e,t){if(e===Kn&&(e=void 0),t===Kn&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var n={};g(n,e);for(var r in t){var o=n[r],i=t[r];o&&!Array.isArray(o)&&(o=[o]),n[r]=o?o.concat(i):Array.isArray(i)?i:[i]}return n},dr.props=dr.methods=dr.inject=dr.computed=function(e,t){if(!e)return t;var n=Object.create(null);return g(n,e),t&&g(n,t),n},dr.provide=W;var hr=function(e,t){return void 0===t?e:t},vr=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.functionalContext=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},yr={child:{}};yr.child.get=function(){return this.componentInstance},Object.defineProperties(vr.prototype,yr);var mr,_r=function(e){void 0===e&&(e="");var t=new vr;return t.text=e,t.isComment=!0,t},gr=y(function(e){var t="&"===e.charAt(0);e=t?e.slice(1):e;var n="~"===e.charAt(0);e=n?e.slice(1):e;var r="!"===e.charAt(0);return e=r?e.slice(1):e,{name:e,once:n,capture:r,passive:t}}),br=null,wr=[],xr=[],Er={},Or=!1,Cr=!1,Sr=0,kr=0,jr=function(e,t,n,r){this.vm=e,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=++kr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new er,this.newDepIds=new er,this.expression="","function"==typeof t?this.getter=t:(this.getter=k(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};jr.prototype.get=function(){I(this);var e,t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;j(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&$e(e),T(),this.cleanupDeps()}return e},jr.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))},jr.prototype.cleanupDeps=function(){for(var e=this,t=this.deps.length;t--;){var n=e.deps[t];e.newDepIds.has(n.id)||n.removeSub(e)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},jr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():Me(this)},jr.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){j(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},jr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},jr.prototype.depend=function(){for(var e=this,t=this.deps.length;t--;)e.deps[t].depend()},jr.prototype.teardown=function(){var e=this;if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var t=this.deps.length;t--;)e.deps[t].removeSub(e);this.active=!1}};var Ar=new er,Ir={enumerable:!0,configurable:!0,get:w,set:w},Tr={lazy:!0},Nr={init:function(e,t,n,r){if(!e.componentInstance||e.componentInstance._isDestroyed){(e.componentInstance=et(e,br,n,r)).$mount(t?e.elm:void 0,t)}else if(e.data.keepAlive){var o=e;Nr.prepatch(o,o)}},prepatch:function(e,t){var n=t.componentOptions;Oe(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t=e.context,n=e.componentInstance;n._isMounted||(n._isMounted=!0,je(n,"mounted")),e.data.keepAlive&&(t._isMounted?Ne(n):Se(n,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?ke(t,!0):t.$destroy())}},Pr=Object.keys(Nr),Mr=1,$r=2,Rr=0;!function(e){e.prototype._init=function(e){var t=this;t._uid=Rr++,t._isVue=!0,e&&e._isComponent?_t(t,e):t.$options=J(gt(t.constructor),e||{},t),t._renderProxy=t,t._self=t,xe(t),ve(t),mt(t),je(t,"beforeCreate"),Xe(t),Fe(t),Ge(t),je(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(xt),function(e){var t={};t.get=function(){return this._data};var n={};n.get=function(){return this._props},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=R,e.prototype.$delete=D,e.prototype.$watch=function(e,t,n){var r=this;if(u(t))return He(r,e,t,n);n=n||{},n.user=!0;var o=new jr(r,e,t,n);return n.immediate&&t.call(r,o.value),function(){o.teardown()}}}(xt),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this,o=this;if(Array.isArray(e))for(var i=0,a=e.length;i<a;i++)r.$on(e[i],n);else(o._events[e]||(o._events[e]=[])).push(n),t.test(e)&&(o._hasHookEvent=!0);return o},e.prototype.$once=function(e,t){function n(){r.$off(e,n),t.apply(r,arguments)}var r=this;return n.fn=t,r.$on(e,n),r},e.prototype.$off=function(e,t){var n=this,r=this;if(!arguments.length)return r._events=Object.create(null),r;if(Array.isArray(e)){for(var o=0,i=e.length;o<i;o++)n.$off(e[o],t);return r}var a=r._events[e];if(!a)return r;if(1===arguments.length)return r._events[e]=null,r;for(var s,u=a.length;u--;)if((s=a[u])===t||s.fn===t){a.splice(u,1);break}return r},e.prototype.$emit=function(e){var t=this,n=t._events[e];if(n){n=n.length>1?_(n):n;for(var r=_(arguments,1),o=0,i=n.length;o<i;o++)try{n[o].apply(t,r)}catch(n){j(n,t,'event handler for "'+e+'"')}}return t}}(xt),function(e){e.prototype._update=function(e,t){var n=this;n._isMounted&&je(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=br;br=n,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),br=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)},e.prototype.$forceUpdate=function(){var e=this;e._watcher&&e._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){je(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||h(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),je(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null)}}}(xt),function(e){e.prototype.$nextTick=function(e){return or(e,this)},e.prototype._render=function(){var e=this,t=e.$options,n=t.render,r=t.staticRenderFns,o=t._parentVnode;if(e._isMounted)for(var i in e.$slots){var a=e.$slots[i];a._rendered&&(e.$slots[i]=ee(a,!0))}e.$scopedSlots=o&&o.data.scopedSlots||Un,r&&!e._staticTrees&&(e._staticTrees=[]),e.$vnode=o;var s;try{s=n.call(e._renderProxy,e.$createElement)}catch(t){j(t,e,"render function"),s=e._vnode}return s instanceof vr||(s=_r()),s.parent=o,s},e.prototype._o=dt,e.prototype._n=p,e.prototype._s=f,e.prototype._l=st,e.prototype._t=ut,e.prototype._q=x,e.prototype._i=E,e.prototype._m=pt,e.prototype._f=ct,e.prototype._k=lt,e.prototype._b=ft,e.prototype._v=Q,e.prototype._e=_r,e.prototype._u=we,e.prototype._g=yt}(xt);var Dr=[String,RegExp,Array],Fr={name:"keep-alive",abstract:!0,props:{include:Dr,exclude:Dr},created:function(){this.cache=Object.create(null)},destroyed:function(){var e=this;for(var t in e.cache)Nt(e.cache[t])},watch:{include:function(e){Tt(this.cache,this._vnode,function(t){return It(e,t)})},exclude:function(e){Tt(this.cache,this._vnode,function(t){return!It(e,t)})}},render:function(){var e=he(this.$slots.default),t=e&&e.componentOptions;if(t){var n=At(t);if(n&&(this.include&&!It(this.include,n)||this.exclude&&It(this.exclude,n)))return e;var r=null==e.key?t.Ctor.cid+(t.tag?"::"+t.tag:""):e.key;this.cache[r]?e.componentInstance=this.cache[r].componentInstance:this.cache[r]=e,e.data.keepAlive=!0}return e}},Lr={KeepAlive:Fr};!function(e){var t={};t.get=function(){return Wn},Object.defineProperty(e,"config",t),e.util={warn:Bn,extend:g,mergeOptions:J,defineReactive:$},e.set=R,e.delete=D,e.nextTick=or,e.options=Object.create(null),Fn.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,g(e.options.components,Lr),Et(e),Ot(e),Ct(e),jt(e)}(xt),Object.defineProperty(xt.prototype,"$isServer",{get:tr}),Object.defineProperty(xt.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),xt.version="2.4.2";var Wr,Ur={},Vr=Object.freeze({namespaceMap:Ur,createElement:Pt,createElementNS:Mt,createTextNode:$t,createComment:Rt,insertBefore:Dt,removeChild:Ft,appendChild:Lt,parentNode:Wt,nextSibling:Ut,tagName:Vt,setTextContent:Bt,setAttribute:qt}),Br={create:function(e,t){zt(t)},update:function(e,t){e.data.ref!==t.data.ref&&(zt(e,!0),zt(t))},destroy:function(e){zt(e,!0)}},qr=(d("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"),d("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),d("text,number,password,search,email,tel,url")),zr=new vr("",{},[]),Jr=["create","activate","update","remove","destroy"],Hr={create:Xt,update:Xt,destroy:function(e){Xt(e,zr)}},Gr=Object.create(null),Xr=[Br,Hr],Kr={create:en,update:en},Zr={create:tn,update:tn},Qr={create:an,update:an},Yr=y(Tn),eo={create:sn,update:un},to=y(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"}}),no=(zn&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window),{create:fn,activate:fn,remove:pn}),ro=[Kr,Zr,Qr,eo,no],oo=ro.concat(Xr),io=function(e){function t(e){return new vr(T.tagName(e).toLowerCase(),{},[],void 0,e)}function i(e,t){function n(){0==--n.listeners&&s(e)}return n.listeners=t,n}function s(e){var t=T.parentNode(e);r(t)&&T.removeChild(t,e)}function u(e,t,n,i,a){if(e.isRootInsert=!a,!c(e,t,n,i)){var s=e.data,u=e.children,l=e.tag;if(r(l)){e.elm=e.ns?T.createElementNS(e.ns,l):T.createElement(l,e),m(e);var f=r(s)&&o(s.appendAsTree);f||(r(s)&&y(e,t),p(n,e.elm,i)),h(e,u,t),f&&(r(s)&&y(e,t),p(n,e.elm,i))}else o(e.isComment)?(e.elm=T.createComment(e.text),p(n,e.elm,i)):(e.elm=T.createTextNode(e.text),p(n,e.elm,i))}}function c(e,t,n,i){var a=e.data;if(r(a)){var s=r(e.componentInstance)&&a.keepAlive;if(r(a=a.hook)&&r(a=a.init)&&a(e,!1,n,i),r(e.componentInstance))return l(e,t),o(s)&&f(e,t,n,i),!0}}function l(e,t){r(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,v(e)?(y(e,t),m(e)):(zt(e),t.push(e))}function f(e,t,n,o){for(var i,a=e;a.componentInstance;)if(a=a.componentInstance._vnode,r(i=a.data)&&r(i=i.transition)){for(i=0;i<A.activate.length;++i)A.activate[i](zr,a);t.push(a);break}p(n,e.elm,o)}function p(e,t,n){r(e)&&(r(n)?n.parentNode===e&&T.insertBefore(e,t,n):T.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)u(t[r],n,e.elm,null,!0);else a(e.text)&&T.appendChild(e.elm,T.createTextNode(e.text))}function v(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return r(e.tag)}function y(e,t){for(var n=0;n<A.create.length;++n)A.create[n](zr,e);k=e.data.hook,r(k)&&(r(k.create)&&k.create(zr,e),r(k.insert)&&t.push(e))}function m(e){for(var t,n=e;n;)r(t=n.context)&&r(t=t.$options._scopeId)&&T.setAttribute(e.elm,t,""),n=n.parent;r(t=br)&&t!==e.context&&r(t=t.$options._scopeId)&&T.setAttribute(e.elm,t,"")}function _(e,t,n,r,o,i){for(;r<=o;++r)u(n[r],i,e,t)}function g(e){var t,n,o=e.data;if(r(o))for(r(t=o.hook)&&r(t=t.destroy)&&t(e),t=0;t<A.destroy.length;++t)A.destroy[t](e);if(r(t=e.children))for(n=0;n<e.children.length;++n)g(e.children[n])}function b(e,t,n,o){for(;n<=o;++n){var i=t[n];r(i)&&(r(i.tag)?(w(i),g(i)):s(i.elm))}}function w(e,t){if(r(t)||r(e.data)){var n,o=A.remove.length+1;for(r(t)?t.listeners+=o:t=i(e.elm,o),r(n=e.componentInstance)&&r(n=n._vnode)&&r(n.data)&&w(n,t),n=0;n<A.remove.length;++n)A.remove[n](e,t);r(n=e.data.hook)&&r(n=n.remove)?n(e,t):t()}else s(e.elm)}function x(e,t,o,i,a){for(var s,c,l,f,p=0,d=0,h=t.length-1,v=t[0],y=t[h],m=o.length-1,g=o[0],w=o[m],x=!a;p<=h&&d<=m;)n(v)?v=t[++p]:n(y)?y=t[--h]:Jt(v,g)?(O(v,g,i),v=t[++p],g=o[++d]):Jt(y,w)?(O(y,w,i),y=t[--h],w=o[--m]):Jt(v,w)?(O(v,w,i),x&&T.insertBefore(e,v.elm,T.nextSibling(y.elm)),v=t[++p],w=o[--m]):Jt(y,g)?(O(y,g,i),x&&T.insertBefore(e,y.elm,v.elm),y=t[--h],g=o[++d]):(n(s)&&(s=Gt(t,p,h)),c=r(g.key)?s[g.key]:E(g,t,p,h),n(c)?u(g,i,e,v.elm):(l=t[c],Jt(l,g)?(O(l,g,i),t[c]=void 0,x&&T.insertBefore(e,l.elm,v.elm)):u(g,i,e,v.elm)),g=o[++d]);p>h?(f=n(o[m+1])?null:o[m+1].elm,_(e,f,o,d,m,i)):d>m&&b(e,t,p,h)}function E(e,t,n,o){for(var i=n;i<o;i++){var a=t[i];if(r(a)&&Jt(e,a))return i}}function O(e,t,i,a){if(e!==t){var s=t.elm=e.elm;if(o(e.isAsyncPlaceholder))return void(r(t.asyncFactory.resolved)?S(e.elm,t,i):t.isAsyncPlaceholder=!0);if(o(t.isStatic)&&o(e.isStatic)&&t.key===e.key&&(o(t.isCloned)||o(t.isOnce)))return void(t.componentInstance=e.componentInstance);var u,c=t.data;r(c)&&r(u=c.hook)&&r(u=u.prepatch)&&u(e,t);var l=e.children,f=t.children;if(r(c)&&v(t)){for(u=0;u<A.update.length;++u)A.update[u](e,t);r(u=c.hook)&&r(u=u.update)&&u(e,t)}n(t.text)?r(l)&&r(f)?l!==f&&x(s,l,f,i,a):r(f)?(r(e.text)&&T.setTextContent(s,""),_(s,null,f,0,f.length-1,i)):r(l)?b(s,l,0,l.length-1):r(e.text)&&T.setTextContent(s,""):e.text!==t.text&&T.setTextContent(s,t.text),r(c)&&r(u=c.hook)&&r(u=u.postpatch)&&u(e,t)}}function C(e,t,n){if(o(n)&&r(e.parent))e.parent.data.pendingInsert=t;else for(var i=0;i<t.length;++i)t[i].data.hook.insert(t[i])}function S(e,t,n){if(o(t.isComment)&&r(t.asyncFactory))return t.elm=e,t.isAsyncPlaceholder=!0,!0;t.elm=e;var i=t.tag,a=t.data,s=t.children;if(r(a)&&(r(k=a.hook)&&r(k=k.init)&&k(t,!0),r(k=t.componentInstance)))return l(t,n),!0;if(r(i)){if(r(s))if(e.hasChildNodes()){for(var u=!0,c=e.firstChild,f=0;f<s.length;f++){if(!c||!S(c,s[f],n)){u=!1;break}c=c.nextSibling}if(!u||c)return!1}else h(t,s,n);if(r(a))for(var p in a)if(!N(p)){y(t,n);break}}else e.data!==t.text&&(e.data=t.text);return!0}var k,j,A={},I=e.modules,T=e.nodeOps;for(k=0;k<Jr.length;++k)for(A[Jr[k]]=[],j=0;j<I.length;++j)r(I[j][Jr[k]])&&A[Jr[k]].push(I[j][Jr[k]]);var N=d("attrs,style,class,staticClass,staticStyle,key");return function(e,i,a,s,c,l){if(n(i))return void(r(e)&&g(e));var f=!1,p=[];if(n(e))f=!0,u(i,p,c,l);else{var d=r(e.nodeType);if(!d&&Jt(e,i))O(e,i,p,s);else{if(d){if(1===e.nodeType&&e.hasAttribute(Dn)&&(e.removeAttribute(Dn),a=!0),o(a)&&S(e,i,p))return C(i,p,!0),e;e=t(e)}var h=e.elm,y=T.parentNode(h);if(u(i,p,h._leaveCb?null:y,T.nextSibling(h)),r(i.parent))for(var m=i.parent,_=v(i);m;){for(var w=0;w<A.destroy.length;++w)A.destroy[w](m);if(m.elm=i.elm,_){for(var x=0;x<A.create.length;++x)A.create[x](zr,m);var E=m.data.hook.insert;if(E.merged)for(var k=1;k<E.fns.length;k++)E.fns[k]()}m=m.parent}r(y)?b(y,[e],0,0):r(e.tag)&&g(e)}}return C(i,p,f),i.elm}}({nodeOps:Vr,modules:oo,LONG_LIST_THRESHOLD:10}),ao={},so=/^([+-]?[0-9]+(\.[0-9]+)?)(px|em|ex|%|in|cm|mm|pt|pc)$/i,uo={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:_n(this.$options._renderChildren||[])}})}},co={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]},lo={name:"transition",props:co,abstract:!0,render:function(e){var t=this,n=this.$options._renderChildren;if(n&&(n=n.filter(function(e){return e.tag||de(e)}),n.length)){var r=this.mode,o=n[0];if(xn(this.$vnode))return o;var i=gn(o);if(!i)return o;if(this._leaving)return wn(e,o);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:a(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var u=(i.data||(i.data={})).transition=bn(this),c=this._vnode,l=gn(c);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),l&&l.data&&!En(i,l)&&!de(l)){var f=l&&(l.data.transition=g({},u));if("out-in"===r)return this._leaving=!0,re(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),wn(e,o);if("in-out"===r){if(de(i))return c;var p,d=function(){p()};re(u,"afterEnter",d),re(u,"enterCancelled",d),re(f,"delayLeave",function(e){p=e})}}return o}}},fo=g({tag:String,moveClass:String},co);delete fo.mode;var po={props:fo,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(t){return new Promise(function(n,r){e.getComponentRect(t.ref,function(e){e.result?n(e.size):r(new Error("failed to get rect for element: "+t.tag))})})};var t=this.$requireWeexModule("animation");this.animate=function(e,n){return new Promise(function(r){t.transition(e.ref,n,r)})}},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=bn(this),s=0;s<o.length;s++){var u=o[s];u.tag&&null!=u.key&&0!==String(u.key).indexOf("__vlist")&&(i.push(u),n[u.key]=u,(u.data||(u.data={})).transition=a)}if(r){var c=[],l=[];r.forEach(function(e){e.data.transition=a,n[e.key]?c.push(e):l.push(e)}),this.kept=e(t,null,c),this.removed=l}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]}}},ho={Richtext:uo,Transition:lo,TransitionGroup:po},vo=d("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),yo=(d("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),d("richtext,trisition,trisition-group",!0));d("embed,img,image,input,link,meta",!0);xt.config.mustUseProp=On,xt.config.isReservedTag=vo,xt.config.isRuntimeComponent=yo,xt.config.isUnknownElement=Cn,xt.options.directives=ao,xt.options.components=ho,xt.prototype.__patch__=io,xt.prototype.$mount=function(e,t){return Ee(this,e&&Sn(e,this.$document),t)},e.Vue=xt}}),Xn=a(function(e,t){function n(e){this.instanceId="",this.nodeId=E++,this.parentNode=null,this.nodeType=3,this.text=e}function r(e){j.Document=e.Document,j.Element=e.Element,j.Comment=e.Comment,j.compileBundle=e.compileBundle}function o(){i(C),i(S),i(k),delete j.Document,delete j.Element,delete j.Comment,delete j.compileBundle}function i(e){for(var t in e)delete e[t]}function a(e,t,n,r,o){void 0===t&&(t=""),void 0===n&&(n={}),void 0===o&&(o={});var i=new j.Document(e,n.bundleUrl),a=C[e]={instanceId:e,config:n,data:r,document:i},s=g(e),u=b(e,s),c={config:n,document:i,supports:m,requireModule:s};Object.freeze(c);var l=a.Vue=_(e,s),f=Object.assign({Vue:l,weex:c},u,o.services);return t="(function(global){ \n"+t+"\n })(Object.create(this))",x(f,t)||w(f,t),a.document.taskCenter.send("dom",{action:"createFinish"},[]),a}function s(e){var t=C[e];if(t&&t.app instanceof t.Vue)try{t.app.$destroy()}catch(e){}finally{t.document.destroy()}delete C[e]}function u(e,t){var n=C[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");for(var r in t)n.Vue.set(n.app,r,t[r]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])}function c(e){var t=C[e];return t&&t.app instanceof t.Vue?t.app.$el.toJSON():new Error("getRoot: instance "+e+" not found!")}function l(e,t,n,r,o,i){var a=e.document.getRef(t);return a?e.document.fireEvent(a,n,r,o,i):new Error('invalid element reference "'+t+'"')}function f(e,t,n,r){return e.document.taskCenter.callback(t,n,r)}function p(e,t){if(C[e]&&Array.isArray(t)){var n=[];return t.forEach(function(t){var r=A[t.method],o=[].concat(t.args);"function"==typeof r&&(o.unshift(e),n.push(r.apply(void 0,o)))}),n}return new Error('invalid instance id "'+e+'" or tasks')}function d(e){for(var t in e)!function(t){S[t]||(S[t]={}),e[t].forEach(function(e){"string"==typeof e?S[t][e]=!0:S[t][e.name]=e.args})}(t)}function h(e,t){return"string"==typeof t?!(!S[e]||!S[e][t]):!!S[e]}function v(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?k[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(k[e.type]=e))})}function y(e){return!!k[e]}function m(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 h(r,o);case"component":return y(r)}}return null}function _(e,t){var n={};O(n,j);var r=n.Vue,o=C[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)&&k[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,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}}}),r.prototype.$getConfig=function(){if(o.app instanceof r)return o.config},r}function g(e){var t=C[e];return function(e){var n=S[e]||[],r={};for(var o in n)!function(n){Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:function(){return function(){for(var r=arguments,o=[],i=arguments.length;i--;)o[i]=r[i];return t.document.taskCenter.send("module",{module:e,method:n},o)}},set:function(r){if("function"==typeof r)return t.document.taskCenter.send("module",{module:e,method:n},[r])}})}(o);return r}}function b(e,t){var n=C[e],r=t("timer");return{setTimeout:function(){for(var e=arguments,t=[],o=arguments.length;o--;)t[o]=e[o];var i=function(){t[0].apply(t,t.slice(2))};return r.setTimeout(i,t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],o=arguments.length;o--;)t[o]=e[o];var i=function(){t[0].apply(t,t.slice(2))};return r.setInterval(i,t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){r.clearTimeout(e)},clearInterval:function(e){r.clearInterval(e)},deprecated_setTimeout:function(t,n){if("function"==typeof Hn.setIntervalWeex)var r=Hn.setIntervalWeex(e,function(){t.apply(null),"function"==typeof Hn.clearIntervalWeex&&Hn.clearIntervalWeex(e,r)},n)},deprecated_clearTimeout:function(t){if("function"==typeof Hn.clearIntervalWeex)return Hn.clearIntervalWeex(e,t)},deprecated_setInterval:function(t,n){if("function"==typeof Hn.setIntervalWeex)return Hn.setIntervalWeex(e,t,n);console.warn('[JS Framework] can\'t find "global.setIntervalWeex", please use "setInerval" instead!!')},deprecated_clearInterval:function(t){if("function"==typeof Hn.clearIntervalWeex)return Hn.clearIntervalWeex(e,t)}}}function w(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);return n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}function x(e,t){if("function"!=typeof j.compileBundle)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 u=0;u<i.length-1;++u)o+=i[u],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var c=e.weex||{},l=c.config||{};n=j.compileBundle(o,l.bundleUrl,l.bundleDigest,l.codeCachePath),n&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}Object.defineProperty(t,"__esModule",{value:!0});var E=1,O=Gn,C={},S={},k={},j={TextNode:n,instances:C,modules:S,components:k},A={fireEvent:function(e){for(var t=arguments,n=[],r=arguments.length-1;r-- >0;)n[r]=t[r+1];return l.apply(void 0,[C[e]].concat(n))},callback:function(e){for(var t=arguments,n=[],r=arguments.length-1;r-- >0;)n[r]=t[r+1];return f.apply(void 0,[C[e]].concat(n))}};t.init=r,t.reset=o,t.createInstance=a,t.destroyInstance=s,t.refreshInstance=u,t.getRoot=c,t.receiveTasks=p,t.registerModules=d,t.isRegisteredModule=h,t.registerComponents=v,t.isRegisteredComponent=y,t.supports=m}),Kn=i(Xn),Zn=Xn.supports,Qn=Xn.isRegisteredComponent,Yn=Xn.registerComponents,er=Xn.isRegisteredModule,tr=Xn.registerModules,nr=Xn.receiveTasks,rr=Xn.getRoot,or=Xn.refreshInstance,ir=Xn.destroyInstance,ar=Xn.createInstance,sr=Xn.reset,ur=Xn.init,cr=Object.freeze({default:Kn,__moduleExports:Xn,supports:Zn,isRegisteredComponent:Qn,registerComponents:Yn,isRegisteredModule:er,registerModules:tr,receiveTasks:nr,getRoot:rr,refreshInstance:or,destroyInstance:ir,createInstance:ar,reset:sr,init:ur}),lr=Object.freeze({$:s,$el:u,$vm:c,$renderThen:l,$scrollTo:f,$transition:p,$getConfig:d,$sendHttp:h,$openURL:v,$setTitle:y,$call:m}),fr=Object.prototype.hasOwnProperty,pr=Object.prototype.toString,dr="[object Object]",hr="__proto__"in{};"undefined"!=typeof Set&&Set.toString().match(/native code/)?Bn=Set:(Bn=function(){this.set=Object.create(null)},Bn.prototype.has=function(e){return void 0!==this.set[e]},Bn.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},Bn.prototype.clear=function(){this.set=Object.create(null)});var vr=/^@weex-component\//,yr=/^@weex-module\//,mr=/^\.{1,2}\//,_r=/\.js$/,gr=function(e){return!!e.match(vr)},br=function(e){return!!e.match(yr)},wr=function(e){return!!e.match(mr)},xr=function(e){return!gr(e)&&!br(e)&&!wr(e)},Er=0;I.target=null;var Or=[];I.prototype.addSub=function(e){this.subs.push(e)},I.prototype.removeSub=function(e){b(this.subs,e)},I.prototype.depend=function(){I.target&&I.target.addDep(this)},I.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var Cr=0;M.prototype.get=function(){T(this);var e=this.getter.call(this.vm,this.vm);return this.deep&&$(e),N(),this.cleanupDeps(),e},M.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))},M.prototype.cleanupDeps=function(){for(var e=this,t=this.deps.length;t--;){var n=e.deps[t];e.newDepIds.has(n.id)||n.removeSub(e)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},M.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},M.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(E(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},M.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},M.prototype.depend=function(){for(var e=this,t=this.deps.length;t--;)e.deps[t].depend()},M.prototype.teardown=function(){var e=this;if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||b(this.vm._watchers,this);for(var t=this.deps.length;t--;)e.deps[t].removeSub(e);this.active=!1,this.vm=this.cb=this.value=null}};var Sr=S(),kr=Array.prototype,jr=Object.create(kr);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=kr[e];g(jr,e,function(){for(var n=arguments,r=arguments.length,o=new Array(r);r--;)o[r]=n[r];var i,a=t.apply(this,o),s=this.__ob__;switch(e){case"push":case"unshift":i=o;break;case"splice":i=o.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})}),g(kr,"$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]}),g(kr,"$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)),e>-1&&this.splice(e,1))});var Ar=Object.getOwnPropertyNames(jr);R.prototype.walk=function(e){var t=this;for(var n in e)t.convert(n,e[n])},R.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)L(e[t])},R.prototype.convert=function(e,t){W(this.value,e,t)},R.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},R.prototype.removeVm=function(e){b(this.vms,e)};var Ir=["$index","$value","$event"],Tr={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},Nr=Tr.nativeComponentMap,Pr={attr:"setAttr",style:"setStyle",event:"addEvent"},Mr=1,$r=["init","created","ready","destroyed"];!function(e){e.$emit=Je,e.$dispatch=He,e.$broadcast=Ge,e.$on=Xe,e.$off=Ke}(Qe.prototype),Qe.prototype.$watch=function(e,t){de(this,e,t)},Qe.set=U,Qe.delete=V;var Rr={},Dr=a(function(e,t){function n(e,t){if(e instanceof i)return e;if("string"!=typeof e)return null;if(e.length>X)return null;if(!(t?Z[he]:Z[fe]).test(e))return null;try{return new i(e,t)}catch(e){return null}}function r(e,t){var r=n(e,t);return r?r.version:null}function o(e,t){var r=n(e.trim().replace(/^[=v]+/,""),t);return r?r.version:null}function i(e,t){if(e instanceof i){if(e.loose===t)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>X)throw new TypeError("version is longer than "+X+" characters");if(!(this instanceof i))return new i(e,t);G("SemVer",e,t),this.loose=t;var n=e.trim().match(t?Z[he]:Z[fe]);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>K||this.major<0)throw new TypeError("Invalid major version");if(this.minor>K||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>K||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(t>=0&&t<K)return t}return e}):this.prerelease=[],this.build=n[5]?n[5].split("."):[],this.format()}function a(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new i(e,n).inc(t,r).version}catch(e){return null}}function s(e,t){if(b(e,t))return null;var r=n(e),o=n(t);if(r.prerelease.length||o.prerelease.length){for(var i in r)if(("major"===i||"minor"===i||"patch"===i)&&r[i]!==o[i])return"pre"+i;return"prerelease"}for(var i in r)if(("major"===i||"minor"===i||"patch"===i)&&r[i]!==o[i])return i}function u(e,t){var n=De.test(e),r=De.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:e>t?1:0}function c(e,t){return u(t,e)}function l(e,t){return new i(e,t).major}function f(e,t){return new i(e,t).minor}function p(e,t){return new i(e,t).patch}function d(e,t,n){return new i(e,n).compare(new i(t,n))}function h(e,t){return d(e,t,!0)}function v(e,t,n){return d(t,e,n)}function y(e,n){return e.sort(function(e,r){return t.compare(e,r,n)})}function m(e,n){return e.sort(function(e,r){return t.rcompare(e,r,n)})}function _(e,t,n){return d(e,t,n)>0}function g(e,t,n){return d(e,t,n)<0}function b(e,t,n){return 0===d(e,t,n)}function w(e,t,n){return 0!==d(e,t,n)}function x(e,t,n){return d(e,t,n)>=0}function E(e,t,n){return d(e,t,n)<=0}function O(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=b(e,n,r);break;case"!=":o=w(e,n,r);break;case">":o=_(e,n,r);break;case">=":o=x(e,n,r);break;case"<":o=g(e,n,r);break;case"<=":o=E(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}function C(e,t){if(e instanceof C){if(e.loose===t)return e;e=e.value}if(!(this instanceof C))return new C(e,t);G("comparator",e,t),this.loose=t,this.parse(e),this.semver===Fe?this.value="":this.value=this.operator+this.semver.version,G("comp",this)}function S(e,t){if(e instanceof S)return e.loose===t?e:new S(e.raw,t);if(e instanceof C)return new S(e.value,t);if(!(this instanceof S))return new S(e,t);if(this.loose=t,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 k(e,t){return new S(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function j(e,t){return G("comp",e),e=N(e,t),G("caret",e),e=I(e,t),G("tildes",e),e=M(e,t),G("xrange",e),e=R(e,t),G("stars",e),e}function A(e){return!e||"x"===e.toLowerCase()||"*"===e}function I(e,t){return e.trim().split(/\s+/).map(function(e){return T(e,t)}).join(" ")}function T(e,t){var n=t?Z[Ce]:Z[Oe];return e.replace(n,function(t,n,r,o,i){G("tilde",e,t,n,r,o,i);var a;return A(n)?a="":A(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":A(o)?a=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":i?(G("replaceTilde pr",i),"-"!==i.charAt(0)&&(i="-"+i),a=">="+n+"."+r+"."+o+i+" <"+n+"."+(+r+1)+".0"):a=">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0",G("tilde return",a),a})}function N(e,t){return e.trim().split(/\s+/).map(function(e){return P(e,t)}).join(" ")}function P(e,t){G("caret",e,t);var n=t?Z[Ae]:Z[je];return e.replace(n,function(t,n,r,o,i){G("caret",e,t,n,r,o,i);var a;return A(n)?a="":A(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":A(o)?a="0"===n?">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":">="+n+"."+r+".0 <"+(+n+1)+".0.0":i?(G("replaceCaret pr",i),"-"!==i.charAt(0)&&(i="-"+i),a="0"===n?"0"===r?">="+n+"."+r+"."+o+i+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+i+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+i+" <"+(+n+1)+".0.0"):(G("no pr"),a="0"===n?"0"===r?">="+n+"."+r+"."+o+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+" <"+(+n+1)+".0.0"),G("caret return",a),a})}function M(e,t){return G("replaceXRanges",e,t),e.split(/\s+/).map(function(e){return $(e,t)}).join(" ")}function $(e,t){e=e.trim();var n=t?Z[we]:Z[be];return e.replace(n,function(t,n,r,o,i,a){G("xRange",e,t,n,r,o,i,a);var s=A(r),u=s||A(o),c=u||A(i),l=c;return"="===n&&l&&(n=""),s?t=">"===n||"<"===n?"<0.0.0":"*":n&&l?(u&&(o=0),c&&(i=0),">"===n?(n=">=",u?(r=+r+1,o=0,i=0):c&&(o=+o+1,i=0)):"<="===n&&(n="<",u?r=+r+1:o=+o+1),t=n+r+"."+o+"."+i):u?t=">="+r+".0.0 <"+(+r+1)+".0.0":c&&(t=">="+r+"."+o+".0 <"+r+"."+(+o+1)+".0"),G("xRange return",t),t})}function R(e,t){return G("replaceStars",e,t),e.trim().replace(Z[$e],"")}function D(e,t,n,r,o,i,a,s,u,c,l,f,p){return t=A(n)?"":A(r)?">="+n+".0.0":A(o)?">="+n+"."+r+".0":">="+t,s=A(u)?"":A(c)?"<"+(+u+1)+".0.0":A(l)?"<"+u+"."+(+c+1)+".0":f?"<="+u+"."+c+"."+l+"-"+f:"<="+s,(t+" "+s).trim()}function F(e,t){for(var n=0;n<e.length;n++)if(!e[n].test(t))return!1;if(t.prerelease.length){for(var n=0;n<e.length;n++)if(G(e[n].semver),e[n].semver!==Fe&&e[n].semver.prerelease.length>0){var r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}function L(e,t,n){try{t=new S(t,n)}catch(e){return!1}return t.test(e)}function W(e,t,n){var r=null,o=null;try{var a=new S(t,n)}catch(e){return null}return e.forEach(function(e){a.test(e)&&(r&&-1!==o.compare(e)||(r=e,o=new i(r,n)))}),r}function U(e,t,n){var r=null,o=null;try{var a=new S(t,n)}catch(e){return null}return e.forEach(function(e){a.test(e)&&(r&&1!==o.compare(e)||(r=e,o=new i(r,n)))}),r}function V(e,t){try{return new S(e,t).range||"*"}catch(e){return null}}function B(e,t,n){return z(e,t,"<",n)}function q(e,t,n){return z(e,t,">",n)}function z(e,t,n,r){e=new i(e,r),t=new S(t,r);var o,a,s,u,c;switch(n){case">":o=_,a=E,s=g,u=">",c=">=";break;case"<":o=g,a=x,s=_,u="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(L(e,t,r))return!1;for(var l=0;l<t.set.length;++l){var f=t.set[l],p=null,d=null;if(f.forEach(function(e){e.semver===Fe&&(e=new C(">=0.0.0")),p=p||e,d=d||e,o(e.semver,p.semver,r)?p=e:s(e.semver,d.semver,r)&&(d=e)}),p.operator===u||p.operator===c)return!1;if((!d.operator||d.operator===u)&&a(e,d.semver))return!1;if(d.operator===c&&s(e,d.semver))return!1}return!0}function J(e,t){var r=n(e,t);return r&&r.prerelease.length?r.prerelease:null}function H(e,t,n){return e=new S(e,n),t=new S(t,n),e.intersects(t)}t=e.exports=i;var G;"object"==typeof process&&process.env,G=function(){},t.SEMVER_SPEC_VERSION="2.0.0";var X=256,K=Number.MAX_SAFE_INTEGER||9007199254740991,Z=t.re=[],Q=t.src=[],Y=0,ee=Y++;Q[ee]="0|[1-9]\\d*";var te=Y++;Q[te]="[0-9]+";var ne=Y++;Q[ne]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var re=Y++;Q[re]="("+Q[ee]+")\\.("+Q[ee]+")\\.("+Q[ee]+")";var oe=Y++;Q[oe]="("+Q[te]+")\\.("+Q[te]+")\\.("+Q[te]+")";var ie=Y++;Q[ie]="(?:"+Q[ee]+"|"+Q[ne]+")";var ae=Y++;Q[ae]="(?:"+Q[te]+"|"+Q[ne]+")";var se=Y++;Q[se]="(?:-("+Q[ie]+"(?:\\."+Q[ie]+")*))";var ue=Y++;Q[ue]="(?:-?("+Q[ae]+"(?:\\."+Q[ae]+")*))";var ce=Y++;Q[ce]="[0-9A-Za-z-]+";var le=Y++;Q[le]="(?:\\+("+Q[ce]+"(?:\\."+Q[ce]+")*))";var fe=Y++,pe="v?"+Q[re]+Q[se]+"?"+Q[le]+"?";Q[fe]="^"+pe+"$";var de="[v=\\s]*"+Q[oe]+Q[ue]+"?"+Q[le]+"?",he=Y++;Q[he]="^"+de+"$";var ve=Y++;Q[ve]="((?:<|>)?=?)";var ye=Y++;Q[ye]=Q[te]+"|x|X|\\*";var me=Y++;Q[me]=Q[ee]+"|x|X|\\*";var _e=Y++;Q[_e]="[v=\\s]*("+Q[me]+")(?:\\.("+Q[me]+")(?:\\.("+Q[me]+")(?:"+Q[se]+")?"+Q[le]+"?)?)?";var ge=Y++;Q[ge]="[v=\\s]*("+Q[ye]+")(?:\\.("+Q[ye]+")(?:\\.("+Q[ye]+")(?:"+Q[ue]+")?"+Q[le]+"?)?)?";var be=Y++;Q[be]="^"+Q[ve]+"\\s*"+Q[_e]+"$";var we=Y++;Q[we]="^"+Q[ve]+"\\s*"+Q[ge]+"$";var xe=Y++;Q[xe]="(?:~>?)";var Ee=Y++;Q[Ee]="(\\s*)"+Q[xe]+"\\s+",Z[Ee]=new RegExp(Q[Ee],"g");var Oe=Y++;Q[Oe]="^"+Q[xe]+Q[_e]+"$";var Ce=Y++;Q[Ce]="^"+Q[xe]+Q[ge]+"$";var Se=Y++;Q[Se]="(?:\\^)";var ke=Y++;Q[ke]="(\\s*)"+Q[Se]+"\\s+",Z[ke]=new RegExp(Q[ke],"g");var je=Y++;Q[je]="^"+Q[Se]+Q[_e]+"$";var Ae=Y++;Q[Ae]="^"+Q[Se]+Q[ge]+"$";var Ie=Y++;Q[Ie]="^"+Q[ve]+"\\s*("+de+")$|^$";var Te=Y++;Q[Te]="^"+Q[ve]+"\\s*("+pe+")$|^$";var Ne=Y++;Q[Ne]="(\\s*)"+Q[ve]+"\\s*("+de+"|"+Q[_e]+")",Z[Ne]=new RegExp(Q[Ne],"g");var Pe=Y++;Q[Pe]="^\\s*("+Q[_e]+")\\s+-\\s+("+Q[_e]+")\\s*$";var Me=Y++;Q[Me]="^\\s*("+Q[ge]+")\\s+-\\s+("+Q[ge]+")\\s*$";var $e=Y++;Q[$e]="(<|>)?=?\\s*\\*";for(var Re=0;Re<Y;Re++)G(Re,Q[Re]),Z[Re]||(Z[Re]=new RegExp(Q[Re]));t.parse=n,t.valid=r,t.clean=o,t.SemVer=i,i.prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},i.prototype.toString=function(){return this.version},i.prototype.compare=function(e){return G("SemVer.compare",this.version,this.loose,e),e instanceof i||(e=new i(e,this.loose)),this.compareMain(e)||this.comparePre(e)},i.prototype.compareMain=function(e){return e instanceof i||(e=new i(e,this.loose)),u(this.major,e.major)||u(this.minor,e.minor)||u(this.patch,e.patch)},i.prototype.comparePre=function(e){var t=this;if(e instanceof i||(e=new i(e,this.loose)),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 n=0;do{var r=t.prerelease[n],o=e.prerelease[n];if(G("prerelease compare",n,r,o),void 0===r&&void 0===o)return 0;if(void 0===o)return 1;if(void 0===r)return-1;if(r!==o)return u(r,o)}while(++n)},i.prototype.inc=function(e,t){var n=this;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 r=this.prerelease.length;--r>=0;)"number"==typeof n.prerelease[r]&&(n.prerelease[r]++,r=-2);-1===r&&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},t.inc=a,t.diff=s,t.compareIdentifiers=u;var De=/^[0-9]+$/;t.rcompareIdentifiers=c,t.major=l,t.minor=f,t.patch=p,t.compare=d,t.compareLoose=h,t.rcompare=v,t.sort=y,t.rsort=m,t.gt=_,t.lt=g,t.eq=b,t.neq=w,t.gte=x,t.lte=E,t.cmp=O,t.Comparator=C;var Fe={};C.prototype.parse=function(e){var t=this.loose?Z[Ie]:Z[Te],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 i(n[2],this.loose):this.semver=Fe},C.prototype.toString=function(){return this.value},C.prototype.test=function(e){return G("Comparator.test",e,this.loose),this.semver===Fe||("string"==typeof e&&(e=new i(e,this.loose)),O(e,this.operator,this.semver,this.loose))},C.prototype.intersects=function(e,t){if(!(e instanceof C))throw new TypeError("a Comparator is required");var n;if(""===this.operator)return n=new S(e.value,t),L(this.value,n,t);if(""===e.operator)return n=new S(this.value,t),L(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=O(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),u=O(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||u},t.Range=S,S.prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},S.prototype.toString=function(){return this.range},S.prototype.parseRange=function(e){var t=this.loose;e=e.trim(),G("range",e,t);var n=t?Z[Me]:Z[Pe];e=e.replace(n,D),G("hyphen replace",e),e=e.replace(Z[Ne],"$1$2$3"),G("comparator trim",e,Z[Ne]),e=e.replace(Z[Ee],"$1~"),e=e.replace(Z[ke],"$1^"),e=e.split(/\s+/).join(" ");var r=t?Z[Ie]:Z[Te],o=e.split(" ").map(function(e){return j(e,t)}).join(" ").split(/\s+/);return this.loose&&(o=o.filter(function(e){return!!e.match(r)})),o=o.map(function(e){return new C(e,t)})},S.prototype.intersects=function(e,t){if(!(e instanceof S))throw new TypeError("a Range is required");return this.set.some(function(n){return n.every(function(n){return e.set.some(function(e){return e.every(function(e){return n.intersects(e,t)})})})})},t.toComparators=k,S.prototype.test=function(e){var t=this;if(!e)return!1;"string"==typeof e&&(e=new i(e,this.loose));for(var n=0;n<this.set.length;n++)if(F(t.set[n],e))return!0;return!1},t.satisfies=L,t.maxSatisfying=W,t.minSatisfying=U,t.validRange=V,t.ltr=B,t.gtr=q,t.outside=z,t.prerelease=J,t.intersects=H}),Fr=function(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];console.debug("[JS Framework] define a component "+t);var o,i;if(i=n.length>1?n[1]:n[0],"function"==typeof i&&(o=i,i=null),o){var a=function(t){if(gr(t)){var n=j(t);return nt(e,n)}if(br(t)){var r=j(t);return e.requireModule(r)}if(wr(t)||xr(t)){var o=A(t);return e.commonModules[o]}},s={exports:{}};o(a,s.exports,s),i=s.exports}if(gr(t)){var u=j(t);rt(e,u,i)}else if(br(t)){var c,l=j(t);Ye((c={},c[l]=i,c))}else if(wr(t)){var f=A(t);e.commonModules[f]=i}else if(xr(t)){var p=A(t);i.template||i.style||i.methods?rt(e,p,i):e.commonModules[p]=i}},Lr=function(e){this.id=e,this.map=[],this.hooks=[]};Lr.prototype.isEmpty=function(){return 0===this.map.length},Lr.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},Lr.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){wt(e,"repeat"),wt(e,"shown"),xt(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},Lr.prototype.then=function(e){this.hooks.push(e)},Et.prototype.requireModule=function(e){return tt(this,e)},Et.prototype.updateActions=function(){return yt(this)},Et.prototype.callTasks=function(e){return mt(this,e)},Object.freeze(Et),Object.freeze(Et.prototype);var Wr={},Ur=Tr.nativeComponentMap;global.registerMethods=It;var Vr={fireEvent:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return ht.apply(void 0,[Wr[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return vt.apply(void 0,[Wr[e]].concat(t))}};It(lr),Object.freeze(Qe);var Br=Object.freeze({registerComponents:jt,registerModules:At,registerMethods:It,createInstance:Ot,init:Ct,refreshInstance:St,destroyInstance:kt,receiveTasks:Tt,getRoot:Nt}),qr=a(function(e){e.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t,n){var r=e.exports.createUniqueKey="undefined"!=typeof Symbol?Symbol:function(e){return"[["+e+"_"+Math.random().toFixed(8).slice(2)+"]]"},o=e.exports.isObject=function(e){return"object"==typeof e&&null!==e};e.exports.LISTENERS=r("listeners"),e.exports.CAPTURE=1,e.exports.BUBBLE=2,e.exports.ATTRIBUTE=3,e.exports.newNode=function(e,t,n){var r=o(n);return{listener:e,kind:t,once:r&&Boolean(n.once),passive:r&&Boolean(n.passive),next:null}}},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function e(){r(this,e),this._listeners={}}return o(e,[{key:"_addListener",value:function(e,t,n){return this._listeners[e]=this._listeners[e]||[],this._listeners[e].push({listener:t,once:n}),this}},{key:"on",value:function(e,t){return this._addListener(e,t,!1)}},{key:"once",value:function(e,t){return this._addListener(e,t,!0)}},{key:"off",value:function(e,t){return this._listeners[e]&&this._listeners[e].length?t?(this._listeners[e]=this._listeners[e].filter(function(e){return!(e.listener===t)}),this):(delete this._listeners[e],this):this}},{key:"emit",value:function(e,t){var n=this;return this._listeners[e]?(this._listeners[e].forEach(function(r){r.listener.apply(n,[t]),r.once&&n.removeListener(e,r.listener)}),this):this}}]),e}();t.default=i,e.exports=t.default},function(e,t,n){var r=n(0),o=n(15),i=n(16),a=r.isObject,s=r.LISTENERS,u=r.CAPTURE,c=r.BUBBLE,l=r.ATTRIBUTE,f=r.newNode,p=o.defineCustomEventTarget,d=i.createEventWrapper,h=i.STOP_IMMEDIATE_PROPAGATION_FLAG,v=i.PASSIVE_LISTENER_FLAG,y="undefined"!=typeof window&&void 0!==window.EventTarget,m=e.exports=function e(){var t=arguments;if(!(this instanceof e)){if(1===arguments.length&&Array.isArray(arguments[0]))return p(e,arguments[0]);if(arguments.length>0){for(var n=Array(arguments.length),r=0;r<arguments.length;++r)n[r]=t[r];return p(e,n)}throw new TypeError("Cannot call a class as a function")}Object.defineProperty(this,s,{value:Object.create(null)})};m.prototype=Object.create((y?window.EventTarget:Object).prototype,{constructor:{value:m,writable:!0,configurable:!0},addEventListener:{value:function(e,t,n){if(null==t)return!1;if("function"!=typeof t&&"object"!=typeof t)throw new TypeError('"listener" is not an object.');var r=a(n)?Boolean(n.capture):Boolean(n),o=r?u:c,i=this[s][e];if(null==i)return this[s][e]=f(t,o,n),!0;for(var l=null;null!=i;){if(i.listener===t&&i.kind===o)return!1;l=i,i=i.next}return l.next=f(t,o,n),!0},configurable:!0,writable:!0},removeEventListener:{value:function(e,t,n){var r=this;if(null==t)return!1;for(var o=a(n)?Boolean(n.capture):Boolean(n),i=o?u:c,l=null,f=this[s][e];null!=f;){if(f.listener===t&&f.kind===i)return null==l?r[s][e]=f.next:l.next=f.next,!0;l=f,f=f.next}return!1},configurable:!0,writable:!0},dispatchEvent:{value:function(e){var t=this,n=e.type,r=this[s][n];if(null==r)return!0;for(var o=d(e,this),i=null;null!=r&&(r.once?null==i?t[s][n]=r.next:i.next=r.next:i=r,o[v]=r.passive,"function"==typeof r.listener?r.listener.call(t,o):r.kind!==l&&"function"==typeof r.listener.handleEvent&&r.listener.handleEvent(o),!o[h]);)r=r.next;return!o.defaultPrevented},configurable:!0,writable:!0}})},function(e,t,n){function r(e,t){var n;for(var r in M)M.hasOwnProperty(r)&&(n=M[r],"*"!==t&&t!==n.origin||(e.target=n.window,n.window.dispatchEvent(e)))}function o(e){e.taskCenter.send("dom",{action:"updateFinish"},[])}function i(e){var t=M[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}function a(e){j=e.Document,A=e.Element,I=e.Comment}function s(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?S[e]=!0:"object"===(void 0===e?"undefined":x(e))&&"string"==typeof e.type&&(S[e.type]=e))})}function u(e){var t=e.split(".");if(1===t.length)return Boolean(k[e]);var n=t[0],r=t[1],o=k[n];if(o)for(var i=0;i<o.length;i++){var a=o[i];if("object"===(void 0===a?"undefined":x(a))&&a.name===r||a===r)return!0}return!1}function c(e){return Boolean(S[e])}function l(e){}function f(e){if("object"===(void 0===e?"undefined":x(e)))for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(k[t]=e[t])}function p(e,t,n){for(var r in t)e[r]={factory:t[r].bind(n),module:{exports:{}},isInitialized:!1};return e}function d(e,t){if("object"===(void 0===k?"undefined":x(k))){for(var n in k)!function(n){var r=T+n;e[r]={module:{exports:{}},isInitialized:!0},k[n].forEach(function(o){"string"==typeof o&&(o={name:o});var i=o.name;e[r].module.exports[i]=function(){for(var e=arguments,r=arguments.length,o=Array(r),a=0;a<r;a++)o[a]=e[a];var s={},u=o[o.length-1];return u&&"object"===(void 0===u?"undefined":x(u))&&u.__weex_options__&&(s=u.__weex_options__,o.pop()),t.taskCenter.send("module",{module:n,method:i},o,s)}})}(n)}return e}function h(e,t,o,i,a){var s=M[e];if(void 0!=s)throw new Error('Instance id "'+e+'" existed when create instance');var l=Date.now(),f="object"===("undefined"==typeof WXEnvironment?"undefined":x(WXEnvironment))&&WXEnvironment||{},h=n(6)(),v="function"==typeof v?v:h.Promise,y="function"==typeof y?y:h.Symbol,m="function"==typeof m?m:h.Set,_="function"==typeof _?_:h.Map,g="function"==typeof g?g:h.WeakMap,b="function"==typeof b?b:h.WeakSet,O=h.URL,S=h.URLSearchParams,k=h.FontFace,A=h.matchMedia,I=o.bundleUrl||"about:blank";o.bundleUrl?I.split("//")[0]||(I="https:"+I):console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".');var T=new j(e,I),D=new O(I),F={};s=M[e]={document:T,instanceId:e,bundleUrl:I,bundleCode:t,modules:F,origin:D.origin,uid:0},d(F,T);var L=n(7)(F),W=n(8)(F),U=n(9)(W);n(11)(W,T);var V=n(12)(W,D),B=n(13)(W,v),q=B.fetch,z=B.Headers,J=B.Request,H=B.Response,G=n(14)(W),X=n(17)(W),K=n(18)(W,T),Z=K.setTimeout,Q=K.clearTimeout,Y=K.setInterval,ee=K.clearInterval,te=K.requestAnimationFrame,ne=K.cancelAnimationFrame,re=n(19)(),oe=re.atob,ie=re.btoa,ae=n(20)(l),se=n(21)(),ue=se.Event,ce=se.CustomEvent,le=new C.default,fe={Promise:v,Symbol:y,Map:_,Set:m,WeakMap:g,WeakSet:b,name:"",closed:!1,atob:oe,btoa:ie,performance:ae,document:T,location:V,navigator:{product:"Weex",platform:f.platform,appName:f.appName,appVersion:f.appVersion,userAgent:"Weex/"+f.weexVersion+" "+f.platform+"/"+f.osVersion+" ("+f.deviceModel+") "+f.appName+"/"+f.appVersion},screen:{width:f.deviceWidth,height:f.deviceHeight,availWidth:f.deviceWidth,availHeight:f.deviceHeight,colorDepth:24,pixelDepth:24},devicePixelRatio:f.scale,fetch:q,Headers:z,Response:H,Request:J,XMLHttpRequest:G,URL:O,URLSearchParams:S,FontFace:k,WebSocket:X,Event:ue,CustomEvent:ce,matchMedia:A,setTimeout:Z,clearTimeout:Q,setInterval:Y,clearInterval:ee,requestAnimationFrame:te,cancelAnimationFrame:ne,alert:function(e){W(N).alert({message:e},function(){})},open:function(e){W(P).push({url:e,animated:!0},R)},close:function(){W(P).close({animated:!0},R,R)},postMessage:function(e,t){r({origin:V.origin,data:JSON.parse(JSON.stringify(e)),type:"message",source:fe},t)},addEventListener:function(e,t){le.on(e,t)},removeEventListener:function(e,t){le.off(e,t)},dispatchEvent:function(e){le.emit(e.type,e)},define:L,require:W,__weex_document__:T,__weex_module_supports__:u,__weex_tag_supports__:c,__weex_define__:L,__weex_require__:W,__weex_downgrade__:U,__weex_env__:f,__weex_code__:t,__weex_options__:o,__weex_data__:i,__weex_config__:a};s.window=fe.self=fe.window=fe;var pe={},de={};try{pe=a.services.builtinGlobals,de=a.services.builtinModules}catch(e){}if(Object.assign(fe,pe),
p(F,w({},E.ModuleFactories,de),fe),"Web"!==f.platform){var he=ae.timing;he.domLoading=Date.now();var ve=$[t]?$[t]:new Function('with(this){(function(){"use strict";\n'+t+"\n}).call(this)}");ve.call(fe),he.domInteractive=he.domComplete=he.domInteractive=Date.now(),$[t]=ve}else new Function('"use strict";\n'+t).call(fe)}function v(e,t){var n=i(e),r=n.document;r.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),r.taskCenter.send("dom",{action:"refreshFinish"},[])}function y(e){var t=i(e),n=t.bundleCode;t.window.closed=!0;var r=t.document;r.documentElement.fireEvent("destory",{timestamp:Date.now()}),r.destroy&&r.destroy(),r.taskCenter&&r.taskCenter.destroyCallback&&r.taskCenter.destroyCallback(),delete M[e],delete $[n]}function m(e){var t=i(e),n=t.document;return n.toJSON?n.toJSON():{}}function _(e,t,n,r,i,a){if(Array.isArray(t))return void t.some(function(t){return!1!==_(e,t,n,r)});var s=e.getRef(t);if(s){var u=e.fireEvent(s,n,r,i,a);return o(e),u}return new Error('Invalid element reference "'+t+'"')}function g(e,t){var n=i(e);if(Array.isArray(t)){var r=n.document,a=[];return t.forEach(function(e){var t=void 0;if("fireEvent"===e.method){var n=b(e.args,5),i=n[0],s=n[1],u=n[2],c=n[3],l=n[4];t=_(r,i,s,u,c,l)}else if("callback"===e.method){var f=b(e.args,3),p=f[0],d=f[1],h=f[2];t=r.taskCenter.callback(p,d,h),o(r)}a.push(t)}),a}}Object.defineProperty(t,"__esModule",{value:!0});var b=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),w=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getInstance=i,t.init=a,t.registerComponents=s,t.registerMethods=l,t.registerModules=f,t.createInstance=h,t.refreshInstance=v,t.destroyInstance=y,t.getRoot=m,t.receiveTasks=g;var E=n(4),O=n(1),C=function(e){return e&&e.__esModule?e:{default:e}}(O),S={},k={},j=void 0,A=void 0,I=void 0,T="@weex-module/",N=T+"modal",P=T+"navigator",M={},$={},R=function(){};t.default=t},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});t.ModuleFactories={rax:n(5)}},function(e,t){e.exports=function(e,t,n){var r=this.__weex_document__,o=this.document;n.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=16)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={component:null,mountID:1,sandbox:!0,rootComponents:{},rootInstances:{},hook:null,driver:null,monitor:null},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),a=r(i),s=n(7),u=n(9),c=r(u),l=n(2),f=r(l),p=n(4),d=r(p),h=n(18),v=r(h),y=n(3),m="$$instance";t.default={set:function(e,t){e[m]||(e[m]=t,t.rootID&&(a.default.rootInstances[t.rootID]=t,a.default.rootComponents[t.rootID]=t._internal))},get:function(e){return e[m]},remove:function(e){var t=this.get(e);t&&(e[m]=null,t.rootID&&(delete a.default.rootComponents[t.rootID],delete a.default.rootInstances[t.rootID]))},render:function(e,t){a.default.driver.beforeRender&&a.default.driver.beforeRender(),null==t&&(t=a.default.driver.createBody());var n=this.get(t);if(n&&n.isRootComponent){var r=n.getRenderedComponent(),i=r._currentElement;if((0,d.default)(i,e)){var u=r._context;return r.updateComponent(i,e,u,u),n}a.default.hook.Reconciler.unmountComponent(n),(0,c.default)(t)}if(y.isWeb&&t.childNodes)for(var l=[].concat(o(t.childNodes)),p=0;p<l.length;p++){var h=l[p];h.hasAttribute&&h.hasAttribute("data-rendered")&&a.default.driver.removeChild(h,t)}var m=(0,s.createElement)(v.default,null,e),_=(0,f.default)(m),g={},b=_.mountComponent(t,null,g);return this.set(t,b),a.default.driver.afterRender&&a.default.driver.afterRender(b),a.default.hook.Mount._renderNewRootComponent(b._internal),b}},e.exports=t.default},function(e,t,n){function r(e){var t=void 0;if(void 0===e||null===e||!1===e||!0===e)t=new a.default.EmptyComponent;else if(Array.isArray(e))t=new a.default.FragmentComponent(e);else if("object"===(void 0===e?"undefined":o(e))&&e.type)t="string"==typeof e.type?new a.default.NativeComponent(e):new a.default.CompositeComponent(e);else{if("string"!=typeof e&&"number"!=typeof e)throw new Error("Invalid element type: "+e+". (keys: "+Object.keys(e)+")");t=new a.default.TextComponent(e)}return t._mountIndex=0,t}Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(i);t.default=r,e.exports=t.default},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":r(e)};t.isWeb="object"===("undefined"==typeof navigator?"undefined":o(navigator))&&("Mozilla"===navigator.appCodeName||"Gecko"===navigator.product),t.isNode=void 0!==process&&!(!process.versions||!process.versions.node),t.isWeex="function"==typeof callNative,t.isReactNative="undefined"!=typeof __fbBatchedBridgeConfig;t.default=e.exports,t.default=e.exports},function(e,t,n){function r(e,t){var n=null===e,r=null===t;if(n||r)return n===r;var i=void 0===e?"undefined":o(e),a=void 0===t?"undefined":o(t);return"string"===i||"number"===i?"string"===a||"number"===a:"object"===i&&"object"===a&&e.type===t.type&&e.key===t.key}Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=r,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function e(t,n,o){r(this,e),this.props=t,this.context=n,this.refs={},this.updater=o}return o(e,[{key:"isComponentClass",value:function(){}},{key:"setState",value:function(e,t){this.updater.setState(this,e,t)}},{key:"forceUpdate",value:function(e){this.updater.forceUpdate(this,e)}}]),e}();t.default=i,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=r(o),a=n(0),s=r(a);t.default={ComponentTree:{getClosestInstanceFromNode:function(e){return i.default.get(e)},getNodeFromInstance:function(e){for(;e._renderedComponent;)e=e._renderedComponent;return e?e._nativeNode:null}},Mount:{_instancesByReactRootID:s.default.rootComponents,_renderNewRootComponent:function(){}},Reconciler:{mountComponent:function(){},receiveComponent:function(){},unmountComponent:function(){}},monitor:null},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(){if(h.default.component){var e=h.default.component.getName();if(e)return" Check the render method of `"+e+"`."}return""}function i(e,t,n,r,o){return r=s(e,r),{type:e,key:t,ref:n,props:r,_owner:o}}function a(e){if(e){if(Array.isArray(e)){for(var t={},n=0;n<e.length;++n){var r=a(e[n]);if(r)for(var o in r)t[o]=r[o]}return t}return e}}function s(e,t){if(m.isWeex&&"text"===e){var n=t.children;null==t.value&&null!=n&&(Array.isArray(n)?n=n.map(function(e){return"number"==typeof e||"string"==typeof e?e:""}).join(""):"number"!=typeof n&&"string"!=typeof n&&(n=""),t.value=String(n)),t.children=null}return t}function u(e,t){var n=arguments;if(null==e)throw Error("createElement: type should not be null or undefined."+o());var r={},s=void 0,u=null,c=null;if(null!=t){c=void 0===t.ref?null:t.ref,u=void 0===t.key?null:String(t.key);for(s in t)t.hasOwnProperty(s)&&!_.hasOwnProperty(s)&&(r[s]=t[s])}for(var l=arguments.length,f=Array(l>2?l-2:0),d=2;d<l;d++)f[d-2]=n[d];if(f.length&&(r.children=(0,y.default)(f)),e&&e.defaultProps){var v=e.defaultProps;for(s in v)void 0===r[s]&&(r[s]=v[s])}return r.style&&(Array.isArray(r.style)||"object"===p(r.style))&&(r.style=a(r.style)),new i(e,u,c,r,h.default.component)}function c(e){var t=u.bind(null,e);return t.type=e,t}function l(e,t){var n=arguments;if(!f(e))throw Error("cloneElement: not a valid element."+o());var r=Object.assign({},e.props),a=e.key,s=e.ref,u=e._owner;if(t){void 0!==t.ref&&(s=t.ref,u=h.default.component),void 0!==t.key&&(a=String(t.key));var c=void 0;e.type&&e.type.defaultProps&&(c=e.type.defaultProps);var l=void 0;for(l in t)t.hasOwnProperty(l)&&!_.hasOwnProperty(l)&&(void 0===t[l]&&void 0!==c?r[l]=c[l]:r[l]=t[l])}for(var p=arguments.length,d=Array(p>2?p-2:0),v=2;v<p;v++)d[v-2]=n[v];return d.length&&(r.children=(0,y.default)(d)),new i(e.type,a,s,r,u)}function f(e){return"object"===(void 0===e?"undefined":p(e))&&null!==e&&e.type&&e.props}Object.defineProperty(t,"__esModule",{value:!0});var p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.createElement=u,t.createFactory=c,t.cloneElement=l,t.isValidElement=f;var d=n(0),h=r(d),v=n(8),y=r(v),m=n(3),_={key:!0,ref:!0};t.default=i},function(e,t,n){function r(e,t){if(Array.isArray(e))for(var n=0,o=e.length;n<o;n++)r(e[n],t);else t.push(e)}function o(e){if(null==e)return e;var t=[];return r(e,t),1===t.length&&(t=t[0]),t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o,e.exports=t.default},function(e,t,n){function r(e){var t=i.default.get(e);return!!t&&(i.default.remove(e),t._internal.unmountComponent(),!0)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var o=n(1),i=function(e){return e&&e.__esModule?e:{default:e}}(o);e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(0),s=r(a),u=n(11),c=r(u),l=n(2),f=r(l),p=n(4),d=r(p),h=n(12),v=r(h),y=n(1),m=r(y),_=/on[A-Z]/,g=function(){function e(t){o(this,e),this._currentElement=t}return i(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=s.default.mountID++;var o=this._currentElement.props,i=this._currentElement.type,a={_internal:this,type:i,props:o},u=o.append;this._instance=a,this._prevStyleCopy=Object.assign({},o.style);var l=this.getNativeNode();"tree"!==u&&(r?r(l,e):s.default.driver.appendChild(l,e)),this._currentElement&&this._currentElement.ref&&c.default.attach(this._currentElement._owner,this._currentElement.ref,this);var f=o.children;return null!=f&&this.mountChildren(f,n),"tree"===u&&(r?r(l,e):s.default.driver.appendChild(l,e)),s.default.hook.Reconciler.mountComponent(this),a}},{key:"mountChildren",value:function(e,t){var n=this;Array.isArray(e)||(e=[e]);var r=this._renderedChildren={};return e.map(function(e,o){var i=(0,f.default)(e),a=(0,v.default)(r,e,o);return r[a]=i,i._mountIndex=o,i.mountComponent(n.getNativeNode(),n._instance,t,null)})}},{key:"unmountChildren",value:function(e){var t=this._renderedChildren;if(t){for(var n in t){t[n].unmountComponent(e)}this._renderedChildren=null}}},{key:"unmountComponent",value:function(e){if(this._nativeNode){var t=this._currentElement.ref;t&&c.default.detach(this._currentElement._owner,t,this),m.default.remove(this._nativeNode),e||s.default.driver.removeChild(this._nativeNode,this._parent),s.default.driver.removeAllEventListeners(this._nativeNode)}this.unmountChildren(e),s.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._instance=null,this._prevStyleCopy=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,c.default.update(e,t,this);var o=e.props,i=t.props;this.updateProperties(o,i),this.updateChildren(i.children,r),s.default.hook.Reconciler.receiveComponent(this)}},{key:"updateProperties",value:function(e,t){var n=this,r=void 0,o=void 0,i=void 0;for(r in e)if("children"!==r&&!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if("style"===r){var a=n._prevStyleCopy;for(o in a)a.hasOwnProperty(o)&&(i=i||{},i[o]="");n._prevStyleCopy=null}else _.test(r)?"function"==typeof e[r]&&s.default.driver.removeEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),e[r]):s.default.driver.removeAttribute(n.getNativeNode(),r,e[r]);for(r in t){var u=t[r],c="style"===r?n._prevStyleCopy:null!=e?e[r]:void 0;if("children"!==r&&t.hasOwnProperty(r)&&u!==c&&(null!=u||null!=c))if("style"===r)if(u?u=n._prevStyleCopy=Object.assign({},u):n._prevStyleCopy=null,null!=c){for(o in c)!c.hasOwnProperty(o)||u&&u.hasOwnProperty(o)||(i=i||{},i[o]="");for(o in u)u.hasOwnProperty(o)&&c[o]!==u[o]&&(i=i||{},i[o]=u[o])}else i=u;else if(_.test(r))"function"==typeof c&&s.default.driver.removeEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),c),"function"==typeof u&&s.default.driver.addEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),u,t);else{var l={};l[r]=u,null!=u?s.default.driver.setAttribute(n.getNativeNode(),r,u):s.default.driver.removeAttribute(n.getNativeNode(),r,e[r])}}i&&s.default.driver.setStyles(this.getNativeNode(),i)}},{key:"updateChildren",value:function(e,t){var n=this,r=this._renderedChildren;if(null!=e||null!=r){var o={},i={};if(null!=e){Array.isArray(e)||(e=[e]);for(var a=0,u=e.length;a<u;a++){var c=e[a],l=(0,v.default)(o,c,a),p=r&&r[l],h=p&&p._currentElement;if(null!=p&&(0,d.default)(h,c))p.updateComponent(h,c,t,t),o[l]=p;else{if(p){var y=p.getNativeNode();p.unmountComponent(!0),i[l]=y}o[l]=(0,f.default)(c)}}}var m=void 0,_=void 0;if(null!=r)for(var g in r)if(r.hasOwnProperty(g)){var b=r[g],w=!o[g];m?w&&b.unmountComponent():(m=b,_=w)}null!=o&&function(){var e=0,a=0,u=null,c=[];for(var l in o){(function(l){if(!o.hasOwnProperty(l))return"continue";var f=o[l],p=r&&r[l];if(p===f){var d=p.getNativeNode();if(Array.isArray(d)||(d=[d]),p._mountIndex<e){Array.isArray(u)&&(u=u[u.length-1]);for(var h=d.length-1;h>=0;h--)s.default.driver.insertAfter(d[h],u)}c=c.concat(d),e=Math.max(p._mountIndex,e),p._mountIndex=a}else{null!=p&&(e=Math.max(p._mountIndex,e));var v=n.getNativeNode();Array.isArray(v)&&(v=n._parent),f.mountComponent(v,n._instance,t,function(e,t){var n=i[l];if(Array.isArray(e)||(e=[e]),n){Array.isArray(n)||(n=[n]);for(var r=void 0,o=0;o<e.length;o++){var a=e[o];n[o]?s.default.driver.replaceChild(a,n[o]):s.default.driver.insertAfter(a,r),r=a}if(e.length<n.length)for(var f=e.length;f<n.length;f++)s.default.driver.removeChild(n[f])}else{Array.isArray(u)&&(u=u[u.length-1]);var p=void 0;m&&!u&&(p=m.getNativeNode(),Array.isArray(p)&&(p=p[0]));for(var d=e.length-1;d>=0;d--){var h=e[d];u?s.default.driver.insertAfter(h,u):p?s.default.driver.insertBefore(h,p):s.default.driver.appendChild(h,t)}}c=c.concat(e)}),f._mountIndex=a}a++,u=f.getNativeNode()})(l)}if(Array.isArray(n._nativeNode)){n._nativeNode.splice(0,n._nativeNode.length);for(var f=0;f<c.length;f++)n._nativeNode.push(c[f])}}(),_&&m.unmountComponent(),this._renderedChildren=o}}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=s.default.driver.createElement(this._instance),m.default.set(this._nativeNode,this._instance)),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return this._currentElement.type}}]),e}();t.default=g,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={update:function(e,t,n){var r=null!=e&&e.ref,o=null!=t&&t.ref;r!==o&&(null!=r&&this.detach(e._owner,r,n),null!=o&&this.attach(t._owner,o,n))},attach:function(e,t,n){if(!e)throw new Error("You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of Rax loaded.");var r=n.getPublicInstance();"function"==typeof t?t(r):e._instance.refs[t]=r},detach:function(e,t,n){if("function"==typeof t)t(null);else{var r=n.getPublicInstance();e._instance.refs[t]===r&&delete e._instance.refs[t]}}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=t&&t.key,o="string"==typeof r,i="."+n.toString(36);if(o){var a="$"+r,s=void 0===e[a];return s||console.warn('Encountered two children with the same key "'+r+'".'),s?a:i}return i},e.exports=t.default},function(e,t,n){function r(e){return"string"==typeof e&&-1!==e.indexOf(l)}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return e.replace(f,function(e){return parseFloat(e)*t+"px"})}function i(){return p}function a(e){p=e}function s(e,t){return"number"==typeof e&&!c[t]}function u(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:p;return t&&s(e,t)?e*n+"px":r(e)?o(e,n):e}Object.defineProperty(t,"__esModule",{value:!0}),t.isRem=r,t.calcRem=o,t.getRem=i,t.setRem=a,t.isUnitNumber=s,t.convertUnit=u;var c={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,lines:!0},l="rem",f=/[-+]?\d*\.?\d+rem/g,p=1;t.default=e.exports,t.default=e.exports},function(e,t,n){function r(e,t){return e.style=e.style||{},t.forEach(function(t){e[t]&&!e.style[t]&&(e.style[t]=e[t],delete e[t])}),e}function o(e,t,n){return e[t]&&!e[n]&&(e[n]=e[t],delete e[t]),e}Object.defineProperty(t,"__esModule",{value:!0}),t.transformPropsAttrsToStyle=r,t.renamePropsAttr=o,t.default=e.exports,t.default=e.exports},function(e,t,n){function r(e){if(null==e)return null;if(e.ownerDocument||e.nodeType)return e;if(e._nativeNode)return e._nativeNode;if("string"==typeof e)return i.default.driver.getElementById(e);if("function"!=typeof e.render)throw new Error("findDOMNode: find by neither component nor DOM node.");var t=e._internal;if(t){for(;!t._nativeNode;)if(null==(t=t._renderedComponent))return null;return t._nativeNode}throw new Error("findDOMNode: find on an unmounted component.")}Object.defineProperty(t,"__esModule",{value:!0});var o=n(0),i=function(e){return e&&e.__esModule?e:{default:e}}(o);t.default=r,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Children=t.version=t.setNativeProps=t.findComponentInstance=t.unmountComponentAtNode=t.findDOMNode=t.render=t.PropTypes=t.PureComponent=t.Component=t.createFactory=t.isValidElement=t.cloneElement=t.createElement=void 0,n(17);var o=n(7),i=n(5),a=r(i),s=n(19),u=r(s),c=n(20),l=r(c),f=n(21),p=r(f),d=n(15),h=r(d),v=n(9),y=r(v),m=n(42),_=r(m),g=n(43),b=r(g),w=n(44),x=r(w),E=n(45),O=r(E);t.createElement=o.createElement,t.cloneElement=o.cloneElement,t.isValidElement=o.isValidElement,t.createFactory=o.createFactory,t.Component=a.default,t.PureComponent=u.default,t.PropTypes=l.default,t.render=p.default,t.findDOMNode=h.default,t.unmountComponentAtNode=y.default,t.findComponentInstance=_.default,t.setNativeProps=b.default,t.version=x.default,t.Children=O.default},function(e,t,n){var r=n(6),o=function(e){return e&&e.__esModule?e:{default:e}}(r);"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject(o.default)},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(5),u=function(e){return e&&e.__esModule?e:{default:e}}(s),c=1,l=function(e){function t(){var e,n,i,a,s=arguments;r(this,t);for(var u=arguments.length,l=Array(u),f=0;f<u;f++)l[f]=s[f];return n=i=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),i.rootID=c++,a=n,o(i,a)}return i(t,e),a(t,[{key:"isRootComponent",value:function(){}},{key:"render",value:function(){return this.props.children}},{key:"getPublicInstance",value:function(){return this.getRenderedComponent().getPublicInstance()}},{key:"getRenderedComponent",value:function(){return this._internal._renderedComponent}}]),t}(u.default);t.default=l,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(5),u=function(e){return e&&e.__esModule?e:{default:e}}(s),c=function(e){function t(e,n){return r(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n))}return i(t,e),a(t,[{key:"isPureComponentClass",value:function(){}}]),t}(u.default);t.default=c,e.exports=t.default},function(e,t,n){function r(e){function t(e,t,n,r,i,a){return o}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(e,t,n,r,o){}return r(t)}();t.default={array:o,bool:o,func:o,number:o,object:o,string:o,symbol:o,element:o,node:o,any:o,arrayOf:o,instanceOf:o,objectOf:o,oneOf:o,oneOfType:o,shape:o},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r){"function"==typeof n&&(r=n,n=null),(0,a.default)(n||{});var o=u.default.render(e,t),i=o.getPublicInstance();return r&&r.call(i),i}Object.defineProperty(t,"__esModule",{value:!0});var i=n(22),a=r(i),s=n(1),u=r(s),c=n(0);r(c);t.default=o,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=e.driver,n=e.hook,r=e.measurer,o=e.deviceWidth,a=e.viewportWidth;if(s.default.EmptyComponent=c.default,s.default.NativeComponent=f.default,s.default.TextComponent=d.default,s.default.FragmentComponent=m.default,s.default.CompositeComponent=v.default,s.default.hook=n||E.default,s.default.measurer=r,!s.default.driver){if(!t)if(i.isWeex)t=g.default;else{if(!i.isWeb)throw Error("No builtin driver matched");t=w.default}s.default.driver=t}o&&s.default.driver.setDeviceWidth&&s.default.driver.setDeviceWidth(o),a&&s.default.driver.setViewportWidth&&s.default.driver.setViewportWidth(a)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var i=n(3),a=n(0),s=r(a),u=n(23),c=r(u),l=n(10),f=r(l),p=n(24),d=r(p),h=n(25),v=r(h),y=n(29),m=r(y),_=n(30),g=r(_),b=n(40),w=r(b),x=n(6),E=r(x);e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(i),s=function(){function e(){r(this,e),this._currentElement=null}return o(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n;var o={_internal:this},i=this.getNativeNode();return r?r(i,e):a.default.driver.appendChild(i,e),o}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&a.default.driver.removeChild(this._nativeNode,this._parent),this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null}},{key:"updateComponent",value:function(){}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=a.default.driver.createEmpty()),this._nativeNode}}]),e}();t.default=s,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=function(e){return e&&e.__esModule?e:{default:e}}(i),s=function(){function e(t){r(this,e),this._currentElement=t,this._stringText=String(t)}return o(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=a.default.mountID++;var o=this.getNativeNode();r?r(o,e):a.default.driver.appendChild(o,e);var i={_internal:this};return a.default.hook.Reconciler.mountComponent(this),i}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&a.default.driver.removeChild(this._nativeNode,this._parent),a.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._stringText=null}},{key:"updateComponent",value:function(e,t,n){e!==t&&(this._currentElement=t,this._stringText=String(t),a.default.driver.updateText(this.getNativeNode(),this._stringText),a.default.hook.Reconciler.receiveComponent(this))}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=a.default.driver.createText(this._stringText)),this._nativeNode}}]),e}();t.default=s,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,n){try{return e()}catch(e){n?n(e):a(t,e)}}function a(e,t){for(var n=void 0;e;){if("function"==typeof e.componentDidCatch){n=e;break}if(!e._internal||!e._internal._parentInstance)break;e=e._internal._parentInstance}if(n)n.componentDidCatch(t);else{if(!d.default.sandbox)throw t;setTimeout(function(){throw t},0)}}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(26),c=r(u),l=n(27),f=r(l),p=n(0),d=r(p),h=n(11),v=r(h),y=n(2),m=r(y),_=n(4),g=r(_),b=n(28),w=r(b),x=function(){function e(t){o(this,e),this._currentElement=t}return s(e,[{key:"getName",value:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null}},{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=d.default.mountID++,this._updateCount=0;var o=this._currentElement.type,s=this._currentElement.props,u=o.prototype,l=u&&o.prototype.isComponentClass,p=u&&o.prototype.render,h=this._processContext(n),y=void 0,_=void 0;if(l||p)y=new o(s,h,f.default);else{if("function"!=typeof o)throw new Error("Invalid component type: "+o+". (keys: "+Object.keys(o)+")");y=new c.default(o)}y.props=s,y.context=h,y.refs={},y.updater=f.default,y._internal=this,this._instance=y;var g=y.state;void 0===g&&(y.state=g=null);var b=null,w=function(e){b=e};return y.componentWillMount&&i(function(){y.componentWillMount()},y,w),null==_&&(d.default.component=this,y.state=this._processPendingState(s,h),i(function(){_=y.render()},y,w),d.default.component=null),this._renderedComponent=(0,m.default)(_),this._renderedComponent.mountComponent(this._parent,y,this._processChildContext(n),r),b&&a(y,b),this._currentElement&&this._currentElement.ref&&v.default.attach(this._currentElement._owner,this._currentElement.ref,this),y.componentDidMount&&i(function(){y.componentDidMount()},y),d.default.hook.Reconciler.mountComponent(this),y}},{key:"unmountComponent",value:function(e){var t=this._instance;if(t.componentWillUnmount&&i(function(){t.componentWillUnmount()},t),d.default.hook.Reconciler.unmountComponent(this),t._internal=null,null!=this._renderedComponent){var n=this._currentElement.ref;n&&v.default.detach(this._currentElement._owner,n,this),this._renderedComponent.unmountComponent(e),this._renderedComponent=null,this._instance=null}this._currentElement=null,this._parentInstance=null,this._pendingStateQueue=null,this._pendingForceUpdate=!1,this._context=null}},{key:"_processContext",value:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return{};var r={};for(var o in n)r[o]=e[o];return r}},{key:"_processChildContext",value:function(e){var t=this._instance,n=t.getChildContext&&t.getChildContext();return n?Object.assign({},e,n):e}},{key:"_processPendingState",value:function(e,t){var n=this._instance,r=this._pendingStateQueue;if(!r)return n.state;this._pendingStateQueue=null;for(var o=Object.assign({},n.state),i=0;i<r.length;i++){var a=r[i]
;Object.assign(o,"function"==typeof a?a.call(n,o,e,t):a)}return o}},{key:"updateComponent",value:function(e,t,n,r){var o=this._instance;o||console.error("Update component '"+this.getName()+"' that has already been unmounted (or failed to mount).");var a=!1,s=void 0,u=void 0;this._context===r?s=o.context:(s=this._processContext(r),a=!0),e===t?u=t.props:(u=t.props,a=!0);var c=a&&o.componentWillReceiveProps;c&&(this._pendingState=!0,i(function(){o.componentWillReceiveProps(u,s)},o),this._pendingState=!1),v.default.update(e,t,this);var l=!0,p=o.props,h=o.state,y=this._processPendingState(u,s);if(this._pendingForceUpdate||(o.shouldComponentUpdate?l=i(function(){return o.shouldComponentUpdate(u,y,s)},o):o.isPureComponentClass&&(l=!(0,w.default)(p,u)||!(0,w.default)(h,y))),l){this._pendingForceUpdate=!1;var m=o.context;i(function(){o.componentWillUpdate&&o.componentWillUpdate(u,y,s)},o),this._currentElement=t,this._context=r,o.props=u,o.state=y,o.context=s,this._updateRenderedComponent(r),i(function(){o.componentDidUpdate&&o.componentDidUpdate(p,h,m)},o),this._updateCount++}else this._currentElement=t,this._context=r,o.props=u,o.state=y,o.context=s;if(c){var _=this._pendingCallbacks;this._pendingCallbacks=null,f.default.runCallbacks(_,o)}d.default.hook.Reconciler.receiveComponent(this)}},{key:"_updateRenderedComponent",value:function(e){var t=this._renderedComponent,n=t._currentElement,r=this._instance,o=void 0;if(d.default.component=this,i(function(){o=r.render()},r),d.default.component=null,(0,g.default)(n,o))t.updateComponent(n,o,t._context,this._processChildContext(e));else{var a=t.getNativeNode();t.unmountComponent(!0),this._renderedComponent=(0,m.default)(o),this._renderedComponent.mountComponent(this._parent,r,this._processChildContext(e),function(e,t){Array.isArray(e)||(e=[e]),Array.isArray(a)||(a=[a]);for(var n=void 0,r=0;r<e.length;r++){var o=e[r];a[r]?d.default.driver.replaceChild(o,a[r]):d.default.driver.insertAfter(o,n),n=o}if(e.length<a.length)for(var i=e.length;i<a.length;i++)d.default.driver.removeChild(a[i])})}}},{key:"getNativeNode",value:function(){var e=this._renderedComponent;if(e)return e.getNativeNode()}},{key:"getPublicInstance",value:function(){var e=this._instance;return e instanceof c.default?null:e}}]),e}();t.default=x,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=(function(e){e&&e.__esModule}(i),function(){function e(t){r(this,e),this.pureRender=t}return o(e,[{key:"render",value:function(){return this.pureRender(this.props,this.context)}}]),e}());t.default=a,e.exports=t.default},function(e,t,n){function r(e,t){if(t){(e._pendingCallbacks||(e._pendingCallbacks=[])).push(t)}}function o(e,t){if(t){(e._pendingStateQueue||(e._pendingStateQueue=[])).push(t)}}Object.defineProperty(t,"__esModule",{value:!0});var i={setState:function(e,t,n){var i=e._internal;i&&(o(i,t),r(i,n),!i._pendingState&&i._renderedComponent&&this.runUpdate(e))},forceUpdate:function(e,t){var n=e._internal;n&&(n._pendingForceUpdate=!0,r(n,t),n._renderedComponent&&this.runUpdate(e))},runUpdate:function(e){var t=e._internal,n=t._pendingCallbacks;t._pendingCallbacks=null;var r=t._currentElement,o=t._context;(t._pendingStateQueue||t._pendingForceUpdate)&&t.updateComponent(r,r,o,o),this.runCallbacks(n,e)},runCallbacks:function(e,t){if(e)for(var n=0;n<e.length;n++)e[n].call(t)}};t.default=i,e.exports=t.default},function(e,t,n){function r(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function o(e,t){if(r(e,t))return!0;if("object"!==(void 0===e?"undefined":i(e))||null===e||"object"!==(void 0===t?"undefined":i(t))||null===t)return!1;var n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(var s=0;s<n.length;s++)if(!a.call(t,n[s])||!r(e[n[s]],t[n[s]]))return!1;return!0}Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=Object.prototype.hasOwnProperty;t.default=o,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(0),c=r(u),l=n(10),f=r(l),p=n(1),d=r(p),h=n(2),v=r(h),y=n(12),m=r(y),_=function(e){function t(e){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return a(t,e),s(t,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=c.default.mountID++;var o={_internal:this};this._instance=o;var i=this.getNativeNode(),a=this._currentElement;if(this.mountChildren(a,n),r)r(i,e);else for(var s=Array.isArray(e),u=0;u<i.length;u++){var l=i[u];s?e.push(l):c.default.driver.appendChild(l,e)}return o}},{key:"mountChildren",value:function(e,t){var n=this,r=this._renderedChildren={},o=this.getNativeNode();return e.map(function(e,i){var a=(0,v.default)(e),s=(0,m.default)(r,e,i);return r[s]=a,a._mountIndex=i,a.mountComponent(n._parent,n._instance,t,function(e){if(Array.isArray(e))for(var t=0;t<e.length;t++)o.push(e[t]);else o.push(e)})})}},{key:"unmountComponent",value:function(e){var t=this;if(this._nativeNode&&(d.default.remove(this._nativeNode),!e))for(var n=0;n<this._nativeNode.length;n++)c.default.driver.removeChild(t._nativeNode[n]);this.unmountChildren(!0),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._instance=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,this.updateChildren(this._currentElement,r)}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=[]),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return"fragment"}}]),t}(f.default);t.default=_,e.exports=t.default},function(e,t,n){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol&&"symbol"===o(Symbol.iterator)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":o(e)},a=n(13),s=n(31),u=function(e){return e&&e.__esModule?e:{default:e}}(s),c=/^on[A-Z]/,l=/^aria-/,f={},p="object"===(void 0===r?"undefined":i(r))?r:"object"===(void 0===p?"undefined":i(p))?p:null,d={deviceWidth:750,viewportWidth:750,getDeviceWidth:function(){return this.deviceWidth},setDeviceWidth:function(e){this.deviceWidth=e},getViewportWidth:function(){return this.viewportWidth},setViewportWidth:function(e){this.viewportWidth=e},getElementById:function(e){return f[e]},createBody:function(){if(p.body)return p.body;var e=p.documentElement,t=p.createBody();return e.appendChild(t),t},createComment:function(e){return p.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return d.createElement({type:"text",props:{value:e}})},updateText:function(e,t){this.setAttribute(e,"value",t)},createElement:function(e){var t=u.default[e.type];t&&(e=t.parse(e));var n=e.props,r={},o=n.style;for(var i in o)r[i]=(0,a.convertUnit)(o[i],i);var s=p.createElement(e.type,{style:r});return this.setNativeProps(s,n,!0),s},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){t=t||e.parentNode;var n=e.attr&&e.attr.id;return null!=n&&(f[n]=null),t.removeChild(e)},replaceChild:function(e,t,n){n=n||t.parentNode;var r=t.previousSibling,o=t.nextSibling;this.removeChild(t,n),r?this.insertAfter(e,r,n):o?this.insertBefore(e,o,n):this.appendChild(e,n)},insertAfter:function(e,t,n){return n=n||t.parentNode,n.insertAfter(e,t)},insertBefore:function(e,t,n){return n=n||t.parentNode,n.insertBefore(e,t)},addEventListener:function(e,t,n,r){var o=r[t+"EventParams"];return e.addEvent(t,n,o)},removeEventListener:function(e,t,n){return e.removeEvent(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t,n){return"id"==t&&(f[n]=null),e.setAttr(t,void 0,!1)},setAttribute:function(e,t,n){return"id"==t&&(f[n]=e),l.test(t)&&(t=t.replace(/\-(\w)/,function(e,t){return t.toUpperCase()})),e.setAttr(t,n,!1)},setStyles:function(e,t){for(var n in t){var r=t[n];r=(0,a.convertUnit)(r,n),e.setStyle(n,r)}},beforeRender:function(){p.open(),(0,a.setRem)(this.getDeviceWidth()/this.getViewportWidth())},afterRender:function(){p.listener&&p.listener.createFinish&&p.listener.createFinish(),p.close()},setNativeProps:function(e,t,n){var r=this;for(var o in t){var i=t[o];if("children"!==o&&null!=i)if("style"===o){if(n)continue;r.setStyles(e,i)}else if(c.test(o)){var a=o.slice(2).toLowerCase();r.addEventListener(e,a,i,t)}else r.setAttribute(e,o,i)}}};t.default=d,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(32),i=r(o),a=n(33),s=r(a),u=n(34),c=r(u),l=n(35),f=r(l),p=n(36),d=r(p),h=n(37),v=r(h),y=n(38),m=r(y),_=n(39),g=r(_);t.default={span:f.default,p:d.default,img:i.default,button:v.default,video:s.default,textarea:c.default,h1:m.default,h2:m.default,h3:m.default,h4:m.default,h5:m.default,h6:m.default,nav:g.default,article:g.default,section:g.default,footer:g.default,aside:g.default,main:g.default},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(14);t.default={parse:function(e){var t=e.props;return e.type="image",e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(14);t.default={parse:function(e){var t=e.props;return e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return"string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return e.type="text","string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){function r(e){return{type:"span",attr:{value:e}}}function o(e){var t=e.type,n=e.props,r=n.style,o=n.children;"img"===t&&(t="image"),l[t]&&(r=u({},l[t],r),t="span"),n.style=null,n.children=null;var a={type:t,style:r,attr:n||{}};return o&&("span"===t&&"string"==typeof o?a.attr.value=o:a.children=i(o)),a}function i(e){var t=[];Array.isArray(e)||(e=[e]);for(var n=0;n<e.length;n++){var i=e[n];"string"==typeof i?t.push(r(i)):"object"===(void 0===i?"undefined":s(i))&&t.push(o(i))}return t}var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"===a(Symbol.iterator)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":a(e)},u=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},c={fontSize:28,marginTop:28,marginBottom:28},l={u:{textDecoration:"underline"},s:{textDecoration:"line-through"},i:{fontStyle:"italic"},b:{fontWeight:"bold"},del:{textDecoration:"line-through"},em:{fontStyle:"italic"},strong:{fontWeight:"bold"},big:{fontSize:33.6},small:{fontSize:28*.8}};t.default={parse:function(e){var t=e.props,n=t.children;return e.type="richtext",t.style=u({},c,t.style),t.value=i(n),t.children=null,e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};t.default={parse:function(e){var t=e.props;e.type="text";var n=t.style,o=t.disabled,i=t.children,a=r({textAlign:"center",fontSize:22,paddingTop:4,paddingRight:12,paddingBottom:6,paddingLeft:12,borderWidth:4,borderStyle:"solid",borderColor:"#000000",backgroudColor:"#c0c0c0"},n);return o&&(t.onClick=null,a=r({},a,{color:"#7f7f7f",borderColor:"#7f7f7f"})),"string"==typeof i&&(t.value=i,t.children=null),e}},e.exports=t.default},function(e,t,n){function r(e,t,n){return{fontSize:e*t,marginTop:e*t*n,marginBottom:e*t*n,fontWeight:"bold"}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i={h1:r(28,2,.67),h2:r(28,1.5,.83),h3:r(28,1.17,1),h4:r(28,1,1.33),h5:r(28,.83,1.67),h6:r(28,.67,2.33)};t.default={parse:function(e){var t=e.type,n=e.props;return e.type="text",n.style=o({},i[t]||i.h6,n.style),"string"!=typeof n.children||n.value||(n.value=n.children,n.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){return e.type="div",e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(13),i=n(41),a=function(e){return e&&e.__esModule?e:{default:e}}(i),s=/on[A-Z]/,u={deviceWidth:"undefined"!=typeof DEVICE_WIDTH&&DEVICE_WIDTH||null,viewportWidth:"undefined"!=typeof VIEWPORT_WIDTH&&VIEWPORT_WIDTH||750,getDeviceWidth:function(){return this.deviceWidth||o.documentElement.clientWidth},setDeviceWidth:function(e){this.deviceWidth=e},getViewportWidth:function(){return this.viewportWidth},setViewportWidth:function(e){this.viewportWidth=e},getElementById:function(e){return o.getElementById(e)},createBody:function(){return o.body},createComment:function(e){return o.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return o.createTextNode(e)},updateText:function(e,t){e["textContent"in o?"textContent":"nodeValue"]=t},createElement:function(e){var t=o.createElement(e.type),n=e.props;return this.setNativeProps(t,n),t},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){(t=t||e.parentNode)&&t.removeChild(e)},replaceChild:function(e,t,n){n=n||t.parentNode,n.replaceChild(e,t)},insertAfter:function(e,t,n){n=n||t.parentNode;var r=t.nextSibling;r?n.insertBefore(e,r):n.appendChild(e)},insertBefore:function(e,t,n){n=n||t.parentNode,n.insertBefore(e,t)},addEventListener:function(e,t,n){return e.addEventListener(t,n)},removeEventListener:function(e,t,n){return e.removeEventListener(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t){if("dangerouslySetInnerHTML"===t)return e.innerHTML=null;if("className"===t&&(t="class"),t in e)try{e[t]=null}catch(e){}e.removeAttribute(t)},setAttribute:function(e,t,n){if("dangerouslySetInnerHTML"===t)return e.innerHTML=n.__html;if("className"===t&&(t="class"),t in e)try{e[t]=n}catch(r){e.setAttribute(t,n)}else e.setAttribute(t,n)},setStyles:function(e,t){var n={};for(var o in t){var i=t[o];a.default.isFlexProp(o)?a.default[o](i,n):n[o]=(0,r.convertUnit)(i,o)}for(var s in n){var u=n[s];if(Array.isArray(u))for(var c=0;c<u.length;c++)e.style[s]=u[c];else e.style[s]=u}},beforeRender:function(){(0,r.setRem)(this.getDeviceWidth()/this.getViewportWidth())},setNativeProps:function(e,t){var n=this;for(var r in t){var o=t[r];if("children"!==r&&null!=o)if("style"===r)n.setStyles(e,o);else if(s.test(r)){var i=r.slice(2).toLowerCase();n.addEventListener(e,i,o)}else n.setAttribute(e,r,o)}}};t.default=u,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r={stretch:"stretch","flex-start":"start","flex-end":"end",center:"center"},o={row:"horizontal",column:"vertical"},i={"flex-start":"start","flex-end":"end",center:"center","space-between":"justify","space-around":"justify"},a={display:!0,flex:!0,alignItems:!0,alignSelf:!0,flexDirection:!0,justifyContent:!0,flexWrap:!0},s={isFlexProp:function(e){return a[e]},display:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.display="flex"===e?["-webkit-box","-webkit-flex","flex"]:e,t},flex:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxFlex=e,t.webkitFlex=e,t.flex=e,t},flexWrap:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.flexWrap=e,t},alignItems:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxAlign=r[e],t.webkitAlignItems=e,t.alignItems=e,t},alignSelf:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitAlignSelf=e,t.alignSelf=e,t},flexDirection:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxOrient=o[e],t.webkitFlexDirection=e,t.flexDirection=e,t},justifyContent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxPack=i[e],t.webkitJustifyContent=e,t.justifyContent=e,t}};t.default=s,e.exports=t.default},function(e,t,n){function r(e){return null==e?null:i.default.get(e)}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=function(e){return e&&e.__esModule?e:{default:e}}(o);t.default=r,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){e=(0,u.default)(e),a.default.driver.setNativeProps(e,t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var i=n(0),a=r(i),s=n(15),u=r(s);e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default="0.4.14",e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(8),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i={map:function(e,t,n){return null==e?null:(e=i.toArray(e),e.map(function(e,r){return t.call(n,e,r)}))},forEach:function(e,t,n){if(null==e)return null;e=i.toArray(e),e.forEach(function(e,r){return t.call(n,e,r)})},count:function(e){return i.toArray(e).length},only:function(e){if(e=i.toArray(e),1!==e.length)throw new Error("Children.only: expected to receive a single element child.");return e[0]},toArray:function(e){return null==e?[]:(e=(0,o.default)(e),Array.isArray(e)?e:[].concat(e))}};t.default=i,e.exports=t.default}])}},function(e,t){e.exports=function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,n){function r(e){return!!e&&("symbol"===(void 0===e?"undefined":s(e))||!!e.constructor&&("Symbol"===e.constructor.name&&"Symbol"===e[e.constructor.toStringTag]))}function o(e){if(!r(e))throw new TypeError(e+" is not a symbol");return e}var i,a,s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u=Object.defineProperties,c=Object.defineProperty,l=Object.create(null),f=function(){var e=Object.create(null);return function(t){for(var n=0;e[t+(n||"")];)++n;return t+=n||"",e[t]=!0,"@@"+t}}();a=function(e){if(this instanceof a)throw new TypeError("Symbol is not a constructor");return i(e)},e.exports=i=function e(t){var n;if(this instanceof e)throw new TypeError("Symbol is not a constructor");return n=Object.create(a.prototype),t=void 0===t?"":String(t),u(n,{__description__:{value:t},__name__:{value:f(t)}})},u(i,{for:{value:function(e){return l[e]?l[e]:l[e]=i(String(e))}},keyFor:{value:function(e){var t;o(e);for(t in l)if(l[t]===e)return t}},hasInstance:{value:i("hasInstance")},isConcatSpreadable:{value:i("isConcatSpreadable")},iterator:{value:i("iterator")},match:{value:i("match")},replace:{value:i("replace")},search:{value:i("search")},species:{value:i("species")},split:{value:i("split")},toPrimitive:{value:i("toPrimitive")},toStringTag:{value:i("toStringTag")},unscopables:{value:i("unscopables")}}),u(a.prototype,{constructor:{value:i},toString:{value:function(){return this.__name__}}}),u(i.prototype,{toString:{value:function(){return"Symbol ("+o(this).__description__+")"}},valueOf:{value:function(){return o(this)}}}),c(i.prototype,i.toPrimitive,{value:function(){var e=o(this);return"symbol"===(void 0===e?"undefined":s(e))?e:e.toString()}}),c(i.prototype,i.toStringTag,{value:"Symbol"}),c(a.prototype,i.toStringTag,{value:i.prototype[i.toStringTag]}),c(a.prototype,i.toPrimitive,{value:i.prototype[i.toPrimitive]})},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){return encodeURIComponent(e).replace(c,p)}function i(e){return decodeURIComponent(e.replace(l," "))}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),u=function(e){return e&&e.__esModule?e:{default:e}}(s),c=/[!'\(\)~]|%20|%00/g,l=/\+/g,f={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"},p=function(e){return f[e]},d="__URLSearchParams__",h=function(){function e(t){var n=this;if(r(this,e),this[d]=Object.create(null),t){"?"===t.charAt(0)&&(t=t.slice(1));for(var o,a,s=(t||"").split("&"),u=0,c=s.length;u<c;u++)a=s[u],o=a.indexOf("="),-1<o?n.append(i(a.slice(0,o)),i(a.slice(o+1))):a.length&&n.append(i(a),"")}}return a(e,[{key:"append",value:function(e,t){var n=this[d];e in n?n[e].push(""+t):n[e]=[""+t]}},{key:"delete",value:function(e){delete this[d][e]}},{key:"get",value:function(e){var t=this[d];return e in t?t[e][0]:null}},{key:"getAll",value:function(e){var t=this[d];return e in t?t[e].slice(0):[]}},{key:"has",value:function(e){return e in this[d]}},{key:"set",value:function(e,t){this[d][e]=[""+t]}},{key:"forEach",value:function(e,t){var n=this[d];Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){e.call(t,n,r,this)},this)},this)}},{key:"keys",value:function(){var e=[];this.forEach(function(t,n){e.push(n)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[u.default.iterator]=function(){return t},t}},{key:"values",value:function(){var e=[];this.forEach(function(t){e.push(t)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[u.default.iterator]=function(){return t},t}},{key:"entries",value:function(){var e=[];this.forEach(function(t,n){e.push([n,t])});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[u.default.iterator]=function(){return t},t}},{key:"toString",value:function(){var e,t,n,r,i=this[d],a=[];for(t in i)for(n=o(t),e=0,r=i[t];e<r.length;e++)a.push(n+"="+o(r[e]));return a.join("&")}}]),e}();h.prototype[u.default.iterator]=h.prototype.entries,e.exports=h},function(e,t,n){e.exports={get Promise(){return n(3)},get Symbol(){return n(0)},get Map(){return n(4)},get Set(){return n(5)},get WeakMap(){return n(6)},get WeakSet(){return n(7)},get FontFace(){return n(8)},get URL(){return n(9)},get URLSearchParams(){return n(1)},get matchMedia(){return n(10)}}},function(e,t,n){function r(){}function o(e,t){return function(){e.apply(t,arguments)}}function i(e){if("object"!==p(this))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("Promise resolver is not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e._deferreds.push(t);e._handled=!0,d(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._state?s:u)(t.promise,e._value);var r;try{r=n(e._value)}catch(e){return void u(t.promise,e)}s(t.promise,r)})}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"===(void 0===t?"undefined":p(t))||"function"==typeof t)){var n=t.then;if(t instanceof i)return e._state=3,e._value=t,void c(e);if("function"==typeof n)return void f(o(n,t),e)}e._state=1,e._value=t,c(e)}catch(t){u(e,t)}}function u(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&d(function(){e._handled||h(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function l(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function f(e,t){var n=!1;try{e(function(e){n||(n=!0,s(t,e))},function(e){n||(n=!0,u(t,e))})}catch(e){if(n)return;n=!0,u(t,e)}}var p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},d="function"==typeof setImmediate&&setImmediate||function(e){"function"==typeof setTimeout?setTimeout(e,0):e()},h=function(e){"undefined"!=typeof console&&console&&console.log("Possible Unhandled Promise Rejection:",e)};i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(r);return a(this,new l(e,t,n)),n},i.all=function(e){var t=Array.prototype.slice.call(e);return new i(function(e,n){function r(i,a){try{if(a&&("object"===(void 0===a?"undefined":p(a))||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){r(i,e)},n)}t[i]=a,0==--o&&e(t)}catch(e){n(e)}}if(0===t.length)return e([]);for(var o=t.length,i=0;i<t.length;i++)r(i,t[i])})},i.resolve=function(e){return e&&"object"===(void 0===e?"undefined":p(e))&&e.constructor===i?e:new i(function(t){t(e)})},i.reject=function(e){return new i(function(t,n){n(e)})},i.race=function(e){return new i(function(t,n){for(var r=0,o=e.length;r<o;r++)e[r].then(t,n)})},i._setImmediateFn=function(e){d=e},i._setUnhandledRejectionFn=function(e){h=e},e.exports=i},function(e,t,n){function r(e){return Number.isNaN(e)?f:e}function o(e){return e===f?NaN:e}function i(e,t){var n=0,r=!1;return{next:function(){if(n===e._keys.length&&(r=!0),r)return{value:void 0,done:!0};for(;e._keys[n]===l;)n++;return{value:t.call(e,n++),done:!1}}}}function a(e){for(var t=0,n=0,r=e._keys.length;n<r;n++)e._keys[n]!==l&&t++;return t}function s(e,t){return"function"==typeof e[t]}var u=n(0),c=function(e){return e&&e.__esModule?e:{default:e}}(u),l=(0,c.default)("undef"),f=(0,c.default)("NaN"),p=!0,d=function e(t){this._keys=[],this._values=[],t&&s(t,"forEach")&&(t instanceof e||s(t,"clear")&&s(t,"delete")&&s(t,"entries")&&s(t,"forEach")&&s(t,"get")&&s(t,"has")&&s(t,"keys")&&s(t,"set")&&s(t,"values")?t.forEach(function(e,t){this.set.apply(this,[t,e])},this):t.forEach(function(e){this.set.apply(this,e)},this)),p||(this.size=a(this))};d.prototype={};try{Object.defineProperty(d.prototype,"size",{get:function(){return a(this)}})}catch(e){p=!1}d.prototype.get=function(e){var t=this._keys.indexOf(r(e));return-1!==t?this._values[t]:void 0},d.prototype.set=function(e,t){var n=this._keys.indexOf(r(e));return-1!==n?this._values[n]=t:(this._keys.push(r(e)),this._values.push(t),p||(this.size=a(this))),this},d.prototype.has=function(e){return-1!==this._keys.indexOf(r(e))},d.prototype.delete=function(e){var t=this._keys.indexOf(r(e));return-1!==t&&(this._keys[t]=l,this._values[t]=l,p||(this.size=a(this)),!0)},d.prototype.clear=function(){this._keys=this._values=[],p||(this.size=0)},d.prototype.values=function(){return i(this,function(e){return this._values[e]})},d.prototype.keys=function(){return i(this,function(e){return o(this._keys[e])})},d.prototype.entries=d.prototype[c.default.iterator]=function(){return i(this,function(e){return[o(this._keys[e]),this._values[e]]})},d.prototype.forEach=function(e,t){var n=this;t=t||Hn;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(t,o.value[1],o.value[0],n),o=r.next()},d.prototype[c.default.species]=d,Object.defineProperty(d,"constructor",{value:d});try{Object.defineProperty(d,"length",{value:0})}catch(e){}e.exports=d},function(e,t,n){function r(e){return Number.isNaN(e)?l:e}function o(e){return e===l?NaN:e}function i(e,t){var n=0;return{next:function(){for(;e._values[n]===c;)n++;return n===e._values.length?{value:void 0,done:!0}:{value:t.call(e,n++),done:!1}}}}function a(e){for(var t=0,n=0,r=e._values.length;n<r;n++)e._values[n]!==c&&t++;return t}var s=n(0),u=function(e){return e&&e.__esModule?e:{default:e}}(s),c=(0,u.default)("undef"),l=(0,u.default)("NaN"),f=!0,p=function(e){this._values=[],e&&"function"==typeof e.forEach&&e.forEach(function(e){this.add.call(this,e)},this),f||(this.size=a(this))};try{Object.defineProperty(p.prototype,"size",{get:function(){return a(this)}})}catch(e){f=!1}p.prototype.add=function(e){return e=r(e),-1===this._values.indexOf(e)&&(this._values.push(e),f||(this.size=a(this))),this},p.prototype.has=function(e){return-1!==this._values.indexOf(r(e))},p.prototype.delete=function(e){var t=this._values.indexOf(r(e));return-1!==t&&(this._values[t]=c,f||(this.size=a(this)),!0)},p.prototype.clear=function(){this._values=[],f||(this.size=0)},p.prototype.values=p.prototype.keys=function(){return i(this,function(e){return o(this._values[e])})},p.prototype.entries=p.prototype[u.default.iterator]=function(){return i(this,function(e){return[o(this._values[e]),o(this._values[e])]})},p.prototype.forEach=function(e,t){var n=this;t=t||Hn;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(t,o.value[1],o.value[0],n),o=r.next()},p.prototype[u.default.species]=p,Object.defineProperty(p,"constructor",{value:p});try{Object.defineProperty(p,"length",{value:0})}catch(e){}e.exports=p},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.defineProperty,i=Date.now()%1e9,a=function(e){this.name="__st"+(1e9*Math.random()>>>0)+i+++"__",e&&e.forEach&&e.forEach(function(e){this.set.apply(this,e)},this)};a.prototype.set=function(e,t){if("object"!==(void 0===e?"undefined":r(e))&&"function"!=typeof e)throw new TypeError("Invalid value used as weak map key");var n=e[this.name]
;return n&&n[0]===e?n[1]=t:o(e,this.name,{value:[e,t],writable:!0}),this},a.prototype.get=function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},a.prototype.delete=function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},a.prototype.has=function(e){var t=e[this.name];return!!t&&t[0]===e},e.exports=a},function(e,t,n){var r=Date.now()%1e9,o=function(e){this.name="__st"+(1e9*Math.random()>>>0)+r+++"__",e&&e.forEach&&e.forEach(this.add,this)};o.prototype.add=function(e){var t=this.name;return e[t]||Object.defineProperty(e,t,{value:!0,writable:!0}),this},o.prototype.delete=function(e){return!!e[this.name]&&(e[this.name]=void 0,!0)},o.prototype.has=function(e){return!!e[this.name]},e.exports=o},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function e(t,n){r(this,e),this.family=t,this.source=n};e.exports=o},function(e,t,n){function r(e){return void 0!==p[e]}function o(){c.call(this),this._isInvalid=!0}function i(e){return""==e&&o.call(this),e.toLowerCase()}function a(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function s(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function u(e,t,n){function u(e){b.push(e)}var c=this,l=t||"scheme start",f=0,m="",_=!1,g=!1,b=[];e:for(;(e[f-1]!=h||0==f)&&!this._isInvalid;){var w=e[f];switch(l){case"scheme start":if(!w||!v.test(w)){if(t){u("Invalid scheme.");break e}m="",l="no scheme";continue}m+=w.toLowerCase(),l="scheme";break;case"scheme":if(w&&y.test(w))m+=w.toLowerCase();else{if(":"!=w){if(t){if(h==w)break e;u("Code point not allowed in scheme: "+w);break e}m="",f=0,l="no scheme";continue}if(c._scheme=m,m="",t)break e;r(c._scheme)&&(c._isRelative=!0),l="file"==c._scheme?"relative":c._isRelative&&n&&n._scheme==c._scheme?"relative or authority":c._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==w?l="query":"#"==w?(c._fragment="#",l="fragment"):h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._schemeData+=a(w));break;case"no scheme":if(n&&r(n._scheme)){l="relative";continue}u("Missing scheme."),o.call(c);break;case"relative or authority":if("/"!=w||"/"!=e[f+1]){u("Expected /, got: "+w),l="relative";continue}l="authority ignore slashes";break;case"relative":if(c._isRelative=!0,"file"!=c._scheme&&(c._scheme=n._scheme),h==w){c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query=n._query,c._username=n._username,c._password=n._password;break e}if("/"==w||"\\"==w)"\\"==w&&u("\\ is an invalid code point."),l="relative slash";else if("?"==w)c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query="?",c._username=n._username,c._password=n._password,l="query";else{if("#"!=w){var x=e[f+1],E=e[f+2];("file"!=c._scheme||!v.test(w)||":"!=x&&"|"!=x||h!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(c._host=n._host,c._port=n._port,c._username=n._username,c._password=n._password,c._path=n._path.slice(),c._path.pop()),l="relative path";continue}c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query=n._query,c._fragment="#",c._username=n._username,c._password=n._password,l="fragment"}break;case"relative slash":if("/"!=w&&"\\"!=w){"file"!=c._scheme&&(c._host=n._host,c._port=n._port,c._username=n._username,c._password=n._password),l="relative path";continue}"\\"==w&&u("\\ is an invalid code point."),l="file"==c._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=w){u("Expected '/', got: "+w),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=w){u("Expected '/', got: "+w);continue}break;case"authority ignore slashes":if("/"!=w&&"\\"!=w){l="authority";continue}u("Expected authority, got: "+w);break;case"authority":if("@"==w){_&&(u("@ already seen."),m+="%40"),_=!0;for(var O=0;O<m.length;O++){var C=m[O];if("\t"!=C&&"\n"!=C&&"\r"!=C)if(":"!=C||null!==c._password){var S=a(C);null!==c._password?c._password+=S:c._username+=S}else c._password="";else u("Invalid whitespace in authority.")}m=""}else{if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){f-=m.length,m="",l="host";continue}m+=w}break;case"file host":if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){2!=m.length||!v.test(m[0])||":"!=m[1]&&"|"!=m[1]?0==m.length?l="relative path start":(c._host=i.call(c,m),m="",l="relative path start"):l="relative path";continue}"\t"==w||"\n"==w||"\r"==w?u("Invalid whitespace in file host."):m+=w;break;case"host":case"hostname":if(":"!=w||g){if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){if(c._host=i.call(c,m),m="",l="relative path start",t)break e;continue}"\t"!=w&&"\n"!=w&&"\r"!=w?("["==w?g=!0:"]"==w&&(g=!1),m+=w):u("Invalid code point in host/hostname: "+w)}else if(c._host=i.call(c,m),m="",l="port","hostname"==t)break e;break;case"port":if(/[0-9]/.test(w))m+=w;else{if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w||t){if(""!=m){var k=parseInt(m,10);k!=p[c._scheme]&&(c._port=k+""),m=""}if(t)break e;l="relative path start";continue}"\t"==w||"\n"==w||"\r"==w?u("Invalid code point in port: "+w):o.call(c)}break;case"relative path start":if("\\"==w&&u("'\\' not allowed in path."),l="relative path","/"!=w&&"\\"!=w)continue;break;case"relative path":if(h!=w&&"/"!=w&&"\\"!=w&&(t||"?"!=w&&"#"!=w))"\t"!=w&&"\n"!=w&&"\r"!=w&&(m+=a(w));else{"\\"==w&&u("\\ not allowed in relative path.");var j;(j=d[m.toLowerCase()])&&(m=j),".."==m?(c._path.pop(),"/"!=w&&"\\"!=w&&c._path.push("")):"."==m&&"/"!=w&&"\\"!=w?c._path.push(""):"."!=m&&("file"==c._scheme&&0==c._path.length&&2==m.length&&v.test(m[0])&&"|"==m[1]&&(m=m[0]+":"),c._path.push(m)),m="","?"==w?(c._query="?",l="query"):"#"==w&&(c._fragment="#",l="fragment")}break;case"query":t||"#"!=w?h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._query+=s(w)):(c._fragment="#",l="fragment");break;case"fragment":h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._fragment+=w)}f++}}function c(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function l(e,t){void 0===t||t instanceof l||(t=new l(String(t))),this._url=e,c.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");u.call(this,n,null,t)}var f=n(1),p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var d=Object.create(null);d["%2e"]=".",d[".%2e"]="..",d["%2e."]="..",d["%2e%2e"]="..";var h=void 0,v=/[a-zA-Z]/,y=/[a-zA-Z0-9\+\-\.]/;l.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){c.call(this),u.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||u.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&u.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&u.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&u.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],u.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),u.call(this,e,"query"))},get searchParams(){return new f(this.search)},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),u.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}},e.exports=l},function(e,t,n){function r(e,t){return o(e).some(function(e){var n=e.inverse,r="all"===e.type||t.type===e.type;if(r&&n||!r&&!n)return!1;var o=e.expressions.every(function(e){var n=e.feature,r=e.modifier,o=e.value,i=t[n];if(!i)return!1;switch(n){case"width":case"height":o=parseFloat(o),i=parseFloat(i)}switch(r){case"min":return i>=o;case"max":return i<=o;default:return i===o}});return o&&!n||!o&&n})}function o(e){return e.split(",").map(function(e){e=e.trim();var t=e.match(a);if(!t)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var n=t[1],r=t[2],o=((t[3]||"")+(t[4]||"")).trim(),i={};if(i.inverse=!!n&&"not"===n.toLowerCase(),i.type=r?r.toLowerCase():"all",!o)return i.expressions=[],i;if(!(o=o.match(/\([^\)]+\)/g)))throw new SyntaxError('Invalid CSS media query: "'+e+'"');return i.expressions=o.map(function(t){var n=t.match(s);if(!n)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var r=n[1].toLowerCase().match(u);return{modifier:r[1],feature:r[2],value:n[2]}}),i})}function i(e){var t={matches:!1,media:e};return""===e?(t.matches=!0,t):(t.matches=r(e,{type:"screen",width:window.screen.width,height:window.screen.height}),t)}var a=/^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i,s=/^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/,u=/^(?:(min|max)-)?(.+)/;e.exports=i}])}},function(e,t,n){e.exports=function(e){function t(t,n,r){n instanceof Function&&(r=n,n=[]),e[t]={factory:r,deps:n,module:{exports:{}},isInitialized:!1,hasError:!1}}return t}},function(e,t,n){e.exports=function(e){function t(n){var r=e[n];if(r&&r.isInitialized)return r.module.exports;if(!r)throw new Error('Requiring unknown module "'+n+'"');if(r.hasError)throw new Error('Requiring module "'+n+'" which threw an exception');try{r.isInitialized=!0,r.factory(t,r.module.exports,r.module)}catch(e){throw r.hasError=!0,r.isInitialized=!1,e}return r.module.exports}return t}},function(e,t,n){function r(e){if("*"==e)return e;e="string"==typeof e?e:"";for(var t=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 o(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r.errorMessage=function(e,t,n){return"Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n}(e,t,n),r}function i(e){var t={isDowngrade:!1},n=WXEnvironment,i=n.platform||"unknow",a=i.toLowerCase(),u=e[a]||{};for(var c in n){var l=c,f=l.toLowerCase(),p=n[c],d=f.indexOf("version")>=0,h=f.indexOf("devicemodel")>=0,v=u[c];if(v&&d){var y=r(v),m=r(n[c]);if(s.default.satisfies(m,y)){t=o(l,p,v);break}}else if(h){var _=Array.isArray(v)?v:[v];if(_.indexOf(p)>=0){t=o(l,p,v);break}}}return t}var a=n(10),s=function(e){return e&&e.__esModule?e:{default:e}}(a);e.exports=function(e){return function(t){var n=e("@weex-module/instanceWrap"),r=i(t);return!!r.isDowngrade&&(n.error(r.errorType,r.code,r.errorMessage),!0)}}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default={satisfies:function(e,t){var n=/(\W+)?([\d|.]+)/;if((void 0===e?"undefined":r(e))+(void 0===t?"undefined":r(t))!="stringstring")return!1;if("*"==t)return!0;for(var o=t.match(n),i=e.split("."),a=o[2].split("."),s=Math.max(i.length,a.length),u=0,c=0;c<s;c++){if(i[c]&&!a[c]&&parseInt(i[c])>0||parseInt(i[c])>parseInt(a[c])){u=1;break}if(a[c]&&!i[c]&&parseInt(a[c])>0||parseInt(i[c])<parseInt(a[c])){u=-1;break}}switch(o[1]){case"<":if(-1===u)return!0;break;case"<=":if(1!==u)return!0;break;case">":if(1===u)return!0;break;case">=":if(-1!==u)return!0;break;default:if(0===u)return!0}return!1}},e.exports=t.default},function(e,t,n){function r(e){e.body.addEvent("viewappear",function(t){e.visibilityState=s,t.type=c,e.dispatchEvent(t)}),e.body.addEvent("viewdisappear",function(t){e.visibilityState=u,t.type=c,e.dispatchEvent(t)})}function o(e){e.body&&(e.body.removeEvent("viewappear"),e.body.removeEvent("viewdisappear"))}var i=n(1),a=function(e){return e&&e.__esModule?e:{default:e}}(i),s="visible",u="hidden",c="visibilitychange";e.exports=function(e,t){var n=new a.default,i=!1;try{t.addEventListener=function(e,o){e===c&&(t.body?r(t):i=!0),n.on(e,o)},t.removeEventListener=function(e,r){e===c&&o(t),n.off(e,r)},t.dispatchEvent=function(e){n.emit(e.type,e)},t.fonts={add:function(t){e("@weex-module/dom").addRule("fontFace",{fontFamily:t.family,src:t.source})}},t.visibilityState=s;var u=t.createBody;Object.defineProperty(t,"createBody",{value:function(){var e=u.apply(t,arguments);return i&&r(t),e}})}catch(e){console.log(e)}return t}},function(e,t,n){e.exports=function(e,t){return t.assign=function(t){e("@weex-module/navigator").push({url:t,animated:"true"},function(e){})},t.replace=function(t){e("@weex-module/location").replace(t)},t.reload=function(t){e("@weex-module/location").reload(t)},t}},function(e,t,n){e.exports=function(e,t){function n(e){return"string"!=typeof e&&(e=String(e)),e.toLowerCase()}function r(e){return"string"!=typeof e&&(e=String(e)),e}function o(e){this.originHeaders=e,this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){if(e.bodyUsed)return t.reject(new TypeError("Already read"));e.bodyUsed=!0}function a(){return this.bodyUsed=!1,this._initBody=function(e,t){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else{if(e)throw new Error("unsupported BodyInit type");this._bodyText=""}},this.text=function(){var e=i(this);return e||t.resolve(this._bodyText)},this.json=function(){return this.text().then(JSON.parse)},this}function s(e){var t=e.toUpperCase();return l.indexOf(t)>-1?t:e}function u(e,t){t=t||{};var n=t.body;if(u.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=s(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n,t)}function c(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e,t)}o.prototype.append=function(e,t){e=n(e),t=r(t);var o=this.map[e];this.map[e]=o?o+","+t:t},o.prototype.delete=function(e){delete this.map[n(e)]},o.prototype.get=function(e){return e=n(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(n(e))},o.prototype.set=function(e,t){this.map[n(e)]=[r(t)]},o.prototype.forEach=function(e,t){var n=this;for(var r in this.map)n.map.hasOwnProperty(r)&&e.call(t,n.map[r],r,n)};var l=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];u.prototype.clone=function(){return new u(this)},a.call(u.prototype),a.call(c.prototype),c.prototype.clone=function(){return new c(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},c.error=function(){var e=new c(null,{status:0,statusText:""});return e.type="error",e};var f=[301,302,303,307,308];return c.redirect=function(e,t){if(-1===f.indexOf(t))throw new RangeError("Invalid status code");return new c(null,{status:t,headers:{location:e}})},{fetch:function(n,r){return new t(function(t,o){var i;i=u.prototype.isPrototypeOf(n)&&!r?n:new u(n,r);var a={url:i.url,method:i.method,headers:i.headers&&i.headers.originHeaders};void 0!==i._bodyInit&&(a.body=i._bodyInit),a.type=r&&r.dataType?r.dataType:"text",(0,e("@weex-module/stream").fetch)(a,function(e){try{"string"==typeof e&&(e=JSON.parse(e));var n="string"==typeof e.data?e.data:JSON.stringify(e.data),r=new c(n,{status:e.status,statusText:e.statusText,headers:e.headers,url:i.url});t(r)}catch(e){o(e)}},function(e){})})},Headers:o,Request:u,Response:c}}},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(2),u=0,c=1,l=2,f=3,p=4,d=["abort","error","load","loadstart","progress","timeout","loadend","readystatechange"];e.exports=function(e){var t=function(t){function n(){r(this,n);var e=o(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return e.UNSENT=u,e.OPENED=c,e.HEADERS_RECEIVED=l,e.LOADING=f,e.DONE=p,e.readyState=u,e.status=0,e.statusText="",e.timeout=0,e._aborted=!1,e._hasError=!1,e._method=null,e._response="",e._url=null,e._timedOut=!1,e._reset(),e}return i(n,t),a(n,[{key:"_reset",value:function(){this.readyState=this.UNSENT,this.responseHeaders=void 0,this.status=0,this._hasError=!1,this._headers={},this._response="",this._responseType="",this._sent=!1,this._lowerCaseResponseHeaders={},this._timedOut=!1}},{key:"getAllResponseHeaders",value:function(){if(!this.responseHeaders)return null;var e=this.responseHeaders||{};return Object.keys(e).map(function(t){return t+": "+e[t]}).join("\r\n")}},{key:"getResponseHeader",value:function(e){var t=this._lowerCaseResponseHeaders[e.toLowerCase()];return void 0!==t?t:null}},{key:"setRequestHeader",value:function(e,t){if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");this._headers[e.toLowerCase()]=String(t)}},{key:"open",value:function(e,t,n){if(this.readyState!==this.UNSENT)throw new Error("Cannot open, already sending");if(void 0!==n&&!n)throw new Error("Synchronous http requests are not supported");if(!t)throw new Error("Cannot load an empty url");this._method=e.toUpperCase(),this._url=t,this._aborted=!1,this.setReadyState(this.OPENED)}},{key:"send",value:function(t){var n=this;if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");if(this._sent)throw new Error("Request has already been sent");this._sent=!0,(0,e("@weex-module/stream").fetch)({method:this._method,url:this._url,headers:this._headers,body:t,type:"text"},function(e){try{"string"==typeof e&&(e=JSON.parse(e)),n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),e.ok?n._response=e.data:(""!==n._responseType&&"text"!==n._responseType||(n._response=e.data),n._hasError=!0)}catch(e){}n.setReadyState(n.DONE)},function(e){n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),n.setReadyState(e.readyState)})}},{key:"abort",value:function(){this._aborted=!0,this.readyState===this.UNSENT||this.readyState===this.OPENED&&!this._sent||this.readyState===this.DONE||(this._reset(),this.setReadyState(this.DONE)),this._reset()}},{key:"setResponseHeaders",value:function(e){this.responseHeaders=e||null;var t=e||{};this._lowerCaseResponseHeaders=Object.keys(t).reduce(function(e,n){return e[n.toLowerCase()]=t[n],e},{})}},{key:"setReadyState",value:function(e){this.readyState=e,this.dispatchEvent({type:"readystatechange"}),e===this.DONE&&(this._aborted?this.dispatchEvent({type:"abort"}):this._hasError?this._timedOut?this.dispatchEvent({type:"timeout"}):this.dispatchEvent({type:"error"}):this.dispatchEvent({type:"load"}),this.dispatchEvent({type:"loadend"}))}},{key:"responseType",get:function(){return this._responseType},set:function(e){if(this._sent)throw new Error("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set after the request has been sent.");this._responseType=e}},{key:"responseText",get:function(){if(""!==this._responseType&&"text"!==this._responseType)throw new Error("The 'responseText' property is only available if 'responseType' is set to '' or 'text', but it is '"+this._responseType+"'.");return this.readyState<f?"":this._response}},{key:"response",get:function(){var e=this.responseType;return""===e||"text"===e?this.readyState<f||this._hasError?"":this._response:this.readyState!==p?null:void 0}}]),n}(s.apply(void 0,d));return t.UNSENT=u,t.OPENED=c,t.HEADERS_RECEIVED=l,t.LOADING=f,t.DONE=p,t}},function(e,t,n){function r(e,t){for(var n=e[a][t];null!=n;){if(n.kind===s)return n.listener;n=n.next}return null}function o(e,t,n){"function"!=typeof n&&"object"!=typeof n&&(n=null);for(var r=null,o=e[a][t];null!=o;)o.kind===s?null==r?e[a][t]=o.next:r.next=o.next:r=o,o=o.next;null!=n&&(null==r?e[a][t]=u(n,s):r.next=u(n,s))}var i=n(0),a=i.LISTENERS,s=i.ATTRIBUTE,u=i.newNode;e.exports.defineCustomEventTarget=function(e,t){function n(){e.call(this)}var i={constructor:{value:n,configurable:!0,writable:!0}};return t.forEach(function(e){i["on"+e]={get:function(){return r(this,e)},set:function(t){o(this,e,t)},configurable:!0,enumerable:!0}}),n.prototype=Object.create(e.prototype,i),n}},function(e,t,n){var r=n(0).createUniqueKey,o=r("stop_immediate_propagation_flag"),i=r("canceled_flag"),a=r("passive_listener_flag"),s=r("original_event"),u=Object.freeze({stopPropagation:Object.freeze({value:function(){var e=this[s];"function"==typeof e.stopPropagation&&e.stopPropagation()},writable:!0,configurable:!0}),stopImmediatePropagation:Object.freeze({value:function(){this[o]=!0;var e=this[s];"function"==typeof e.stopImmediatePropagation&&e.stopImmediatePropagation()},writable:!0,configurable:!0}),preventDefault:Object.freeze({value:function(){if(!this[a]){!0===this.cancelable&&(this[i]=!0);var e=this[s];"function"==typeof e.preventDefault&&e.preventDefault()}},writable:!0,configurable:!0}),defaultPrevented:Object.freeze({get:function(){return this[i]},enumerable:!0,configurable:!0})});e.exports.STOP_IMMEDIATE_PROPAGATION_FLAG=o,e.exports.PASSIVE_LISTENER_FLAG=a,e.exports.createEventWrapper=function(e,t){var n="number"==typeof e.timeStamp?e.timeStamp:Date.now(),r={type:{value:e.type,enumerable:!0},target:{value:t,enumerable:!0},currentTarget:{value:t,enumerable:!0},eventPhase:{value:2,enumerable:!0},bubbles:{value:Boolean(e.bubbles),enumerable:!0},cancelable:{value:Boolean(e.cancelable),enumerable:!0},timeStamp:{value:n,enumerable:!0},isTrusted:{value:!1,enumerable:!0}};return r[o]={value:!1,writable:!0},r[i]={value:!1,writable:!0},r[a]={value:!1,writable:!0},r[s]={value:e},void 0!==e.detail&&(r.detail={value:e.detail,enumerable:!0}),Object.create(Object.create(e,u),r)}},function(e,t,n){function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(2),u=0,c=1,l=3,f=["close","error","message","open"],p=function e(t,n){i(this,e),this.type=t.toString(),Object.assign(this,n)};e.exports=function(e){var t=function(t){function n(t,o){i(this,n);var a=r(this,(n.__proto__||Object.getPrototypeOf(n)).call(this)),s=e("@weex-module/webSocket");return s.WebSocket(t,o),a.readyState=u,a.websocket=s,s.onmessage(function(e){a.dispatchEvent(new p("message",e))}),s.onopen(function(e){a.readyState=c,a.dispatchEvent(new p("open"))}),s.onclose(function(e){a.readyState=l,a.dispatchEvent(new p("close",{code:e.code,reason:e.reason}))}),s.onerror(function(e){a.dispatchEvent(new p("error",e))}),a}return o(n,t),a(n,[{key:"close",value:function(e,t){2!==this.readyState&&this.readyState!==l&&(this.readyState=2,this.websocket.close(e,t))}},{key:"send",value:function(e){if("string"==typeof e)return void this.websocket.send(e);throw new Error("Unsupported data type")}}]),n}(s(f));return t.CONNECTING=u,t.OPEN=c,t.CLOSING=2,t.CLOSED=l,t}},function(e,t,n){var r="@weex-module/timer";e.exports=function(e,t){var n=function(n,o){return e(r).setTimeout(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()},o=function(n,o){return e(r).setInterval(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()};return{setTimeout:n,clearTimeout:function(t){e(r).clearTimeout(t)},setInterval:o,clearInterval:function(t){e(r).clearInterval(t)},requestAnimationFrame:function(t){return e(r).setTimeout(t,16)},cancelAnimationFrame:function(t){e(r).clearTimeout(t)}}}},function(e,t,n){e.exports=function(){var e={},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return e.btoa=function(e){for(var n,r,o=String(e),i=0,a=t,s="";o.charAt(0|i)||(a="=",i%1);s+=a.charAt(63&n>>8-i%1*8)){if((r=o.charCodeAt(i+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");n=n<<8|r}return s},e.atob=function(e){var n=String(e).replace(/=+$/,"");if(n.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,o,i=0,a=0,s="";o=n.charAt(a++);~o&&(r=i%4?64*r+o:o,i++%4)?s+=String.fromCharCode(255&r>>(-2*i&6)):0)o=t.indexOf(o);return s},e}},function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}e.exports=function(e){var t,n={};return n.timing=(t={unloadEventStart:0,unloadEventEnd:0,navigationStart:e,redirectStart:0,redirectEnd:0,fetchStart:e,domainLookupStart:e,domainLookupEnd:e,connectStart:e,secureConnectionStart:e},r(t,"connectStart",e),r(t,"requestStart",e),r(t,"responseStart",e),r(t,"responseEnd",e),r(t,"domLoading",0),r(t,"domInteractive",0),r(t,"domComplete",0),r(t,"domContentLoadedEventStart",0),r(t,"domContentLoadedEventEnd",0),r(t,"loadEventStart",0),r(t,"loadEventEnd",0),t),n.now=function(){return Date.now()-n.timing.navigationStart},n}},function(e,t,n){function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e.exports=function(){var e=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,e),this.type=t,this.bubbles=Boolean(n.bubbles),this.cancelable=Boolean(n.cancelable)};return{Event:e,CustomEvent:function(e){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t);var o=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));return o.detail=n.detail,o}return o(t,e),t}(e)}}}])}),zr=i(qr),Jr={Vanilla:Jn,Vue:cr,Rax:zr,Weex:Br},Hr={browser:"0.5.0",framework:"0.22.5","vue-render":"0.12.3",transformer:">=0.1.5 <0.5"};Array.from||(Array.from=function(){var e=Object.prototype.toString,t=function(t){return"function"==typeof t||"[object Function]"===e.call(t)},n=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(t>0?1:-1)*Math.floor(Math.abs(t)):t},r=Math.pow(2,53)-1,o=function(e){var t=n(e);return Math.min(Math.max(t,0),r)};return function(e){var n=this,r=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var i,a=arguments.length>1?arguments[1]:void 0;if(void 0!==a){if(!t(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(i=arguments[2])}for(var s,u=o(r.length),c=t(n)?Object(new n(u)):new Array(u),l=0;l<u;)s=r[l],c[l]=a?void 0===i?a(s,l):a.call(i,s,l):s,l+=1;return c.length=u,c}}());var Gr=a(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)}),Xr=a(function(e){var t=e.exports={version:"2.5.1"};"number"==typeof __e&&(__e=t)}),Kr=function(e){return"object"==typeof e?null!==e:"function"==typeof e},Zr=Kr,Qr=function(e){if(!Zr(e))throw TypeError(e+" is not an object!");return e},Yr=function(e){try{return!!e()}catch(e){return!0}},eo=!Yr(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),to=Kr,no=Gr.document,ro=to(no)&&to(no.createElement),oo=function(e){return ro?no.createElement(e):{}},io=!eo&&!Yr(function(){return 7!=Object.defineProperty(oo("div"),"a",{get:function(){return 7}}).a}),ao=Kr,so=function(e,t){if(!ao(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!ao(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!ao(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!ao(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},uo=Qr,co=io,lo=so,fo=Object.defineProperty,po=eo?Object.defineProperty:function(e,t,n){if(uo(e),t=lo(t,!0),uo(n),co)try{return fo(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},ho={f:po},vo=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},yo=ho,mo=vo,_o=eo?function(e,t,n){return yo.f(e,t,mo(1,n))}:function(e,t,n){return e[t]=n,e},go={}.hasOwnProperty,bo=function(e,t){return go.call(e,t)},wo=0,xo=Math.random(),Eo=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++wo+xo).toString(36))},Oo=a(function(e){var t=Gr,n=_o,r=bo,o=Eo("src"),i=Function.toString,a=(""+i).split("toString");Xr.inspectSource=function(e){return i.call(e)},(e.exports=function(e,i,s,u){var c="function"==typeof s;c&&(r(s,"name")||n(s,"name",i)),e[i]!==s&&(c&&(r(s,o)||n(s,o,e[i]?""+e[i]:a.join(String(i)))),e===t?e[i]=s:u?e[i]?e[i]=s:n(e,i,s):(delete e[i],n(e,i,s)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||i.call(this)})}),Co=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},So=Co,ko=function(e,t,n){if(So(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}},jo=Gr,Ao=Xr,Io=_o,To=Oo,No=ko,Po=function(e,t,n){var r,o,i,a,s=e&Po.F,u=e&Po.G,c=e&Po.S,l=e&Po.P,f=e&Po.B,p=u?jo:c?jo[t]||(jo[t]={}):(jo[t]||{}).prototype,d=u?Ao:Ao[t]||(Ao[t]={}),h=d.prototype||(d.prototype={});u&&(n=t);for(r in n)o=!s&&p&&void 0!==p[r],i=(o?p:n)[r],
a=f&&o?No(i,jo):l&&"function"==typeof i?No(Function.call,i):i,p&&To(p,r,i,e&Po.U),d[r]!=i&&Io(d,r,a),l&&h[r]!=i&&(h[r]=i)};jo.core=Ao,Po.F=1,Po.G=2,Po.S=4,Po.P=8,Po.B=16,Po.W=32,Po.U=64,Po.R=128;var Mo=Po,$o={}.toString,Ro=function(e){return $o.call(e).slice(8,-1)},Do=Ro,Fo=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==Do(e)?e.split(""):Object(e)},Lo=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e},Wo=Fo,Uo=Lo,Vo=function(e){return Wo(Uo(e))},Bo=Math.ceil,qo=Math.floor,zo=function(e){return isNaN(e=+e)?0:(e>0?qo:Bo)(e)},Jo=zo,Ho=Math.min,Go=function(e){return e>0?Ho(Jo(e),9007199254740991):0},Xo=zo,Ko=Math.max,Zo=Math.min,Qo=function(e,t){return e=Xo(e),e<0?Ko(e+t,0):Zo(e,t)},Yo=Vo,ei=Go,ti=Qo,ni=Gr,ri=ni["__core-js_shared__"]||(ni["__core-js_shared__"]={}),oi=function(e){return ri[e]||(ri[e]={})},ii=oi("keys"),ai=Eo,si=function(e){return ii[e]||(ii[e]=ai(e))},ui=bo,ci=Vo,li=function(e){return function(t,n,r){var o,i=Yo(t),a=ei(i.length),s=ti(r,a);if(e&&n!=n){for(;a>s;)if((o=i[s++])!=o)return!0}else for(;a>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return!e&&-1}}(!1),fi=si("IE_PROTO"),pi=function(e,t){var n,r=ci(e),o=0,i=[];for(n in r)n!=fi&&ui(r,n)&&i.push(n);for(;t.length>o;)ui(r,n=t[o++])&&(~li(i,n)||i.push(n));return i},di="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),hi=pi,vi=di,yi=Object.keys||function(e){return hi(e,vi)},mi=Object.getOwnPropertySymbols,_i={f:mi},gi={}.propertyIsEnumerable,bi={f:gi},wi=Lo,xi=function(e){return Object(wi(e))},Ei=yi,Oi=_i,Ci=bi,Si=xi,ki=Fo,ji=Object.assign,Ai=!ji||Yr(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=ji({},e)[n]||Object.keys(ji({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Si(e),o=arguments.length,i=1,a=Oi.f,s=Ci.f;o>i;)for(var u,c=ki(n[i++]),l=a?Ei(c).concat(a(c)):Ei(c),f=l.length,p=0;f>p;)s.call(c,u=l[p++])&&(r[u]=c[u]);return r}:ji,Ii=Mo;Ii(Ii.S+Ii.F,"Object",{assign:Ai}),Object.setPrototypeOf||(Object.setPrototypeOf=function(e,t){function n(e,t){return r.call(e,t),e}var r;try{r=e.getOwnPropertyDescriptor(e.prototype,"__proto__").set,r.call({},null)}catch(t){if(e.prototype!=={}.__proto__||void 0==={__proto__:null}.__proto__)return;r=function(e){this.__proto__=e},n.polyfill=n(n({},null),e.prototype)instanceof e}return n}(Object));var Ti=Hn,Ni=Ti.WXEnvironment;Ni&&"iOS"===Ni.platform&&(Hn.Promise=void 0);var Pi=a(function(e){var t=oi("wks"),n=Eo,r=Gr.Symbol,o="function"==typeof r;(e.exports=function(e){return t[e]||(t[e]=o&&r[e]||(o?r:n)("Symbol."+e))}).store=t}),Mi=Ro,$i=Pi("toStringTag"),Ri="Arguments"==Mi(function(){return arguments}()),Di=function(e,t){try{return e[t]}catch(e){}},Fi=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=Di(t=Object(e),$i))?n:Ri?Mi(t):"Object"==(r=Mi(t))&&"function"==typeof t.callee?"Arguments":r},Li=Fi,Wi={};Wi[Pi("toStringTag")]="z",Wi+""!="[object z]"&&Oo(Object.prototype,"toString",function(){return"[object "+Li(this)+"]"},!0);var Ui=zo,Vi=Lo,Bi={},qi=ho,zi=Qr,Ji=yi,Hi=eo?Object.defineProperties:function(e,t){zi(e);for(var n,r=Ji(t),o=r.length,i=0;o>i;)qi.f(e,n=r[i++],t[n]);return e},Gi=Gr.document,Xi=Gi&&Gi.documentElement,Ki=Qr,Zi=Hi,Qi=di,Yi=si("IE_PROTO"),ea=function(){},ta=function(){var e,t=oo("iframe"),n=Qi.length;for(t.style.display="none",Xi.appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("<script>document.F=Object<\/script>"),e.close(),ta=e.F;n--;)delete ta.prototype[Qi[n]];return ta()},na=Object.create||function(e,t){var n;return null!==e?(ea.prototype=Ki(e),n=new ea,ea.prototype=null,n[Yi]=e):n=ta(),void 0===t?n:Zi(n,t)},ra=ho.f,oa=bo,ia=Pi("toStringTag"),aa=function(e,t,n){e&&!oa(e=n?e:e.prototype,ia)&&ra(e,ia,{configurable:!0,value:t})},sa=na,ua=vo,ca=aa,la={};_o(la,Pi("iterator"),function(){return this});var fa=function(e,t,n){e.prototype=sa(la,{next:ua(1,n)}),ca(e,t+" Iterator")},pa=bo,da=xi,ha=si("IE_PROTO"),va=Object.prototype,ya=Object.getPrototypeOf||function(e){return e=da(e),pa(e,ha)?e[ha]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?va:null},ma=Mo,_a=Oo,ga=_o,ba=bo,wa=Bi,xa=fa,Ea=aa,Oa=ya,Ca=Pi("iterator"),Sa=!([].keys&&"next"in[].keys()),ka=function(){return this},ja=function(e,t,n,r,o,i,a){xa(n,t,r);var s,u,c,l=function(e){if(!Sa&&e in h)return h[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",p="values"==o,d=!1,h=e.prototype,v=h[Ca]||h["@@iterator"]||o&&h[o],y=v||l(o),m=o?p?l("entries"):y:void 0,_="Array"==t?h.entries||v:v;if(_&&(c=Oa(_.call(new e)))!==Object.prototype&&c.next&&(Ea(c,f,!0),ba(c,Ca)||ga(c,Ca,ka)),p&&v&&"values"!==v.name&&(d=!0,y=function(){return v.call(this)}),(Sa||d||!h[Ca])&&ga(h,Ca,y),wa[t]=y,wa[f]=ka,o)if(s={values:p?y:l("values"),keys:i?y:l("keys"),entries:m},a)for(u in s)u in h||_a(h,u,s[u]);else ma(ma.P+ma.F*(Sa||d),t,s);return s},Aa=function(e){return function(t,n){var r,o,i=String(Vi(t)),a=Ui(n),s=i.length;return a<0||a>=s?e?"":void 0:(r=i.charCodeAt(a),r<55296||r>56319||a+1===s||(o=i.charCodeAt(a+1))<56320||o>57343?e?i.charAt(a):r:e?i.slice(a,a+2):o-56320+(r-55296<<10)+65536)}}(!0);ja(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=Aa(t,n),this._i+=e.length,{value:e,done:!1})});var Ia=Pi("unscopables"),Ta=Array.prototype;void 0==Ta[Ia]&&_o(Ta,Ia,{});var Na=function(e){Ta[Ia][e]=!0},Pa=function(e,t){return{value:t,done:!!e}},Ma=Na,$a=Pa,Ra=Bi,Da=Vo,Fa=ja(Array,"Array",function(e,t){this._t=Da(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,$a(1)):"keys"==t?$a(0,n):"values"==t?$a(0,e[n]):$a(0,[n,e[n]])},"values");Ra.Arguments=Ra.Array,Ma("keys"),Ma("values"),Ma("entries");for(var La=Fa,Wa=yi,Ua=Oo,Va=Gr,Ba=_o,qa=Bi,za=Pi,Ja=za("iterator"),Ha=za("toStringTag"),Ga=qa.Array,Xa={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},Ka=Wa(Xa),Za=0;Za<Ka.length;Za++){var Qa,Ya=Ka[Za],es=Xa[Ya],ts=Va[Ya],ns=ts&&ts.prototype;if(ns&&(ns[Ja]||Ba(ns,Ja,Ga),ns[Ha]||Ba(ns,Ha,Ya),qa[Ya]=Ga,es))for(Qa in La)ns[Qa]||Ua(ns,Qa,La[Qa],!0)}var rs,os,is,as=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e},ss=Qr,us=function(e,t,n,r){try{return r?t(ss(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&ss(o.call(e)),t}},cs=Bi,ls=Pi("iterator"),fs=Array.prototype,ps=function(e){return void 0!==e&&(cs.Array===e||fs[ls]===e)},ds=Fi,hs=Pi("iterator"),vs=Bi,ys=Xr.getIteratorMethod=function(e){if(void 0!=e)return e[hs]||e["@@iterator"]||vs[ds(e)]},ms=a(function(e){var t=ko,n=us,r=ps,o=Qr,i=Go,a=ys,s={},u={},c=e.exports=function(e,c,l,f,p){var d,h,v,y,m=p?function(){return e}:a(e),_=t(l,f,c?2:1),g=0;if("function"!=typeof m)throw TypeError(e+" is not iterable!");if(r(m)){for(d=i(e.length);d>g;g++)if((y=c?_(o(h=e[g])[0],h[1]):_(e[g]))===s||y===u)return y}else for(v=m.call(e);!(h=v.next()).done;)if((y=n(v,_,h.value,c))===s||y===u)return y};c.BREAK=s,c.RETURN=u}),_s=Qr,gs=Co,bs=Pi("species"),ws=function(e,t){var n,r=_s(e).constructor;return void 0===r||void 0==(n=_s(r)[bs])?t:gs(n)},xs=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])}return e.apply(n,t)},Es=ko,Os=xs,Cs=Xi,Ss=oo,ks=Gr,js=ks.process,As=ks.setImmediate,Is=ks.clearImmediate,Ts=ks.MessageChannel,Ns=ks.Dispatch,Ps=0,Ms={},$s=function(){var e=+this;if(Ms.hasOwnProperty(e)){var t=Ms[e];delete Ms[e],t()}},Rs=function(e){$s.call(e.data)};As&&Is||(As=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return Ms[++Ps]=function(){Os("function"==typeof e?e:Function(e),n)},rs(Ps),Ps},Is=function(e){delete Ms[e]},"process"==Ro(js)?rs=function(e){js.nextTick(Es($s,e,1))}:Ns&&Ns.now?rs=function(e){Ns.now(Es($s,e,1))}:Ts?(os=new Ts,is=os.port2,os.port1.onmessage=Rs,rs=Es(is.postMessage,is,1)):ks.addEventListener&&"function"==typeof postMessage&&!ks.importScripts?(rs=function(e){ks.postMessage(e+"","*")},ks.addEventListener("message",Rs,!1)):rs="onreadystatechange"in Ss("script")?function(e){Cs.appendChild(Ss("script")).onreadystatechange=function(){Cs.removeChild(this),$s.call(e)}}:function(e){setTimeout(Es($s,e,1),0)});var Ds={set:As,clear:Is},Fs=Gr,Ls=Ds.set,Ws=Fs.MutationObserver||Fs.WebKitMutationObserver,Us=Fs.process,Vs=Fs.Promise,Bs="process"==Ro(Us),qs=Co,zs=function(e){return new Pt(e)},Js={f:zs},Hs=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},Gs=Qr,Xs=Kr,Ks=Js,Zs=function(e,t){if(Gs(e),Xs(t)&&t.constructor===e)return t;var n=Ks.f(e);return(0,n.resolve)(t),n.promise},Qs=Oo,Ys=Gr,eu=ho,tu=eo,nu=Pi("species"),ru=Pi("iterator"),ou=!1;try{var iu=[7][ru]();iu.return=function(){ou=!0},Array.from(iu,function(){throw 2})}catch(e){}var au,su,uu,cu,lu=Gr,fu=ko,pu=Fi,du=Mo,hu=Kr,vu=Co,yu=as,mu=ms,_u=ws,gu=Ds.set,bu=function(){var e,t,n,r=function(){var r,o;for(Bs&&(r=Us.domain)&&r.exit();e;){o=e.fn,e=e.next;try{o()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(Bs)n=function(){Us.nextTick(r)};else if(Ws){var o=!0,i=document.createTextNode("");new Ws(r).observe(i,{characterData:!0}),n=function(){i.data=o=!o}}else if(Vs&&Vs.resolve){var a=Vs.resolve();n=function(){a.then(r)}}else n=function(){Ls.call(Fs,r)};return function(r){var o={fn:r,next:void 0};t&&(t.next=o),e||(e=o,n()),t=o}}(),wu=Js,xu=Hs,Eu=Zs,Ou=lu.TypeError,Cu=lu.process,Su=lu.Promise,ku="process"==pu(Cu),ju=function(){},Au=su=wu.f,Iu=!!function(){try{var e=Su.resolve(1),t=(e.constructor={})[Pi("species")]=function(e){e(ju,ju)};return(ku||"function"==typeof PromiseRejectionEvent)&&e.then(ju)instanceof t}catch(e){}}(),Tu=function(e){var t;return!(!hu(e)||"function"!=typeof(t=e.then))&&t},Nu=function(e,t){if(!e._n){e._n=!0;var n=e._c;bu(function(){for(var r=e._v,o=1==e._s,i=0;n.length>i;)!function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,u=t.reject,c=t.domain;try{a?(o||(2==e._h&&$u(e),e._h=1),!0===a?n=r:(c&&c.enter(),n=a(r),c&&c.exit()),n===t.promise?u(Ou("Promise-chain cycle")):(i=Tu(n))?i.call(n,s,u):s(n)):u(r)}catch(e){u(e)}}(n[i++]);e._c=[],e._n=!1,t&&!e._h&&Pu(e)})}},Pu=function(e){gu.call(lu,function(){var t,n,r,o=e._v,i=Mu(e);if(i&&(t=xu(function(){ku?Cu.emit("unhandledRejection",o,e):(n=lu.onunhandledrejection)?n({promise:e,reason:o}):(r=lu.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=ku||Mu(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},Mu=function(e){if(1==e._h)return!1;for(var t,n=e._a||e._c,r=0;n.length>r;)if(t=n[r++],t.fail||!Mu(t.promise))return!1;return!0},$u=function(e){gu.call(lu,function(){var t;ku?Cu.emit("rejectionHandled",e):(t=lu.onrejectionhandled)&&t({promise:e,reason:e._v})})},Ru=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),Nu(t,!0))},Du=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Ou("Promise can't be resolved itself");(t=Tu(e))?bu(function(){var r={_w:n,_d:!1};try{t.call(e,fu(Du,r,1),fu(Ru,r,1))}catch(e){Ru.call(r,e)}}):(n._v=e,n._s=1,Nu(n,!1))}catch(e){Ru.call({_w:n,_d:!1},e)}}};Iu||(Su=function(e){yu(this,Su,"Promise","_h"),vu(e),au.call(this);try{e(fu(Du,this,1),fu(Ru,this,1))}catch(e){Ru.call(this,e)}},au=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},au.prototype=function(e,t,n){for(var r in t)Qs(e,r,t[r],n);return e}(Su.prototype,{then:function(e,t){var n=Au(_u(this,Su));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=ku?Cu.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&Nu(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),uu=function(){var e=new au;this.promise=e,this.resolve=fu(Du,e,1),this.reject=fu(Ru,e,1)},wu.f=Au=function(e){return e===Su||e===cu?new uu(e):su(e)}),du(du.G+du.W+du.F*!Iu,{Promise:Su}),aa(Su,"Promise"),function(e){var t=Ys[e];tu&&t&&!t[nu]&&eu.f(t,nu,{configurable:!0,get:function(){return this}})}("Promise"),cu=Xr.Promise,du(du.S+du.F*!Iu,"Promise",{reject:function(e){var t=Au(this);return(0,t.reject)(e),t.promise}}),du(du.S+du.F*!Iu,"Promise",{resolve:function(e){return Eu(this,e)}}),du(du.S+du.F*!(Iu&&function(e,t){if(!t&&!ou)return!1;var n=!1;try{var r=[7],o=r[ru]();o.next=function(){return{done:n=!0}},r[ru]=function(){return o},e(r)}catch(e){}return n}(function(e){Su.all(e).catch(ju)})),"Promise",{all:function(e){var t=this,n=Au(t),r=n.resolve,o=n.reject,i=xu(function(){var n=[],i=0,a=1;mu(e,!1,function(e){var s=i++,u=!1;n.push(void 0),a++,t.resolve(e).then(function(e){u||(u=!0,n[s]=e,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(e){var t=this,n=Au(t),r=n.reject,o=xu(function(){mu(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Fu=["off","error","warn","info","log","debug"],Lu={},Wu=global.console,Uu=global.setTimeout,Vu=global.setTimeoutNative;Lt();var Bu=1,qu=function(e){this.instanceId=e,this.lastCallbackId=0,this.callbacks={}};qu.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},qu.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},qu.prototype.consume=function(e,t,n){var r=this.callbacks[e];return void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r?r(Kt(t)):new Error('invalid callback id "'+e+'"')},qu.prototype.close=function(){this.callbacks={}};var zu={},Ju=function(){this.nodeId=zt(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};Ju.prototype.destroy=function(){var e=Qt(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var Hu,Gu={},Xu="div",Ku=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"],Zu=function(e){function t(t,n,r){void 0===t&&(t=Xu),e.call(this);var o=pn(t);if(o&&!r)return new o(t,n,!0);n=n||{},this.nodeType=1,this.nodeId=zt(),this.ref=this.nodeId,this.type=t,this.attr=n.attr||{},this.style=n.style||{},this.classStyle=n.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(cn(e,this.children,this.children.length,!0),1===e.nodeType){var t=cn(e,this.pureChildren,this.pureChildren.length),n=en(this.docId);if(n&&t>=0)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(on(e,this),un(e,this.children,this.children.length,!0),this.docId&&dn(this.docId,e),1===e.nodeType){un(e,this.pureChildren,this.pureChildren.length);var r=en(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},t.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(cn(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=an(t),r=cn(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=en(this.docId);if(o&&r>=0)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(on(e,this),un(e,this.children,this.children.indexOf(t),!0),this.docId&&dn(this.docId,e),1===e.nodeType){var i=an(t),a=un(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=en(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},t.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(cn(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=cn(e,this.pureChildren,this.pureChildren.indexOf(sn(t))+1),r=en(this.docId);if(r&&n>=0)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(on(e,this),un(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&dn(this.docId,e),1===e.nodeType){var o=un(e,this.pureChildren,this.pureChildren.indexOf(sn(t))+1),i=en(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},t.prototype.removeChild=function(e,t){if(e.parentNode&&(ln(e,this.children,!0),1===e.nodeType)){ln(e,this.pureChildren);var n=en(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},t.prototype.clear=function(){var e=en(this.docId);e&&this.pureChildren.forEach(function(t){e.send("dom",{action:"removeElement"},[t.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},t.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=en(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},t.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=en(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},t.prototype.setClassStyle=function(e){var t=this;for(var n in this.classStyle)t.classStyle[n]="";Object.assign(this.classStyle,e);var r=en(this.docId);r&&r.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},t.prototype.addEvent=function(e,t,n){if(this.event||(this.event={}),!this.event[e]){this.event[e]={handler:t,params:n};var r=en(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,e])}},t.prototype.removeEvent=function(e){if(this.event&&this.event[e]){delete this.event[e];var t=en(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},t.prototype.fireEvent=function(e,t,n,r){var o=null,i=!1,a=this.event[e];if(a&&t){var s=a.handler;t.stopPropagation=function(){i=!0},o=r&&r.params?s.call.apply(s,[this].concat(r.params,[t])):s.call(this,t)}return!i&&n&&-1!==Ku.indexOf(e)&&this.parentNode&&this.parentNode.fireEvent&&(t.currentTarget=this.parentNode,this.parentNode.fireEvent(e,t,n)),o},t.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},t.prototype.toJSON=function(){var e=this,t={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},n=[];for(var r in this.event){var o=e.event[r],i=o.params;i?n.push({type:r,params:i}):n.push(r)}return n.length&&(t.event=n),this.pureChildren.length&&(t.children=this.pureChildren.map(function(e){return e.toJSON()})),t},t.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+">"},t}(Ju);!function(e){Hu=e}(Zu);var Qu=function(){},Yu=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:e}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new qu(e)}),Qu=t||function(){}};Yu.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},Yu.prototype.destroyCallback=function(){return this.callbackManager.close()},Yu.prototype.normalize=function(e){var t=Jt(e);return e&&e instanceof Zu?e.ref:e&&e._isVue&&e.$el instanceof Zu?e.$el.ref:"Function"===t?this.callbackManager.add(e).toString():Xt(e)},Yu.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,u=t.module,c=t.method;switch(n=n.map(function(e){return o.normalize(e)}),e){case"dom":return this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,c,n,Object.assign({component:a},r));default:return this.moduleHandler(this.instanceId,u,c,n,r)}},Yu.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},Yu.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},Yu.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};var ec,tc,nc=[],rc=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/,oc={},ic={createInstance:xn,registerService:vn,unregisterService:yn},ac=function(e){function t(t){e.call(this),this.nodeType=8,this.nodeId=zt(),this.ref=this.nodeId,this.type="comment",this.value=t,this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},t}(Ju),sc=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")};sc.prototype.createFinish=function(e){return(0,this.handler)([jn("createFinish")],e)},sc.prototype.updateFinish=function(e){return(0,this.handler)([jn("updateFinish")],e)},sc.prototype.refreshFinish=function(e){return(0,this.handler)([jn("refreshFinish")],e)},sc.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[jn("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return jn("addElement",[t.ref,e,-1])})),this.addActions(r)},sc.prototype.addElement=function(e,t,n){return n>=0||(n=-1),this.addActions(jn("addElement",[t,e.toJSON(),n]))},sc.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return jn("removeElement",[e])});return this.addActions(t)}return this.addActions(jn("removeElement",[e]))},sc.prototype.moveElement=function(e,t,n){return this.addActions(jn("moveElement",[e,t,n]))},sc.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(jn("updateAttrs",[e,r]))},sc.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(jn("updateStyle",[e,r]))},sc.prototype.setStyles=function(e,t){return this.addActions(jn("updateStyle",[e,t]))},sc.prototype.addEvent=function(e,t){return this.addActions(jn("addEvent",[e,t]))},sc.prototype.removeEvent=function(e,t){return this.addActions(jn("removeEvent",[e,t]))},sc.prototype.handler=function(e,t){return t&&t()},sc.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 uc={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"},cc=function e(t,n,r){t=t?t.toString():"",this.id=t,this.URL=n,Zt(t,this),this.nodeMap={};var o=e.Listener||sc;this.listener=new o(t,r||An(t,e.handler)),this.taskCenter=new Yu(t,r?function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};cc.prototype.getRef=function(e){return this.nodeMap[e]},cc.prototype.open=function(){this.listener.batched=!1},cc.prototype.close=function(){this.listener.batched=!0},cc.prototype.createDocumentElement=function(){var e=this;if(!this.documentElement){var t=new Zu("document");t.docId=this.id,t.ownerDocument=this,t.role="documentElement",t.depth=0,t.ref="_documentElement",this.nodeMap._documentElement=t,this.documentElement=t,Object.defineProperty(t,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(t){tn(e,t)}}),Object.defineProperty(t,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(t,n){tn(e,t,n)}})}return this.documentElement},cc.prototype.createBody=function(e,t){if(!this.body){rn(this,new Zu(e,t))}return this.body},cc.prototype.createElement=function(e,t){return new Zu(e,t)},cc.prototype.createComment=function(e){return new ac(e)},cc.prototype.fireEvent=function(e,t,n,r,o){if(e){n=n||{},n.type=t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&Nn(e,r);var i="true"===this.getRef("_root").attr.bubble;return e.fireEvent(t,n,i,o)}},cc.prototype.destroy=function(){this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,Yt(this.id)},cc.handler=null;var lc={Document:cc,Element:Zu,Comment:ac,Listener:sc,TaskCenter:Yu,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)}};cc.handler=lc.sendTasks;var fc={setNativeConsole:Mt,resetNativeConsole:$t,setNativeTimer:Lt,resetNativeTimer:Wt,service:{register:vn,unregister:yn,has:mn},freezePrototype:Pn,init:kn,config:lc},pc={},dc={};$n.prototype.postMessage=function(e){var t=this;if(this._closed)throw new Error('BroadcastChannel "'+this.name+'" is closed.');var n=pc[this.name];if(n&&n.length)for(var r=0;r<n.length;++r){var o=n[r];o._closed||o===t||"function"==typeof o.onmessage&&o.onmessage(new Mn("message",{data:e}))}},$n.prototype.close=function(){var e=this;if(!this._closed&&(this._closed=!0,pc[this.name])){var t=pc[this.name].filter(function(t){return t!==e});t.length?pc[this.name]=t:delete pc[this.name]}};var hc={create:function(e,t,n){if(dc[e]=[],"function"==typeof global.BroadcastChannel)return{};var r={BroadcastChannel:function(t){Object.defineProperty(this,"name",{configurable:!1,enumerable:!0,writable:!1,value:String(t)}),this._closed=!1,this.onmessage=null,pc[this.name]||(pc[this.name]=[]),pc[this.name].push(this),dc[e].push(this)}};return r.BroadcastChannel.prototype=$n.prototype,{instance:r}},destroy:function(e,t){dc[e].forEach(function(e){return e.close()}),delete dc[e]}},vc={BroadcastChannel:hc},yc=Object.freeze({$userTrack:Rn,$sendMtop:Dn,$callWindvane:Fn,$setSpm:Ln,$getUserInfo:Wn,$login:Un,$logout:Vn});!function(e){var t=fc.init,n=fc.config;n.frameworks=e;var r=Hr.native,o=Hr.transformer;for(var i in vc)fc.service.register(i,vc[i]);fc.freezePrototype(),fc.setNativeConsole(),global.frameworkVersion=r,global.transformerVersion=o;var a=t(n);for(var s in a)!function(e){global[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=a[e].apply(a,t);return r instanceof Error&&console.error(r.toString()),r}}(s)}(Jr),global.registerMethods(yc)});
