You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ac...@apache.org on 2017/08/10 07:36:21 UTC

[08/12] incubator-weex git commit: * [jsfm] publish weex-js-runtime@0.21.8

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a7266a2c/packages/weex-js-runtime/index.js
----------------------------------------------------------------------
diff --git a/packages/weex-js-runtime/index.js b/packages/weex-js-runtime/index.js
index ff5f91a..c765528 100644
--- a/packages/weex-js-runtime/index.js
+++ b/packages/weex-js-runtime/index.js
@@ -1,6 +1,6 @@
-/* 'WEEX JS RUNTIME 0.20.6, Build 2017-08-01 19:09. */
+/* 'WEEX JS RUNTIME 0.21.8, Build 2017-08-10 14:46. */
 
-;(this.getJSFMVersion = function(){return "0.20.6"});
+;(this.getJSFMVersion = function(){return "0.21.8"});
 var global = this, process = { env: {} };var setTimeout = global.setTimeout;
 
 (function (global, factory) {
@@ -128,76 +128,79 @@ function createCommonjsModule(fn, module) {
 var _global = createCommonjsModule(function (module) {
 // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
 var global = module.exports = typeof window != 'undefined' && window.Math == Math
-  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
-if(typeof __g == 'number'){ __g = global; } // eslint-disable-line no-undef
+  ? window : typeof self != 'undefined' && self.Math == Math ? self
+  // eslint-disable-next-line no-new-func
+  : Function('return this')();
+if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
 });
 
 var _core = createCommonjsModule(function (module) {
-var core = module.exports = {version: '2.4.0'};
-if(typeof __e == 'number'){ __e = core; } // eslint-disable-line no-undef
+var core = module.exports = { version: '2.5.0' };
+if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
 });
 
-var _isObject = function(it){
+var _isObject = function (it) {
   return typeof it === 'object' ? it !== null : typeof it === 'function';
 };
 
 var isObject = _isObject;
-var _anObject = function(it){
-  if(!isObject(it)){ throw TypeError(it + ' is not an object!'); }
+var _anObject = function (it) {
+  if (!isObject(it)) { throw TypeError(it + ' is not an object!'); }
   return it;
 };
 
-var _fails = function(exec){
+var _fails = function (exec) {
   try {
     return !!exec();
-  } catch(e){
+  } catch (e) {
     return true;
   }
 };
 
 // Thank's IE8 for his funny defineProperty
-var _descriptors = !_fails(function(){
-  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
+var _descriptors = !_fails(function () {
+  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
 });
 
 var isObject$1 = _isObject;
 var document$1 = _global.document;
+// typeof document.createElement is 'object' in old IE
 var is = isObject$1(document$1) && isObject$1(document$1.createElement);
-var _domCreate = function(it){
+var _domCreate = function (it) {
   return is ? document$1.createElement(it) : {};
 };
 
-var _ie8DomDefine = !_descriptors && !_fails(function(){
-  return Object.defineProperty(_domCreate('div'), 'a', {get: function(){ return 7; }}).a != 7;
+var _ie8DomDefine = !_descriptors && !_fails(function () {
+  return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
 });
 
 // 7.1.1 ToPrimitive(input [, PreferredType])
 var isObject$2 = _isObject;
 // instead of the ES6 spec version, we didn't implement @@toPrimitive case
 // and the second argument - flag - preferred type is a string
-var _toPrimitive = function(it, S){
-  if(!isObject$2(it)){ return it; }
+var _toPrimitive = function (it, S) {
+  if (!isObject$2(it)) { return it; }
   var fn, val;
-  if(S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
-  if(typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
-  if(!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
+  if (S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
+  if (typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
   throw TypeError("Can't convert object to primitive value");
 };
 
-var anObject       = _anObject;
+var anObject = _anObject;
 var IE8_DOM_DEFINE = _ie8DomDefine;
-var toPrimitive    = _toPrimitive;
-var dP$1             = Object.defineProperty;
+var toPrimitive = _toPrimitive;
+var dP$1 = Object.defineProperty;
 
-var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes){
+var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
   anObject(O);
   P = toPrimitive(P, true);
   anObject(Attributes);
-  if(IE8_DOM_DEFINE){ try {
+  if (IE8_DOM_DEFINE) { try {
     return dP$1(O, P, Attributes);
-  } catch(e){ /* empty */ } }
-  if('get' in Attributes || 'set' in Attributes){ throw TypeError('Accessors not supported!'); }
-  if('value' in Attributes){ O[P] = Attributes.value; }
+  } catch (e) { /* empty */ } }
+  if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
+  if ('value' in Attributes) { O[P] = Attributes.value; }
   return O;
 };
 
@@ -205,115 +208,114 @@ var _objectDp = {
 	f: f
 };
 
-var _propertyDesc = function(bitmap, value){
+var _propertyDesc = function (bitmap, value) {
   return {
-    enumerable  : !(bitmap & 1),
+    enumerable: !(bitmap & 1),
     configurable: !(bitmap & 2),
-    writable    : !(bitmap & 4),
-    value       : value
+    writable: !(bitmap & 4),
+    value: value
   };
 };
 
-var dP         = _objectDp;
+var dP = _objectDp;
 var createDesc = _propertyDesc;
-var _hide = _descriptors ? function(object, key, value){
+var _hide = _descriptors ? function (object, key, value) {
   return dP.f(object, key, createDesc(1, value));
-} : function(object, key, value){
+} : function (object, key, value) {
   object[key] = value;
   return object;
 };
 
 var hasOwnProperty = {}.hasOwnProperty;
-var _has = function(it, key){
+var _has = function (it, key) {
   return hasOwnProperty.call(it, key);
 };
 
 var id = 0;
 var px = Math.random();
-var _uid = function(key){
+var _uid = function (key) {
   return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
 };
 
 var _redefine = createCommonjsModule(function (module) {
-var global    = _global
-  , hide      = _hide
-  , has       = _has
-  , SRC       = _uid('src')
-  , TO_STRING = 'toString'
-  , $toString = Function[TO_STRING]
-  , TPL       = ('' + $toString).split(TO_STRING);
-
-_core.inspectSource = function(it){
+var global = _global;
+var hide = _hide;
+var has = _has;
+var SRC = _uid('src');
+var TO_STRING = 'toString';
+var $toString = Function[TO_STRING];
+var TPL = ('' + $toString).split(TO_STRING);
+
+_core.inspectSource = function (it) {
   return $toString.call(it);
 };
 
-(module.exports = function(O, key, val, safe){
+(module.exports = function (O, key, val, safe) {
   var isFunction = typeof val == 'function';
-  if(isFunction){ has(val, 'name') || hide(val, 'name', key); }
-  if(O[key] === val){ return; }
-  if(isFunction){ has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
-  if(O === global){
+  if (isFunction) { has(val, 'name') || hide(val, 'name', key); }
+  if (O[key] === val) { return; }
+  if (isFunction) { has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
+  if (O === global) {
+    O[key] = val;
+  } else if (!safe) {
+    delete O[key];
+    hide(O, key, val);
+  } else if (O[key]) {
     O[key] = val;
   } else {
-    if(!safe){
-      delete O[key];
-      hide(O, key, val);
-    } else {
-      if(O[key]){ O[key] = val; }
-      else { hide(O, key, val); }
-    }
+    hide(O, key, val);
   }
 // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
-})(Function.prototype, TO_STRING, function toString(){
+})(Function.prototype, TO_STRING, function toString() {
   return typeof this == 'function' && this[SRC] || $toString.call(this);
 });
 });
 
-var _aFunction = function(it){
-  if(typeof it != 'function'){ throw TypeError(it + ' is not a function!'); }
+var _aFunction = function (it) {
+  if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
   return it;
 };
 
 // optional / simple context binding
 var aFunction = _aFunction;
-var _ctx = function(fn, that, length){
+var _ctx = function (fn, that, length) {
   aFunction(fn);
-  if(that === undefined){ return fn; }
-  switch(length){
-    case 1: return function(a){
+  if (that === undefined) { return fn; }
+  switch (length) {
+    case 1: return function (a) {
       return fn.call(that, a);
     };
-    case 2: return function(a, b){
+    case 2: return function (a, b) {
       return fn.call(that, a, b);
     };
-    case 3: return function(a, b, c){
+    case 3: return function (a, b, c) {
       return fn.call(that, a, b, c);
     };
   }
-  return function(/* ...args */){
+  return function (/* ...args */) {
     return fn.apply(that, arguments);
   };
 };
 
-var global$1    = _global;
-var core      = _core;
-var hide      = _hide;
-var redefine  = _redefine;
-var ctx       = _ctx;
+var global$1 = _global;
+var core = _core;
+var hide = _hide;
+var redefine = _redefine;
+var ctx = _ctx;
 var PROTOTYPE = 'prototype';
 
-var $export$1 = function(type, name, source){
-  var IS_FORCED = type & $export$1.F
-    , IS_GLOBAL = type & $export$1.G
-    , IS_STATIC = type & $export$1.S
-    , IS_PROTO  = type & $export$1.P
-    , IS_BIND   = type & $export$1.B
-    , target    = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE]
-    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})
-    , expProto  = exports[PROTOTYPE] || (exports[PROTOTYPE] = {})
-    , key, own, out, exp;
-  if(IS_GLOBAL){ source = name; }
-  for(key in source){
+var $export$1 = function (type, name, source) {
+  var IS_FORCED = type & $export$1.F;
+  var IS_GLOBAL = type & $export$1.G;
+  var IS_STATIC = type & $export$1.S;
+  var IS_PROTO = type & $export$1.P;
+  var IS_BIND = type & $export$1.B;
+  var target = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE];
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+  var key, own, out, exp;
+  if (IS_GLOBAL) { source = name; }
+  for (key in source) {
     // contains in native
     own = !IS_FORCED && target && target[key] !== undefined;
     // export native or passed
@@ -321,10 +323,10 @@ var $export$1 = function(type, name, source){
     // bind timers to global for call from export context
     exp = IS_BIND && own ? ctx(out, global$1) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
     // extend global
-    if(target){ redefine(target, key, out, type & $export$1.U); }
+    if (target) { redefine(target, key, out, type & $export$1.U); }
     // export
-    if(exports[key] != out){ hide(exports, key, exp); }
-    if(IS_PROTO && expProto[key] != out){ expProto[key] = out; }
+    if (exports[key] != out) { hide(exports, key, exp); }
+    if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
   }
 };
 global$1.core = core;
@@ -336,52 +338,53 @@ $export$1.P = 8;   // proto
 $export$1.B = 16;  // bind
 $export$1.W = 32;  // wrap
 $export$1.U = 64;  // safe
-$export$1.R = 128; // real proto method for `library` 
+$export$1.R = 128; // real proto method for `library`
 var _export = $export$1;
 
 var toString$1 = {}.toString;
 
-var _cof = function(it){
+var _cof = function (it) {
   return toString$1.call(it).slice(8, -1);
 };
 
 // fallback for non-array-like ES3 and non-enumerable old V8 strings
 var cof = _cof;
-var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function(it){
+// eslint-disable-next-line no-prototype-builtins
+var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
   return cof(it) == 'String' ? it.split('') : Object(it);
 };
 
 // 7.2.1 RequireObjectCoercible(argument)
-var _defined = function(it){
-  if(it == undefined){ throw TypeError("Can't call method on  " + it); }
+var _defined = function (it) {
+  if (it == undefined) { throw TypeError("Can't call method on  " + it); }
   return it;
 };
 
 // to indexed object, toObject with fallback for non-array-like ES3 strings
 var IObject$1 = _iobject;
 var defined = _defined;
-var _toIobject = function(it){
+var _toIobject = function (it) {
   return IObject$1(defined(it));
 };
 
 // 7.1.4 ToInteger
-var ceil  = Math.ceil;
+var ceil = Math.ceil;
 var floor = Math.floor;
-var _toInteger = function(it){
+var _toInteger = function (it) {
   return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
 };
 
 // 7.1.15 ToLength
 var toInteger = _toInteger;
-var min       = Math.min;
-var _toLength = function(it){
+var min = Math.min;
+var _toLength = function (it) {
   return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
 };
 
 var toInteger$1 = _toInteger;
-var max       = Math.max;
-var min$1       = Math.min;
-var _toIndex = function(index, length){
+var max = Math.max;
+var min$1 = Math.min;
+var _toAbsoluteIndex = function (index, length) {
   index = toInteger$1(index);
   return index < 0 ? max(index + length, 0) : min$1(index, length);
 };
@@ -389,51 +392,53 @@ var _toIndex = function(index, length){
 // false -> Array#indexOf
 // true  -> Array#includes
 var toIObject$1 = _toIobject;
-var toLength  = _toLength;
-var toIndex   = _toIndex;
-var _arrayIncludes = function(IS_INCLUDES){
-  return function($this, el, fromIndex){
-    var O      = toIObject$1($this)
-      , length = toLength(O.length)
-      , index  = toIndex(fromIndex, length)
-      , value;
+var toLength = _toLength;
+var toAbsoluteIndex = _toAbsoluteIndex;
+var _arrayIncludes = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject$1($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
     // Array#includes uses SameValueZero equality algorithm
-    if(IS_INCLUDES && el != el){ while(length > index){
+    // eslint-disable-next-line no-self-compare
+    if (IS_INCLUDES && el != el) { while (length > index) {
       value = O[index++];
-      if(value != value){ return true; }
-    // Array#toIndex ignores holes, Array#includes - not
-    } } else { for(;length > index; index++){ if(IS_INCLUDES || index in O){
-      if(O[index] === el){ return IS_INCLUDES || index || 0; }
+      // eslint-disable-next-line no-self-compare
+      if (value != value) { return true; }
+    // Array#indexOf ignores holes, Array#includes - not
+    } } else { for (;length > index; index++) { if (IS_INCLUDES || index in O) {
+      if (O[index] === el) { return IS_INCLUDES || index || 0; }
     } } } return !IS_INCLUDES && -1;
   };
 };
 
 var global$2 = _global;
 var SHARED = '__core-js_shared__';
-var store  = global$2[SHARED] || (global$2[SHARED] = {});
-var _shared = function(key){
+var store = global$2[SHARED] || (global$2[SHARED] = {});
+var _shared = function (key) {
   return store[key] || (store[key] = {});
 };
 
 var shared = _shared('keys');
-var uid    = _uid;
-var _sharedKey = function(key){
+var uid = _uid;
+var _sharedKey = function (key) {
   return shared[key] || (shared[key] = uid(key));
 };
 
-var has          = _has;
-var toIObject    = _toIobject;
+var has = _has;
+var toIObject = _toIobject;
 var arrayIndexOf = _arrayIncludes(false);
-var IE_PROTO     = _sharedKey('IE_PROTO');
-
-var _objectKeysInternal = function(object, names){
-  var O      = toIObject(object)
-    , i      = 0
-    , result = []
-    , key;
-  for(key in O){ if(key != IE_PROTO){ has(O, key) && result.push(key); } }
+var IE_PROTO = _sharedKey('IE_PROTO');
+
+var _objectKeysInternal = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) { if (key != IE_PROTO) { has(O, key) && result.push(key); } }
   // Don't enum bug & hidden keys
-  while(names.length > i){ if(has(O, key = names[i++])){
+  while (names.length > i) { if (has(O, key = names[i++])) {
     ~arrayIndexOf(result, key) || result.push(key);
   } }
   return result;
@@ -445,10 +450,10 @@ var _enumBugKeys = (
 ).split(',');
 
 // 19.1.2.14 / 15.2.3.14 Object.keys(O)
-var $keys       = _objectKeysInternal;
+var $keys = _objectKeysInternal;
 var enumBugKeys = _enumBugKeys;
 
-var _objectKeys = Object.keys || function keys(O){
+var _objectKeys = Object.keys || function keys(O) {
   return $keys(O, enumBugKeys);
 };
 
@@ -466,49 +471,50 @@ var _objectPie = {
 
 // 7.1.13 ToObject(argument)
 var defined$1 = _defined;
-var _toObject = function(it){
+var _toObject = function (it) {
   return Object(defined$1(it));
 };
 
 // 19.1.2.1 Object.assign(target, source, ...)
-var getKeys  = _objectKeys;
-var gOPS     = _objectGops;
-var pIE      = _objectPie;
+var getKeys = _objectKeys;
+var gOPS = _objectGops;
+var pIE = _objectPie;
 var toObject = _toObject;
-var IObject  = _iobject;
-var $assign  = Object.assign;
+var IObject = _iobject;
+var $assign = Object.assign;
 
 // should work with symbols and should have deterministic property order (V8 bug)
-var _objectAssign = !$assign || _fails(function(){
-  var A = {}
-    , B = {}
-    , S = Symbol()
-    , K = 'abcdefghijklmnopqrst';
+var _objectAssign = !$assign || _fails(function () {
+  var A = {};
+  var B = {};
+  // eslint-disable-next-line no-undef
+  var S = Symbol();
+  var K = 'abcdefghijklmnopqrst';
   A[S] = 7;
-  K.split('').forEach(function(k){ B[k] = k; });
+  K.split('').forEach(function (k) { B[k] = k; });
   return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
-}) ? function assign(target, source){
+}) ? function assign(target, source) {
   var arguments$1 = arguments;
  // eslint-disable-line no-unused-vars
-  var T     = toObject(target)
-    , aLen  = arguments.length
-    , index = 1
-    , getSymbols = gOPS.f
-    , isEnum     = pIE.f;
-  while(aLen > index){
-    var S      = IObject(arguments$1[index++])
-      , keys   = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)
-      , length = keys.length
-      , j      = 0
-      , key;
-    while(length > j){ if(isEnum.call(S, key = keys[j++])){ T[key] = S[key]; } }
+  var T = toObject(target);
+  var aLen = arguments.length;
+  var index = 1;
+  var getSymbols = gOPS.f;
+  var isEnum = pIE.f;
+  while (aLen > index) {
+    var S = IObject(arguments$1[index++]);
+    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
+    var length = keys.length;
+    var j = 0;
+    var key;
+    while (length > j) { if (isEnum.call(S, key = keys[j++])) { T[key] = S[key]; } }
   } return T;
 } : $assign;
 
 // 19.1.3.1 Object.assign(target, source)
 var $export = _export;
 
-$export($export.S + $export.F, 'Object', {assign: _objectAssign});
+$export($export.S + $export.F, 'Object', { assign: _objectAssign });
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -635,12 +641,12 @@ if (WXEnvironment && WXEnvironment.platform === 'iOS') {
 }
 
 var _wks = createCommonjsModule(function (module) {
-var store      = _shared('wks')
-  , uid        = _uid
-  , Symbol     = _global.Symbol
-  , USE_SYMBOL = typeof Symbol == 'function';
+var store = _shared('wks');
+var uid = _uid;
+var Symbol = _global.Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
 
-var $exports = module.exports = function(name){
+var $exports = module.exports = function (name) {
   return store[name] || (store[name] =
     USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
 };
@@ -651,16 +657,17 @@ $exports.store = store;
 // getting tag from 19.1.3.6 Object.prototype.toString()
 var cof$1 = _cof;
 var TAG = _wks('toStringTag');
-var ARG = cof$1(function(){ return arguments; }()) == 'Arguments';
+// ES3 wrong here
+var ARG = cof$1(function () { return arguments; }()) == 'Arguments';
 
 // fallback for IE11 Script Access Denied error
-var tryGet = function(it, key){
+var tryGet = function (it, key) {
   try {
     return it[key];
-  } catch(e){ /* empty */ }
+  } catch (e) { /* empty */ }
 };
 
-var _classof = function(it){
+var _classof = function (it) {
   var O, T, B;
   return it === undefined ? 'Undefined' : it === null ? 'Null'
     // @@toStringTag case
@@ -673,25 +680,25 @@ var _classof = function(it){
 
 // 19.1.3.6 Object.prototype.toString()
 var classof = _classof;
-var test    = {};
+var test = {};
 test[_wks('toStringTag')] = 'z';
-if(test + '' != '[object z]'){
-  _redefine(Object.prototype, 'toString', function toString(){
+if (test + '' != '[object z]') {
+  _redefine(Object.prototype, 'toString', function toString() {
     return '[object ' + classof(this) + ']';
   }, true);
 }
 
 var toInteger$2 = _toInteger;
-var defined$2   = _defined;
+var defined$2 = _defined;
 // true  -> String#at
 // false -> String#codePointAt
-var _stringAt = function(TO_STRING){
-  return function(that, pos){
-    var s = String(defined$2(that))
-      , i = toInteger$2(pos)
-      , l = s.length
-      , a, b;
-    if(i < 0 || i >= l){ return TO_STRING ? '' : undefined; }
+var _stringAt = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined$2(that));
+    var i = toInteger$2(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
     a = s.charCodeAt(i);
     return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
       ? TO_STRING ? s.charAt(i) : a
@@ -703,38 +710,39 @@ var _library = false;
 
 var _iterators = {};
 
-var dP$2       = _objectDp;
+var dP$2 = _objectDp;
 var anObject$2 = _anObject;
-var getKeys$1  = _objectKeys;
+var getKeys$1 = _objectKeys;
 
-var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties){
+var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
   anObject$2(O);
-  var keys   = getKeys$1(Properties)
-    , length = keys.length
-    , i = 0
-    , P;
-  while(length > i){ dP$2.f(O, P = keys[i++], Properties[P]); }
+  var keys = getKeys$1(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) { dP$2.f(O, P = keys[i++], Properties[P]); }
   return O;
 };
 
-var _html = _global.document && document.documentElement;
+var document$2 = _global.document;
+var _html = document$2 && document$2.documentElement;
 
 // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
-var anObject$1    = _anObject;
-var dPs         = _objectDps;
+var anObject$1 = _anObject;
+var dPs = _objectDps;
 var enumBugKeys$1 = _enumBugKeys;
-var IE_PROTO$1    = _sharedKey('IE_PROTO');
-var Empty       = function(){ /* empty */ };
-var PROTOTYPE$1   = 'prototype';
+var IE_PROTO$1 = _sharedKey('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE$1 = 'prototype';
 
 // Create object with fake `null` prototype: use iframe Object with cleared prototype
-var createDict = function(){
+var createDict = function () {
   // Thrash, waste and sodomy: IE GC bug
-  var iframe = _domCreate('iframe')
-    , i      = enumBugKeys$1.length
-    , lt     = '<'
-    , gt     = '>'
-    , iframeDocument;
+  var iframe = _domCreate('iframe');
+  var i = enumBugKeys$1.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
   iframe.style.display = 'none';
   _html.appendChild(iframe);
   iframe.src = 'javascript:'; // eslint-disable-line no-script-url
@@ -745,15 +753,15 @@ var createDict = function(){
   iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
   iframeDocument.close();
   createDict = iframeDocument.F;
-  while(i--){ delete createDict[PROTOTYPE$1][enumBugKeys$1[i]]; }
+  while (i--) { delete createDict[PROTOTYPE$1][enumBugKeys$1[i]]; }
   return createDict();
 };
 
-var _objectCreate = Object.create || function create(O, Properties){
+var _objectCreate = Object.create || function create(O, Properties) {
   var result;
-  if(O !== null){
+  if (O !== null) {
     Empty[PROTOTYPE$1] = anObject$1(O);
-    result = new Empty;
+    result = new Empty();
     Empty[PROTOTYPE$1] = null;
     // add "__proto__" for Object.getPrototypeOf polyfill
     result[IE_PROTO$1] = O;
@@ -765,160 +773,160 @@ var def = _objectDp.f;
 var has$2 = _has;
 var TAG$1 = _wks('toStringTag');
 
-var _setToStringTag = function(it, tag, stat){
-  if(it && !has$2(it = stat ? it : it.prototype, TAG$1)){ def(it, TAG$1, {configurable: true, value: tag}); }
+var _setToStringTag = function (it, tag, stat) {
+  if (it && !has$2(it = stat ? it : it.prototype, TAG$1)) { def(it, TAG$1, { configurable: true, value: tag }); }
 };
 
-var create$1         = _objectCreate;
-var descriptor     = _propertyDesc;
+var create$1 = _objectCreate;
+var descriptor = _propertyDesc;
 var setToStringTag$1 = _setToStringTag;
 var IteratorPrototype = {};
 
 // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
-_hide(IteratorPrototype, _wks('iterator'), function(){ return this; });
+_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
 
-var _iterCreate = function(Constructor, NAME, next){
-  Constructor.prototype = create$1(IteratorPrototype, {next: descriptor(1, next)});
+var _iterCreate = function (Constructor, NAME, next) {
+  Constructor.prototype = create$1(IteratorPrototype, { next: descriptor(1, next) });
   setToStringTag$1(Constructor, NAME + ' Iterator');
 };
 
 // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
-var has$3         = _has;
-var toObject$1    = _toObject;
-var IE_PROTO$2    = _sharedKey('IE_PROTO');
+var has$3 = _has;
+var toObject$1 = _toObject;
+var IE_PROTO$2 = _sharedKey('IE_PROTO');
 var ObjectProto = Object.prototype;
 
-var _objectGpo = Object.getPrototypeOf || function(O){
+var _objectGpo = Object.getPrototypeOf || function (O) {
   O = toObject$1(O);
-  if(has$3(O, IE_PROTO$2)){ return O[IE_PROTO$2]; }
-  if(typeof O.constructor == 'function' && O instanceof O.constructor){
+  if (has$3(O, IE_PROTO$2)) { return O[IE_PROTO$2]; }
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
     return O.constructor.prototype;
   } return O instanceof Object ? ObjectProto : null;
 };
 
-var LIBRARY        = _library;
-var $export$2        = _export;
-var redefine$1       = _redefine;
-var hide$1           = _hide;
-var has$1            = _has;
-var Iterators      = _iterators;
-var $iterCreate    = _iterCreate;
+var LIBRARY = _library;
+var $export$2 = _export;
+var redefine$1 = _redefine;
+var hide$1 = _hide;
+var has$1 = _has;
+var Iterators = _iterators;
+var $iterCreate = _iterCreate;
 var setToStringTag = _setToStringTag;
 var getPrototypeOf = _objectGpo;
-var ITERATOR       = _wks('iterator');
-var BUGGY          = !([].keys && 'next' in [].keys());
-var FF_ITERATOR    = '@@iterator';
-var KEYS           = 'keys';
-var VALUES         = 'values';
+var ITERATOR = _wks('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
 
-var returnThis = function(){ return this; };
+var returnThis = function () { return this; };
 
-var _iterDefine = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
+var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
   $iterCreate(Constructor, NAME, next);
-  var getMethod = function(kind){
-    if(!BUGGY && kind in proto){ return proto[kind]; }
-    switch(kind){
-      case KEYS: return function keys(){ return new Constructor(this, kind); };
-      case VALUES: return function values(){ return new Constructor(this, kind); };
-    } return function entries(){ return new Constructor(this, kind); };
+  var getMethod = function (kind) {
+    if (!BUGGY && kind in proto) { return proto[kind]; }
+    switch (kind) {
+      case KEYS: return function keys() { return new Constructor(this, kind); };
+      case VALUES: return function values() { return new Constructor(this, kind); };
+    } return function entries() { return new Constructor(this, kind); };
   };
-  var TAG        = NAME + ' Iterator'
-    , DEF_VALUES = DEFAULT == VALUES
-    , VALUES_BUG = false
-    , proto      = Base.prototype
-    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
-    , $default   = $native || getMethod(DEFAULT)
-    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
-    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native
-    , methods, key, IteratorPrototype;
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
   // Fix native
-  if($anyNative){
-    IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
-    if(IteratorPrototype !== Object.prototype){
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
       // Set @@toStringTag to native iterators
       setToStringTag(IteratorPrototype, TAG, true);
       // fix for some old engines
-      if(!LIBRARY && !has$1(IteratorPrototype, ITERATOR)){ hide$1(IteratorPrototype, ITERATOR, returnThis); }
+      if (!LIBRARY && !has$1(IteratorPrototype, ITERATOR)) { hide$1(IteratorPrototype, ITERATOR, returnThis); }
     }
   }
   // fix Array#{values, @@iterator}.name in V8 / FF
-  if(DEF_VALUES && $native && $native.name !== VALUES){
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
     VALUES_BUG = true;
-    $default = function values(){ return $native.call(this); };
+    $default = function values() { return $native.call(this); };
   }
   // Define iterator
-  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
     hide$1(proto, ITERATOR, $default);
   }
   // Plug for library
   Iterators[NAME] = $default;
-  Iterators[TAG]  = returnThis;
-  if(DEFAULT){
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
     methods = {
-      values:  DEF_VALUES ? $default : getMethod(VALUES),
-      keys:    IS_SET     ? $default : getMethod(KEYS),
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
       entries: $entries
     };
-    if(FORCED){ for(key in methods){
-      if(!(key in proto)){ redefine$1(proto, key, methods[key]); }
+    if (FORCED) { for (key in methods) {
+      if (!(key in proto)) { redefine$1(proto, key, methods[key]); }
     } } else { $export$2($export$2.P + $export$2.F * (BUGGY || VALUES_BUG), NAME, methods); }
   }
   return methods;
 };
 
-var $at  = _stringAt(true);
+var $at = _stringAt(true);
 
 // 21.1.3.27 String.prototype[@@iterator]()
-_iterDefine(String, 'String', function(iterated){
+_iterDefine(String, 'String', function (iterated) {
   this._t = String(iterated); // target
   this._i = 0;                // next index
 // 21.1.5.2.1 %StringIteratorPrototype%.next()
-}, function(){
-  var O     = this._t
-    , index = this._i
-    , point;
-  if(index >= O.length){ return {value: undefined, done: true}; }
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) { return { value: undefined, done: true }; }
   point = $at(O, index);
   this._i += point.length;
-  return {value: point, done: false};
+  return { value: point, done: false };
 });
 
 // 22.1.3.31 Array.prototype[@@unscopables]
 var UNSCOPABLES = _wks('unscopables');
-var ArrayProto  = Array.prototype;
-if(ArrayProto[UNSCOPABLES] == undefined){ _hide(ArrayProto, UNSCOPABLES, {}); }
-var _addToUnscopables = function(key){
+var ArrayProto = Array.prototype;
+if (ArrayProto[UNSCOPABLES] == undefined) { _hide(ArrayProto, UNSCOPABLES, {}); }
+var _addToUnscopables = function (key) {
   ArrayProto[UNSCOPABLES][key] = true;
 };
 
-var _iterStep = function(done, value){
-  return {value: value, done: !!done};
+var _iterStep = function (done, value) {
+  return { value: value, done: !!done };
 };
 
 var addToUnscopables = _addToUnscopables;
-var step             = _iterStep;
-var Iterators$2        = _iterators;
-var toIObject$2        = _toIobject;
+var step = _iterStep;
+var Iterators$2 = _iterators;
+var toIObject$2 = _toIobject;
 
 // 22.1.3.4 Array.prototype.entries()
 // 22.1.3.13 Array.prototype.keys()
 // 22.1.3.29 Array.prototype.values()
 // 22.1.3.30 Array.prototype[@@iterator]()
-var es6_array_iterator = _iterDefine(Array, 'Array', function(iterated, kind){
+var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
   this._t = toIObject$2(iterated); // target
   this._i = 0;                   // next index
   this._k = kind;                // kind
 // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
-}, function(){
-  var O     = this._t
-    , kind  = this._k
-    , index = this._i++;
-  if(!O || index >= O.length){
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
     this._t = undefined;
     return step(1);
   }
-  if(kind == 'keys'  ){ return step(0, index); }
-  if(kind == 'values'){ return step(0, O[index]); }
+  if (kind == 'keys') { return step(0, index); }
+  if (kind == 'values') { return step(0, O[index]); }
   return step(0, [index, O[index]]);
 }, 'values');
 
@@ -929,107 +937,144 @@ addToUnscopables('keys');
 addToUnscopables('values');
 addToUnscopables('entries');
 
-var $iterators    = es6_array_iterator;
-var redefine$2      = _redefine;
-var global$3        = _global;
-var hide$2          = _hide;
-var Iterators$1     = _iterators;
-var wks           = _wks;
-var ITERATOR$1      = wks('iterator');
+var $iterators = es6_array_iterator;
+var getKeys$2 = _objectKeys;
+var redefine$2 = _redefine;
+var global$3 = _global;
+var hide$2 = _hide;
+var Iterators$1 = _iterators;
+var wks = _wks;
+var ITERATOR$1 = wks('iterator');
 var TO_STRING_TAG = wks('toStringTag');
-var ArrayValues   = Iterators$1.Array;
-
-for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
-  var NAME       = collections[i]
-    , Collection = global$3[NAME]
-    , proto      = Collection && Collection.prototype
-    , key;
-  if(proto){
-    if(!proto[ITERATOR$1]){ hide$2(proto, ITERATOR$1, ArrayValues); }
-    if(!proto[TO_STRING_TAG]){ hide$2(proto, TO_STRING_TAG, NAME); }
+var ArrayValues = Iterators$1.Array;
+
+var DOMIterables = {
+  CSSRuleList: true, // TODO: Not spec compliant, should be false.
+  CSSStyleDeclaration: false,
+  CSSValueList: false,
+  ClientRectList: false,
+  DOMRectList: false,
+  DOMStringList: false,
+  DOMTokenList: true,
+  DataTransferItemList: false,
+  FileList: false,
+  HTMLAllCollection: false,
+  HTMLCollection: false,
+  HTMLFormElement: false,
+  HTMLSelectElement: false,
+  MediaList: true, // TODO: Not spec compliant, should be false.
+  MimeTypeArray: false,
+  NamedNodeMap: false,
+  NodeList: true,
+  PaintRequestList: false,
+  Plugin: false,
+  PluginArray: false,
+  SVGLengthList: false,
+  SVGNumberList: false,
+  SVGPathSegList: false,
+  SVGPointList: false,
+  SVGStringList: false,
+  SVGTransformList: false,
+  SourceBufferList: false,
+  StyleSheetList: true, // TODO: Not spec compliant, should be false.
+  TextTrackCueList: false,
+  TextTrackList: false,
+  TouchList: false
+};
+
+for (var collections = getKeys$2(DOMIterables), i = 0; i < collections.length; i++) {
+  var NAME = collections[i];
+  var explicit = DOMIterables[NAME];
+  var Collection = global$3[NAME];
+  var proto = Collection && Collection.prototype;
+  var key;
+  if (proto) {
+    if (!proto[ITERATOR$1]) { hide$2(proto, ITERATOR$1, ArrayValues); }
+    if (!proto[TO_STRING_TAG]) { hide$2(proto, TO_STRING_TAG, NAME); }
     Iterators$1[NAME] = ArrayValues;
-    for(key in $iterators){ if(!proto[key]){ redefine$2(proto, key, $iterators[key], true); } }
+    if (explicit) { for (key in $iterators) { if (!proto[key]) { redefine$2(proto, key, $iterators[key], true); } } }
   }
 }
 
-var _anInstance = function(it, Constructor, name, forbiddenField){
-  if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){
+var _anInstance = function (it, Constructor, name, forbiddenField) {
+  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
     throw TypeError(name + ': incorrect invocation!');
   } return it;
 };
 
 // call something on iterator step with safe closing on error
 var anObject$3 = _anObject;
-var _iterCall = function(iterator, fn, value, entries){
+var _iterCall = function (iterator, fn, value, entries) {
   try {
     return entries ? fn(anObject$3(value)[0], value[1]) : fn(value);
   // 7.4.6 IteratorClose(iterator, completion)
-  } catch(e){
+  } catch (e) {
     var ret = iterator['return'];
-    if(ret !== undefined){ anObject$3(ret.call(iterator)); }
+    if (ret !== undefined) { anObject$3(ret.call(iterator)); }
     throw e;
   }
 };
 
 // check on default Array iterator
-var Iterators$3  = _iterators;
-var ITERATOR$2   = _wks('iterator');
+var Iterators$3 = _iterators;
+var ITERATOR$2 = _wks('iterator');
 var ArrayProto$1 = Array.prototype;
 
-var _isArrayIter = function(it){
+var _isArrayIter = function (it) {
   return it !== undefined && (Iterators$3.Array === it || ArrayProto$1[ITERATOR$2] === it);
 };
 
-var classof$2   = _classof;
-var ITERATOR$3  = _wks('iterator');
+var classof$2 = _classof;
+var ITERATOR$3 = _wks('iterator');
 var Iterators$4 = _iterators;
-var core_getIteratorMethod = _core.getIteratorMethod = function(it){
-  if(it != undefined){ return it[ITERATOR$3]
+var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
+  if (it != undefined) { return it[ITERATOR$3]
     || it['@@iterator']
     || Iterators$4[classof$2(it)]; }
 };
 
 var _forOf = createCommonjsModule(function (module) {
-var ctx         = _ctx
-  , call        = _iterCall
-  , isArrayIter = _isArrayIter
-  , anObject    = _anObject
-  , toLength    = _toLength
-  , getIterFn   = core_getIteratorMethod
-  , BREAK       = {}
-  , RETURN      = {};
-var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){
-  var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable)
-    , f      = ctx(fn, that, entries ? 2 : 1)
-    , index  = 0
-    , length, step, iterator, result;
-  if(typeof iterFn != 'function'){ throw TypeError(iterable + ' is not iterable!'); }
+var ctx = _ctx;
+var call = _iterCall;
+var isArrayIter = _isArrayIter;
+var anObject = _anObject;
+var toLength = _toLength;
+var getIterFn = core_getIteratorMethod;
+var BREAK = {};
+var RETURN = {};
+var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
+  var f = ctx(fn, that, entries ? 2 : 1);
+  var index = 0;
+  var length, step, iterator, result;
+  if (typeof iterFn != 'function') { throw TypeError(iterable + ' is not iterable!'); }
   // fast case for arrays with default iterator
-  if(isArrayIter(iterFn)){ for(length = toLength(iterable.length); length > index; index++){
+  if (isArrayIter(iterFn)) { for (length = toLength(iterable.length); length > index; index++) {
     result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
-    if(result === BREAK || result === RETURN){ return result; }
-  } } else { for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){
+    if (result === BREAK || result === RETURN) { return result; }
+  } } else { for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
     result = call(iterator, f, step.value, entries);
-    if(result === BREAK || result === RETURN){ return result; }
+    if (result === BREAK || result === RETURN) { return result; }
   } }
 };
-exports.BREAK  = BREAK;
+exports.BREAK = BREAK;
 exports.RETURN = RETURN;
 });
 
 // 7.3.20 SpeciesConstructor(O, defaultConstructor)
-var anObject$4  = _anObject;
+var anObject$4 = _anObject;
 var aFunction$2 = _aFunction;
-var SPECIES   = _wks('species');
-var _speciesConstructor = function(O, D){
-  var C = anObject$4(O).constructor, S;
+var SPECIES = _wks('species');
+var _speciesConstructor = function (O, D) {
+  var C = anObject$4(O).constructor;
+  var S;
   return C === undefined || (S = anObject$4(C)[SPECIES]) == undefined ? D : aFunction$2(S);
 };
 
 // fast apply, http://jsperf.lnkit.com/fast-apply/5
-var _invoke = function(fn, args, that){
+var _invoke = function (fn, args, that) {
   var un = that === undefined;
-  switch(args.length){
+  switch (args.length) {
     case 0: return un ? fn()
                       : fn.call(that);
     case 1: return un ? fn(args[0])
@@ -1040,133 +1085,142 @@ var _invoke = function(fn, args, that){
                       : fn.call(that, args[0], args[1], args[2]);
     case 4: return un ? fn(args[0], args[1], args[2], args[3])
                       : fn.call(that, args[0], args[1], args[2], args[3]);
-  } return              fn.apply(that, args);
-};
-
-var ctx$2                = _ctx;
-var invoke             = _invoke;
-var html               = _html;
-var cel                = _domCreate;
-var global$5             = _global;
-var process$1            = global$5.process;
-var setTask            = global$5.setImmediate;
-var clearTask          = global$5.clearImmediate;
-var MessageChannel     = global$5.MessageChannel;
-var counter            = 0;
-var queue              = {};
+  } return fn.apply(that, args);
+};
+
+var ctx$2 = _ctx;
+var invoke = _invoke;
+var html = _html;
+var cel = _domCreate;
+var global$5 = _global;
+var process$1 = global$5.process;
+var setTask = global$5.setImmediate;
+var clearTask = global$5.clearImmediate;
+var MessageChannel = global$5.MessageChannel;
+var Dispatch = global$5.Dispatch;
+var counter = 0;
+var queue = {};
 var ONREADYSTATECHANGE = 'onreadystatechange';
 var defer;
 var channel;
 var port;
-var run = function(){
+var run = function () {
   var id = +this;
-  if(queue.hasOwnProperty(id)){
+  // eslint-disable-next-line no-prototype-builtins
+  if (queue.hasOwnProperty(id)) {
     var fn = queue[id];
     delete queue[id];
     fn();
   }
 };
-var listener = function(event){
+var listener = function (event) {
   run.call(event.data);
 };
 // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
-if(!setTask || !clearTask){
-  setTask = function setImmediate(fn){
+if (!setTask || !clearTask) {
+  setTask = function setImmediate(fn) {
     var arguments$1 = arguments;
 
-    var args = [], i = 1;
-    while(arguments.length > i){ args.push(arguments$1[i++]); }
-    queue[++counter] = function(){
+    var args = [];
+    var i = 1;
+    while (arguments.length > i) { args.push(arguments$1[i++]); }
+    queue[++counter] = function () {
+      // eslint-disable-next-line no-new-func
       invoke(typeof fn == 'function' ? fn : Function(fn), args);
     };
     defer(counter);
     return counter;
   };
-  clearTask = function clearImmediate(id){
+  clearTask = function clearImmediate(id) {
     delete queue[id];
   };
   // Node.js 0.8-
-  if(_cof(process$1) == 'process'){
-    defer = function(id){
+  if (_cof(process$1) == 'process') {
+    defer = function (id) {
       process$1.nextTick(ctx$2(run, id, 1));
     };
+  // Sphere (JS game engine) Dispatch API
+  } else if (Dispatch && Dispatch.now) {
+    defer = function (id) {
+      Dispatch.now(ctx$2(run, id, 1));
+    };
   // Browsers with MessageChannel, includes WebWorkers
-  } else if(MessageChannel){
-    channel = new MessageChannel;
-    port    = channel.port2;
+  } else if (MessageChannel) {
+    channel = new MessageChannel();
+    port = channel.port2;
     channel.port1.onmessage = listener;
     defer = ctx$2(port.postMessage, port, 1);
   // Browsers with postMessage, skip WebWorkers
   // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
-  } else if(global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts){
-    defer = function(id){
+  } else if (global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts) {
+    defer = function (id) {
       global$5.postMessage(id + '', '*');
     };
     global$5.addEventListener('message', listener, false);
   // IE8-
-  } else if(ONREADYSTATECHANGE in cel('script')){
-    defer = function(id){
-      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
+  } else if (ONREADYSTATECHANGE in cel('script')) {
+    defer = function (id) {
+      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
         html.removeChild(this);
         run.call(id);
       };
     };
   // Rest old browsers
   } else {
-    defer = function(id){
+    defer = function (id) {
       setTimeout(ctx$2(run, id, 1), 0);
     };
   }
 }
 var _task = {
-  set:   setTask,
+  set: setTask,
   clear: clearTask
 };
 
-var global$6    = _global;
+var global$6 = _global;
 var macrotask = _task.set;
-var Observer  = global$6.MutationObserver || global$6.WebKitMutationObserver;
-var process$2   = global$6.process;
-var Promise$1   = global$6.Promise;
-var isNode$1    = _cof(process$2) == 'process';
+var Observer = global$6.MutationObserver || global$6.WebKitMutationObserver;
+var process$2 = global$6.process;
+var Promise$1 = global$6.Promise;
+var isNode$1 = _cof(process$2) == 'process';
 
-var _microtask = function(){
+var _microtask = function () {
   var head, last, notify;
 
-  var flush = function(){
+  var flush = function () {
     var parent, fn;
-    if(isNode$1 && (parent = process$2.domain)){ parent.exit(); }
-    while(head){
-      fn   = head.fn;
+    if (isNode$1 && (parent = process$2.domain)) { parent.exit(); }
+    while (head) {
+      fn = head.fn;
       head = head.next;
       try {
         fn();
-      } catch(e){
-        if(head){ notify(); }
+      } catch (e) {
+        if (head) { notify(); }
         else { last = undefined; }
         throw e;
       }
     } last = undefined;
-    if(parent){ parent.enter(); }
+    if (parent) { parent.enter(); }
   };
 
   // Node.js
-  if(isNode$1){
-    notify = function(){
+  if (isNode$1) {
+    notify = function () {
       process$2.nextTick(flush);
     };
   // browsers with MutationObserver
-  } else if(Observer){
-    var toggle = true
-      , node   = document.createTextNode('');
-    new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
-    notify = function(){
+  } else if (Observer) {
+    var toggle = true;
+    var node = document.createTextNode('');
+    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
+    notify = function () {
       node.data = toggle = !toggle;
     };
   // environments with maybe non-completely correct, but existent Promise
-  } else if(Promise$1 && Promise$1.resolve){
+  } else if (Promise$1 && Promise$1.resolve) {
     var promise = Promise$1.resolve();
-    notify = function(){
+    notify = function () {
       promise.then(flush);
     };
   // for other environments - macrotask based on:
@@ -1176,233 +1230,260 @@ var _microtask = function(){
   // - onreadystatechange
   // - setTimeout
   } else {
-    notify = function(){
+    notify = function () {
       // strange IE + webpack dev server bug - use .call(global)
       macrotask.call(global$6, flush);
     };
   }
 
-  return function(fn){
-    var task = {fn: fn, next: undefined};
-    if(last){ last.next = task; }
-    if(!head){
+  return function (fn) {
+    var task = { fn: fn, next: undefined };
+    if (last) { last.next = task; }
+    if (!head) {
       head = task;
       notify();
     } last = task;
   };
 };
 
+// 25.4.1.5 NewPromiseCapability(C)
+var aFunction$3 = _aFunction;
+
+function PromiseCapability(C) {
+  var resolve, reject;
+  this.promise = new C(function ($$resolve, $$reject) {
+    if (resolve !== undefined || reject !== undefined) { throw TypeError('Bad Promise constructor'); }
+    resolve = $$resolve;
+    reject = $$reject;
+  });
+  this.resolve = aFunction$3(resolve);
+  this.reject = aFunction$3(reject);
+}
+
+var f$3 = function (C) {
+  return new PromiseCapability(C);
+};
+
+var _newPromiseCapability = {
+	f: f$3
+};
+
+var _perform = function (exec) {
+  try {
+    return { e: false, v: exec() };
+  } catch (e) {
+    return { e: true, v: e };
+  }
+};
+
+var newPromiseCapability$1 = _newPromiseCapability;
+
+var _promiseResolve = function (C, x) {
+  var promiseCapability = newPromiseCapability$1.f(C);
+  var resolve = promiseCapability.resolve;
+  resolve(x);
+  return promiseCapability.promise;
+};
+
 var redefine$3 = _redefine;
-var _redefineAll = function(target, src, safe){
-  for(var key in src){ redefine$3(target, key, src[key], safe); }
+var _redefineAll = function (target, src, safe) {
+  for (var key in src) { redefine$3(target, key, src[key], safe); }
   return target;
 };
 
-var global$7      = _global;
-var dP$3          = _objectDp;
+var global$7 = _global;
+var dP$3 = _objectDp;
 var DESCRIPTORS = _descriptors;
-var SPECIES$1     = _wks('species');
+var SPECIES$1 = _wks('species');
 
-var _setSpecies = function(KEY){
+var _setSpecies = function (KEY) {
   var C = global$7[KEY];
-  if(DESCRIPTORS && C && !C[SPECIES$1]){ dP$3.f(C, SPECIES$1, {
+  if (DESCRIPTORS && C && !C[SPECIES$1]) { dP$3.f(C, SPECIES$1, {
     configurable: true,
-    get: function(){ return this; }
+    get: function () { return this; }
   }); }
 };
 
-var ITERATOR$4     = _wks('iterator');
+var ITERATOR$4 = _wks('iterator');
 var SAFE_CLOSING = false;
 
 try {
   var riter = [7][ITERATOR$4]();
-  riter['return'] = function(){ SAFE_CLOSING = true; };
-  Array.from(riter, function(){ throw 2; });
-} catch(e){ /* empty */ }
+  riter['return'] = function () { SAFE_CLOSING = true; };
+  // eslint-disable-next-line no-throw-literal
+  Array.from(riter, function () { throw 2; });
+} catch (e) { /* empty */ }
 
-var _iterDetect = function(exec, skipClosing){
-  if(!skipClosing && !SAFE_CLOSING){ return false; }
+var _iterDetect = function (exec, skipClosing) {
+  if (!skipClosing && !SAFE_CLOSING) { return false; }
   var safe = false;
   try {
-    var arr  = [7]
-      , iter = arr[ITERATOR$4]();
-    iter.next = function(){ return {done: safe = true}; };
-    arr[ITERATOR$4] = function(){ return iter; };
+    var arr = [7];
+    var iter = arr[ITERATOR$4]();
+    iter.next = function () { return { done: safe = true }; };
+    arr[ITERATOR$4] = function () { return iter; };
     exec(arr);
-  } catch(e){ /* empty */ }
+  } catch (e) { /* empty */ }
   return safe;
 };
 
-var LIBRARY$1            = _library;
-var global$4             = _global;
-var ctx$1                = _ctx;
-var classof$1            = _classof;
-var $export$3            = _export;
-var isObject$3           = _isObject;
-var aFunction$1          = _aFunction;
-var anInstance         = _anInstance;
-var forOf              = _forOf;
+var LIBRARY$1 = _library;
+var global$4 = _global;
+var ctx$1 = _ctx;
+var classof$1 = _classof;
+var $export$3 = _export;
+var isObject$3 = _isObject;
+var aFunction$1 = _aFunction;
+var anInstance = _anInstance;
+var forOf = _forOf;
 var speciesConstructor = _speciesConstructor;
-var task               = _task.set;
-var microtask          = _microtask();
-var PROMISE            = 'Promise';
-var TypeError$1          = global$4.TypeError;
-var process            = global$4.process;
-var $Promise           = global$4[PROMISE];
-var process            = global$4.process;
-var isNode             = classof$1(process) == 'process';
-var empty              = function(){ /* empty */ };
+var task = _task.set;
+var microtask = _microtask();
+var newPromiseCapabilityModule = _newPromiseCapability;
+var perform = _perform;
+var promiseResolve = _promiseResolve;
+var PROMISE = 'Promise';
+var TypeError$1 = global$4.TypeError;
+var process = global$4.process;
+var $Promise = global$4[PROMISE];
+var isNode = classof$1(process) == 'process';
+var empty = function () { /* empty */ };
 var Internal;
-var GenericPromiseCapability;
+var newGenericPromiseCapability;
+var OwnPromiseCapability;
 var Wrapper;
+var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
 
-var USE_NATIVE = !!function(){
+var USE_NATIVE = !!function () {
   try {
     // correct subclassing with @@species support
-    var promise     = $Promise.resolve(1)
-      , FakePromise = (promise.constructor = {})[_wks('species')] = function(exec){ exec(empty, empty); };
+    var promise = $Promise.resolve(1);
+    var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
+      exec(empty, empty);
+    };
     // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
     return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
-  } catch(e){ /* empty */ }
+  } catch (e) { /* empty */ }
 }();
 
 // helpers
-var sameConstructor = function(a, b){
+var sameConstructor = LIBRARY$1 ? function (a, b) {
   // with library wrapper special case
   return a === b || a === $Promise && b === Wrapper;
+} : function (a, b) {
+  return a === b;
 };
-var isThenable = function(it){
+var isThenable = function (it) {
   var then;
   return isObject$3(it) && typeof (then = it.then) == 'function' ? then : false;
 };
-var newPromiseCapability = function(C){
-  return sameConstructor($Promise, C)
-    ? new PromiseCapability(C)
-    : new GenericPromiseCapability(C);
-};
-var PromiseCapability = GenericPromiseCapability = function(C){
-  var resolve, reject;
-  this.promise = new C(function($$resolve, $$reject){
-    if(resolve !== undefined || reject !== undefined){ throw TypeError$1('Bad Promise constructor'); }
-    resolve = $$resolve;
-    reject  = $$reject;
-  });
-  this.resolve = aFunction$1(resolve);
-  this.reject  = aFunction$1(reject);
-};
-var perform = function(exec){
-  try {
-    exec();
-  } catch(e){
-    return {error: e};
-  }
-};
-var notify = function(promise, isReject){
-  if(promise._n){ return; }
+var notify = function (promise, isReject) {
+  if (promise._n) { return; }
   promise._n = true;
   var chain = promise._c;
-  microtask(function(){
-    var value = promise._v
-      , ok    = promise._s == 1
-      , i     = 0;
-    var run = function(reaction){
-      var handler = ok ? reaction.ok : reaction.fail
-        , resolve = reaction.resolve
-        , reject  = reaction.reject
-        , domain  = reaction.domain
-        , result, then;
+  microtask(function () {
+    var value = promise._v;
+    var ok = promise._s == 1;
+    var i = 0;
+    var run = function (reaction) {
+      var handler = ok ? reaction.ok : reaction.fail;
+      var resolve = reaction.resolve;
+      var reject = reaction.reject;
+      var domain = reaction.domain;
+      var result, then;
       try {
-        if(handler){
-          if(!ok){
-            if(promise._h == 2){ onHandleUnhandled(promise); }
+        if (handler) {
+          if (!ok) {
+            if (promise._h == 2) { onHandleUnhandled(promise); }
             promise._h = 1;
           }
-          if(handler === true){ result = value; }
+          if (handler === true) { result = value; }
           else {
-            if(domain){ domain.enter(); }
+            if (domain) { domain.enter(); }
             result = handler(value);
-            if(domain){ domain.exit(); }
+            if (domain) { domain.exit(); }
           }
-          if(result === reaction.promise){
+          if (result === reaction.promise) {
             reject(TypeError$1('Promise-chain cycle'));
-          } else if(then = isThenable(result)){
+          } else if (then = isThenable(result)) {
             then.call(result, resolve, reject);
           } else { resolve(result); }
         } else { reject(value); }
-      } catch(e){
+      } catch (e) {
         reject(e);
       }
     };
-    while(chain.length > i){ run(chain[i++]); } // variable length - can't use forEach
+    while (chain.length > i) { run(chain[i++]); } // variable length - can't use forEach
     promise._c = [];
     promise._n = false;
-    if(isReject && !promise._h){ onUnhandled(promise); }
+    if (isReject && !promise._h) { onUnhandled(promise); }
   });
 };
-var onUnhandled = function(promise){
-  task.call(global$4, function(){
-    var value = promise._v
-      , abrupt, handler, console;
-    if(isUnhandled(promise)){
-      abrupt = perform(function(){
-        if(isNode){
+var onUnhandled = function (promise) {
+  task.call(global$4, function () {
+    var value = promise._v;
+    var unhandled = isUnhandled(promise);
+    var result, handler, console;
+    if (unhandled) {
+      result = perform(function () {
+        if (isNode) {
           process.emit('unhandledRejection', value, promise);
-        } else if(handler = global$4.onunhandledrejection){
-          handler({promise: promise, reason: value});
-        } else if((console = global$4.console) && console.error){
+        } else if (handler = global$4.onunhandledrejection) {
+          handler({ promise: promise, reason: value });
+        } else if ((console = global$4.console) && console.error) {
           console.error('Unhandled promise rejection', value);
         }
       });
       // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
       promise._h = isNode || isUnhandled(promise) ? 2 : 1;
     } promise._a = undefined;
-    if(abrupt){ throw abrupt.error; }
+    if (unhandled && result.e) { throw result.v; }
   });
 };
-var isUnhandled = function(promise){
-  if(promise._h == 1){ return false; }
-  var chain = promise._a || promise._c
-    , i     = 0
-    , reaction;
-  while(chain.length > i){
+var isUnhandled = function (promise) {
+  if (promise._h == 1) { return false; }
+  var chain = promise._a || promise._c;
+  var i = 0;
+  var reaction;
+  while (chain.length > i) {
     reaction = chain[i++];
-    if(reaction.fail || !isUnhandled(reaction.promise)){ return false; }
+    if (reaction.fail || !isUnhandled(reaction.promise)) { return false; }
   } return true;
 };
-var onHandleUnhandled = function(promise){
-  task.call(global$4, function(){
+var onHandleUnhandled = function (promise) {
+  task.call(global$4, function () {
     var handler;
-    if(isNode){
+    if (isNode) {
       process.emit('rejectionHandled', promise);
-    } else if(handler = global$4.onrejectionhandled){
-      handler({promise: promise, reason: promise._v});
+    } else if (handler = global$4.onrejectionhandled) {
+      handler({ promise: promise, reason: promise._v });
     }
   });
 };
-var $reject = function(value){
+var $reject = function (value) {
   var promise = this;
-  if(promise._d){ return; }
+  if (promise._d) { return; }
   promise._d = true;
   promise = promise._w || promise; // unwrap
   promise._v = value;
   promise._s = 2;
-  if(!promise._a){ promise._a = promise._c.slice(); }
+  if (!promise._a) { promise._a = promise._c.slice(); }
   notify(promise, true);
 };
-var $resolve = function(value){
-  var promise = this
-    , then;
-  if(promise._d){ return; }
+var $resolve = function (value) {
+  var promise = this;
+  var then;
+  if (promise._d) { return; }
   promise._d = true;
   promise = promise._w || promise; // unwrap
   try {
-    if(promise === value){ throw TypeError$1("Promise can't be resolved itself"); }
-    if(then = isThenable(value)){
-      microtask(function(){
-        var wrapper = {_w: promise, _d: false}; // wrap
+    if (promise === value) { throw TypeError$1("Promise can't be resolved itself"); }
+    if (then = isThenable(value)) {
+      microtask(function () {
+        var wrapper = { _w: promise, _d: false }; // wrap
         try {
           then.call(value, ctx$1($resolve, wrapper, 1), ctx$1($reject, wrapper, 1));
-        } catch(e){
+        } catch (e) {
           $reject.call(wrapper, e);
         }
       });
@@ -1411,25 +1492,26 @@ var $resolve = function(value){
       promise._s = 1;
       notify(promise, false);
     }
-  } catch(e){
-    $reject.call({_w: promise, _d: false}, e); // wrap
+  } catch (e) {
+    $reject.call({ _w: promise, _d: false }, e); // wrap
   }
 };
 
 // constructor polyfill
-if(!USE_NATIVE){
+if (!USE_NATIVE) {
   // 25.4.3.1 Promise(executor)
-  $Promise = function Promise(executor){
+  $Promise = function Promise(executor) {
     anInstance(this, $Promise, PROMISE, '_h');
     aFunction$1(executor);
     Internal.call(this);
     try {
       executor(ctx$1($resolve, this, 1), ctx$1($reject, this, 1));
-    } catch(err){
+    } catch (err) {
       $reject.call(this, err);
     }
   };
-  Internal = function Promise(executor){
+  // eslint-disable-next-line no-unused-vars
+  Internal = function Promise(executor) {
     this._c = [];             // <- awaiting reactions
     this._a = undefined;      // <- checked in isUnhandled reactions
     this._s = 0;              // <- state
@@ -1440,30 +1522,35 @@ if(!USE_NATIVE){
   };
   Internal.prototype = _redefineAll($Promise.prototype, {
     // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
-    then: function then(onFulfilled, onRejected){
-      var reaction    = newPromiseCapability(speciesConstructor(this, $Promise));
-      reaction.ok     = typeof onFulfilled == 'function' ? onFulfilled : true;
-      reaction.fail   = typeof onRejected == 'function' && onRejected;
+    then: function then(onFulfilled, onRejected) {
+      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
+      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+      reaction.fail = typeof onRejected == 'function' && onRejected;
       reaction.domain = isNode ? process.domain : undefined;
       this._c.push(reaction);
-      if(this._a){ this._a.push(reaction); }
-      if(this._s){ notify(this, false); }
+      if (this._a) { this._a.push(reaction); }
+      if (this._s) { notify(this, false); }
       return reaction.promise;
     },
     // 25.4.5.1 Promise.prototype.catch(onRejected)
-    'catch': function(onRejected){
+    'catch': function (onRejected) {
       return this.then(undefined, onRejected);
     }
   });
-  PromiseCapability = function(){
-    var promise  = new Internal;
+  OwnPromiseCapability = function () {
+    var promise = new Internal();
     this.promise = promise;
     this.resolve = ctx$1($resolve, promise, 1);
-    this.reject  = ctx$1($reject, promise, 1);
+    this.reject = ctx$1($reject, promise, 1);
+  };
+  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
+    return sameConstructor($Promise, C)
+      ? new OwnPromiseCapability(C)
+      : newGenericPromiseCapability(C);
   };
 }
 
-$export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, {Promise: $Promise});
+$export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, { Promise: $Promise });
 _setToStringTag($Promise, PROMISE);
 _setSpecies(PROMISE);
 Wrapper = _core[PROMISE];
@@ -1471,65 +1558,62 @@ Wrapper = _core[PROMISE];
 // statics
 $export$3($export$3.S + $export$3.F * !USE_NATIVE, PROMISE, {
   // 25.4.4.5 Promise.reject(r)
-  reject: function reject(r){
-    var capability = newPromiseCapability(this)
-      , $$reject   = capability.reject;
+  reject: function reject(r) {
+    var capability = newPromiseCapability(this);
+    var $$reject = capability.reject;
     $$reject(r);
     return capability.promise;
   }
 });
 $export$3($export$3.S + $export$3.F * (LIBRARY$1 || !USE_NATIVE), PROMISE, {
   // 25.4.4.6 Promise.resolve(x)
-  resolve: function resolve(x){
+  resolve: function resolve(x) {
     // instanceof instead of internal slot check because we should fix it without replacement native Promise core
-    if(x instanceof $Promise && sameConstructor(x.constructor, this)){ return x; }
-    var capability = newPromiseCapability(this)
-      , $$resolve  = capability.resolve;
-    $$resolve(x);
-    return capability.promise;
+    if (x instanceof $Promise && sameConstructor(x.constructor, this)) { return x; }
+    return promiseResolve(this, x);
   }
 });
-$export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(function(iter){
+$export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(function (iter) {
   $Promise.all(iter)['catch'](empty);
 })), PROMISE, {
   // 25.4.4.1 Promise.all(iterable)
-  all: function all(iterable){
-    var C          = this
-      , capability = newPromiseCapability(C)
-      , resolve    = capability.resolve
-      , reject     = capability.reject;
-    var abrupt = perform(function(){
-      var values    = []
-        , index     = 0
-        , remaining = 1;
-      forOf(iterable, false, function(promise){
-        var $index        = index++
-          , alreadyCalled = false;
+  all: function all(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var resolve = capability.resolve;
+    var reject = capability.reject;
+    var result = perform(function () {
+      var values = [];
+      var index = 0;
+      var remaining = 1;
+      forOf(iterable, false, function (promise) {
+        var $index = index++;
+        var alreadyCalled = false;
         values.push(undefined);
         remaining++;
-        C.resolve(promise).then(function(value){
-          if(alreadyCalled){ return; }
-          alreadyCalled  = true;
+        C.resolve(promise).then(function (value) {
+          if (alreadyCalled) { return; }
+          alreadyCalled = true;
           values[$index] = value;
           --remaining || resolve(values);
         }, reject);
       });
       --remaining || resolve(values);
     });
-    if(abrupt){ reject(abrupt.error); }
+    if (result.e) { reject(result.v); }
     return capability.promise;
   },
   // 25.4.4.4 Promise.race(iterable)
-  race: function race(iterable){
-    var C          = this
-      , capability = newPromiseCapability(C)
-      , reject     = capability.reject;
-    var abrupt = perform(function(){
-      forOf(iterable, false, function(promise){
+  race: function race(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var reject = capability.reject;
+    var result = perform(function () {
+      forOf(iterable, false, function (promise) {
         C.resolve(promise).then(capability.resolve, reject);
       });
     });
-    if(abrupt){ reject(abrupt.error); }
+    if (result.e) { reject(result.v); }
     return capability.promise;
   }
 });
@@ -1881,6 +1965,114 @@ function freezeProtoProperty (proto, propertyName, protoName) {
  */
 // import promise hack and polyfills
 
+function typof (v) {
+  var s = Object.prototype.toString.call(v);
+  return s.substring(8, s.length - 1)
+}
+
+function bufferToBase64 (buffer) {
+  if (typeof btoa !== 'function') {
+    return ''
+  }
+  var string = Array.prototype.map.call(
+    new Uint8Array(buffer),
+    function (code) { return String.fromCharCode(code); }
+  ).join('');
+  return btoa(string) // eslint-disable-line no-undef
+}
+
+function base64ToBuffer (base64) {
+  if (typeof atob !== 'function') {
+    return new ArrayBuffer(0)
+  }
+  var string = atob(base64); // eslint-disable-line no-undef
+  var array = new Uint8Array(string.length);
+  Array.prototype.forEach.call(string, function (ch, i) {
+    array[i] = ch.charCodeAt(0);
+  });
+  return array.buffer
+}
+
+/**
+ * Normalize a primitive value.
+ * @param  {any}        v
+ * @return {primitive}
+ */
+function normalizePrimitive (v) {
+  var type = typof(v);
+
+  switch (type) {
+    case 'Undefined':
+    case 'Null':
+      return ''
+
+    case 'RegExp':
+      return v.toString()
+    case 'Date':
+      return v.toISOString()
+
+    case 'Number':
+    case 'String':
+    case 'Boolean':
+      return v
+
+    case 'Array':
+      return v.map(normalizePrimitive)
+
+    case 'Object': {
+      var obj = {};
+      for (var k in v) {
+        obj[k] = normalizePrimitive(v[k]);
+      }
+      return obj
+    }
+
+    case 'ArrayBuffer':
+      return {
+        '@type': 'binary',
+        dataType: type,
+        base64: bufferToBase64(v)
+      }
+
+    case 'Int8Array':
+    case 'Uint8Array':
+    case 'Uint8ClampedArray':
+    case 'Int16Array':
+    case 'Uint16Array':
+    case 'Int32Array':
+    case 'Uint32Array':
+    case 'Float32Array':
+    case 'Float64Array':
+      return {
+        '@type': 'binary',
+        dataType: type,
+        base64: bufferToBase64(v.buffer)
+      }
+
+    default:
+      return JSON.stringify(v)
+  }
+}
+
+function decodePrimitive (data) {
+  if (typof(data) === 'Object') {
+    // decode base64 into binary
+    if (data['@type'] && data['@type'] === 'binary') {
+      return base64ToBuffer(data.base64 || '')
+    }
+
+    var realData = {};
+    for (var key in data) {
+      realData[key] = decodePrimitive(data[key]);
+    }
+    return realData
+  }
+  if (typof(data) === 'Array') {
+    return data.map(decodePrimitive)
+  }
+  return data
+}
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -1910,7 +2102,7 @@ function freezeProtoProperty (proto, propertyName, protoName) {
 var CallbackManager = function CallbackManager (instanceId) {
   this.instanceId = instanceId;
   this.lastCallbackId = 0;
-  this.callbacks = [];
+  this.callbacks = {};
 };
 CallbackManager.prototype.add = function add (callback) {
   this.lastCallbackId++;
@@ -1919,21 +2111,21 @@ CallbackManager.prototype.add = function add (callback) {
 };
 CallbackManager.prototype.remove = function remove (callbackId) {
   var callback = this.callbacks[callbackId];
-  this.callbacks[callbackId] = undefined;
+  delete this.callbacks[callbackId];
   return callback
 };
 CallbackManager.prototype.consume = function consume (callbackId, data, ifKeepAlive) {
   var callback = this.callbacks[callbackId];
   if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) {
-    this.callbacks[callbackId] = undefined;
+    delete this.callbacks[callbackId];
   }
   if (typeof callback === 'function') {
-    return callback(data)
+    return callback(decodePrimitive(data))
   }
   return new Error(("invalid callback id \"" + callbackId + "\""))
 };
 CallbackManager.prototype.close = function close () {
-  this.callbacks = this.callbacks.map(function (cb) { return undefined; });
+  this.callbacks = {};
 };
 
 /*
@@ -2727,23 +2919,26 @@ Object.assign(Element.prototype, {
    * @return {} anything returned by handler function
    */
   fireEvent: function fireEvent (type, e, isBubble) {
+    var result = null;
     var isStopPropagation = false;
     var handler = this.event[type];
     if (handler && e) {
       e.stopPropagation = function () {
         isStopPropagation = true;
       };
-      handler.call(this, e);
-    }
-
-    if (isStopPropagation) {
-      return
+      result = handler.call(this, e);
     }
 
-    if (isBubble && BUBBLE_EVENTS.includes(type) && this.parentNode && this.parentNode.fireEvent) {
+    if (!isStopPropagation
+      && isBubble
+      && BUBBLE_EVENTS.includes(type)
+      && this.parentNode
+      && this.parentNode.fireEvent) {
       e.currentTarget = this.parentNode;
       this.parentNode.fireEvent(type, e, isBubble);
     }
+
+    return result
   },
 
   /**
@@ -2816,7 +3011,7 @@ var TaskCenter = function TaskCenter (id, sendTasks) {
   });
   Object.defineProperty(this, 'callbackManager', {
     enumerable: true,
-    value: new CallbackManager()
+    value: new CallbackManager(id)
   });
   fallback = sendTasks || function () {};
 };
@@ -2829,54 +3024,36 @@ TaskCenter.prototype.destroyCallback = function destroyCallback () {
   return this.callbackManager.close()
 };
 
-TaskCenter.prototype.typof = function typof (v) {
-  var s = Object.prototype.toString.call(v);
-  return s.substring(8, s.length - 1).toLowerCase()
-};
-
 /**
  * Normalize a value. Specially, if the value is a function, then generate a function id
  * and save it to `CallbackManager`, at last return the function id.
  * @param{any}      v
- * @param{object}   app
  * @return {primitive}
  */
 TaskCenter.prototype.normalize = function normalize (v) {
-  var type = this.typof(v);
+  var type = typof(v);
 
-  switch (type) {
-    case 'undefined':
-    case 'null':
-      return ''
-    case 'regexp':
-      return v.toString()
-    case 'date':
-      return v.toISOString()
-    case 'number':
-    case 'string':
-    case 'boolean':
-    case 'array':
-    case 'object':
-      if (v instanceof Element) {
-        return v.ref
-      }
-      return v
-    case 'function':
-      return this.callbackManager.add(v).toString()
-    /* istanbul ignore next */
-    default:
-      return JSON.stringify(v)
+  if (v && v instanceof Element) {
+    return v.ref
+  }
+  if (v && v._isVue && v.$el instanceof Element) {
+    return v.$el.ref
   }
+  if (type === 'Function') {
+    return this.callbackManager.add(v).toString()
+  }
+
+  return normalizePrimitive(v)
 };
 
-TaskCenter.prototype.send = function send (type, options, args) {
+TaskCenter.prototype.send = function send (type, params, args, options) {
     var this$1 = this;
 
-  var action = options.action;
-    var component = options.component;
-    var ref = options.ref;
-    var module = options.module;
-    var method = options.method;
+  var action = params.action;
+    var component = params.component;
+    var ref = params.ref;
+    var module = params.module;
+    var method = params.method;
 
   args = args.map(function (arg) { return this$1.normalize(arg); });
 
@@ -2884,9 +3061,9 @@ TaskCenter.prototype.send = function send (type, options, args) {
     case 'dom':
       return this[action](this.instanceId, args)
     case 'component':
-      return this.componentHandler(this.instanceId, ref, method, args, { component: component })
+      return this.componentHandler(this.instanceId, ref, method, args, Object.assign({ component: component }, options))
     default:
-      return this.moduleHandler(this.instanceId, module, method, args, {})
+      return this.moduleHandler(this.instanceId, module, method, args, options)
   }
 };
 
@@ -2894,12 +3071,12 @@ TaskCenter.prototype.callDOM = function callDOM (action, args) {
   return this[action](this.instanceId, args)
 };
 
-TaskCenter.prototype.callComponent = function callComponent (ref, method, args) {
-  return this.componentHandler(this.instanceId, ref, method, args, {})
+TaskCenter.prototype.callComponent = function callComponent (ref, method, args, options) {
+  return this.componentHandler(this.instanceId, ref, method, args, options)
 };
 
-TaskCenter.prototype.callModule = function callModule (module, method, args) {
-  return this.moduleHandler(this.instanceId, module, method, args, {})
+TaskCenter.prototype.callModule = function callModule (module, method, args, options) {
+  return this.moduleHandler(this.instanceId, module, method, args, options)
 };
 
 function init$1 () {
@@ -3794,8 +3971,10 @@ Object.assign(Document.prototype, {
    * Destroy current document, and remove itself form docMap.
    */
   destroy: function destroy () {
+    this.taskCenter.destroyCallback();
     delete this.listener;
     delete this.nodeMap;
+    delete this.taskCenter;
     removeDoc(this.id);
   }
 });
@@ -3844,7 +4023,10 @@ var config = {
     var args = [], len = arguments.length;
     while ( len-- ) args[ len ] = arguments[ len ];
 
-    return global.callNative.apply(global, args)
+    if (typeof callNative === 'function') {
+      return callNative.apply(void 0, args)
+    }
+    return (global.callNative || (function () {})).apply(void 0, args)
   }
 };
 
@@ -3903,4 +4085,4 @@ var index = {
 return index;
 
 })));
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uLy4uL2h0bWw1L3NoYXJlZC9hcnJheUZyb20uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL
 2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWluZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2
 R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9vYmplY3RBc3NpZ24uanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvb2JqZWN0U2V0UHJvdG90eXBlT2YuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvcHJvbWlzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGV
 zL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIi4uLy4uL25vZGVfbW9k
 dWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIi4uLy4uL2h0bWw1L3NoY
 XJlZC9jb25zb2xlLmpzIiwiLi4vLi4vaHRtbDUvc2hhcmVkL3NldFRpbWVvdXQuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvZnJlZXplLmpzIiwiLi4vLi4vaHRtbDUvc2hhcmVkL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9jYWxsYmFjay1tYW5hZ2VyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL29wZXJhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9ub2RlLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL2VsZW1lbnQtdHlwZXMuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vZWxlbWVudC5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdGFzay1jZW50ZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3NlcnZpY2UuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2luaXQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vY29tbWVudC5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvbGlzdGVuZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2hhbmRsZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vZG9jdW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2NvbmZpZy5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG
 1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnN
 lLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIFByb2R1Y3Rpb24gc3RlcHMgb2YgRUNNQS0yNjIsIEVkaXRpb24gNiwgMjIuMS4yLjFcbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWFycmF5LmZyb21cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAoIUFycmF5LmZyb20pIHtcbiAgQXJyYXkuZnJvbSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBpc0NhbGxhYmxlID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHwgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfTtcbiAgICB2YXIgdG9JbnRlZ2VyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBudW1iZXIgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyID09PSAwIHx8ICFpc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG51bWJlciA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcbiAgICB9O1xuICAgIHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUz
 KSAtIDE7XG4gICAgdmFyIHRvTGVuZ3RoID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBsZW4gPSB0b0ludGVnZXIodmFsdWUpO1xuICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbiwgMCksIG1heFNhZmVJbnRlZ2VyKTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiB0aGUgZnJvbSBtZXRob2QgaXMgMS5cbiAgICByZXR1cm4gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICAgIC8vIDEuIExldCBDIGJlIHRoZSB0aGlzIHZhbHVlLlxuICAgICAgdmFyIEMgPSB0aGlzO1xuXG4gICAgICAvLyAyLiBMZXQgaXRlbXMgYmUgVG9PYmplY3QoYXJyYXlMaWtlKS5cbiAgICAgIHZhciBpdGVtcyA9IE9iamVjdChhcnJheUxpa2UpO1xuXG4gICAgICAvLyAzLiBSZXR1cm5JZkFicnVwdChpdGVtcykuXG4gICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbSByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCAtIG5vdCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBtYXBmbiBpcyB1bmRlZmluZWQsIHRoZW4gbGV0IG1hcHBpbmcgYmUgZmFsc2UuXG4gICAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgdW5kZWZpbmVkO1xuICAgICAgdmFyIFQ7XG4gICAgICBpZiAod
 HlwZW9mIG1hcEZuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyA1LiBlbHNlXG4gICAgICAgIC8vIDUuIGEgSWYgSXNDYWxsYWJsZShtYXBmbikgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG1hcEZuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBiLiBJZiB0aGlzQXJnIHdhcyBzdXBwbGllZCwgbGV0IFQgYmUgdGhpc0FyZzsgZWxzZSBsZXQgVCBiZSB1bmRlZmluZWQuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICAgIFQgPSBhcmd1bWVudHNbMl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMTAuIExldCBsZW5WYWx1ZSBiZSBHZXQoaXRlbXMsIFwibGVuZ3RoXCIpLlxuICAgICAgLy8gMTEuIExldCBsZW4gYmUgVG9MZW5ndGgobGVuVmFsdWUpLlxuICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKGl0ZW1zLmxlbmd0aCk7XG5cbiAgICAgIC8vIDEzLiBJZiBJc0NvbnN0cnVjdG9yKEMpIGlzIHRydWUsIHRoZW5cbiAgICAgIC8vIDEzLiBhLiBMZXQgQSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEMgd2l0aCBhbiBhcmd1bWVudCBsaX
 N0IGNvbnRhaW5pbmcgdGhlIHNpbmdsZSBpdGVtIGxlbi5cbiAgICAgIC8vIDE0LiBhLiBFbHNlLCBMZXQgQSBiZSBBcnJheUNyZWF0ZShsZW4pLlxuICAgICAgdmFyIEEgPSBpc0NhbGxhYmxlKEMpID8gT2JqZWN0KG5ldyBDKGxlbikpIDogbmV3IEFycmF5KGxlbik7XG5cbiAgICAgIC8vIDE2LiBMZXQgayBiZSAwLlxuICAgICAgdmFyIGsgPSAwO1xuICAgICAgLy8gMTcuIFJlcGVhdCwgd2hpbGUgayA8IGxlbuKApiAoYWxzbyBzdGVwcyBhIC0gaClcbiAgICAgIHZhciBrVmFsdWU7XG4gICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICBrVmFsdWUgPSBpdGVtc1trXTtcbiAgICAgICAgaWYgKG1hcEZuKSB7XG4gICAgICAgICAgQVtrXSA9IHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IG1hcEZuKGtWYWx1ZSwgaykgOiBtYXBGbi5jYWxsKFQsIGtWYWx1ZSwgayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQVtrXSA9IGtWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBrICs9IDE7XG4gICAgICB9XG4gICAgICAvLyAxOC4gTGV0IHB1dFN0YXR1cyBiZSBQdXQoQSwgXCJsZW5ndGhcIiwgbGVuLCB0cnVlKS5cbiAgICAgIEEubGVuZ3RoID0gbGVuO1xuICAgICAgLy8gMjAuIFJldHVybiBBLlxuICAgICAgcmV0dXJuIEE7XG4gICAgfTtcbiAgfSgpKTtcbn1cbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXI
 gZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIs
 Ii8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztc

<TRUNCATED>