Last active
May 16, 2021 15:56
-
-
Save johnd0e/d7c58f4bcb19c40dc68760a44c847785 to your computer and use it in GitHub Desktop.
IITC plugin: Yandex maps jsapi loader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @author johnd0e | |
// @name IITC plugin: Yandex maps jsapi loader (debug) | |
// @category Map Tiles | |
// @version 0.1.0 | |
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider). | |
// @namespace https://gist.github.com/johnd0e | |
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785 | |
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field | |
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader-debug.meta.js | |
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader-debug.user.js | |
// @id yandex-maps-api-loader | |
// @match https://intel.ingress.com/* | |
// @grant none | |
// ==/UserScript== | |
function wrapper(plugin_info) { | |
// ensure plugin framework is there, even if iitc is not yet loaded | |
if(typeof window.plugin !== 'function') window.plugin = function() {}; | |
// https://api-maps.yandex.ru/2.1/?mode=debug&lang=ru_RU | |
function setup () { | |
if (window.plugin.mapYandex) { | |
window.plugin.mapYandex.options.apiUrl = 'https://api-maps.yandex.com/{version}/'; | |
window.plugin.mapYandex.options.apiParams = { mode: 'debug' }; | |
} | |
} | |
setup.priority = 'high'; | |
setup.info = plugin_info; //add the script info data to the function as a property | |
if(!window.bootPlugins) window.bootPlugins = []; | |
window.bootPlugins.push(setup); | |
// if IITC has already booted, immediately run the 'setup' function | |
if(window.iitcLoaded && typeof setup === 'function') setup(); | |
} // wrapper end | |
// inject code into site context | |
var script = document.createElement('script'); | |
var info = {}; | |
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; | |
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); | |
(document.body || document.head || document.documentElement).appendChild(script); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @author johnd0e | |
// @name IITC plugin: Yandex maps jsapi loader | |
// @category Map Tiles | |
// @version 0.1.0 | |
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider). | |
// @namespace https://gist.github.com/johnd0e | |
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785 | |
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field | |
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.meta.js | |
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.user.js | |
// @id yandex-maps-api-loader | |
// @match https://intel.ingress.com/* | |
// @grant none | |
// ==/UserScript== | |
function wrapper(plugin_info) { | |
// ensure plugin framework is there, even if iitc is not yet loaded | |
if(typeof window.plugin !== 'function') window.plugin = function() {}; | |
// https://api-maps.yandex.ru/2.1/?lang=ru_RU | |
function setup () { | |
if (window.plugin.mapYandex) { | |
window.plugin.mapYandex.options.apiUrl = 'https://gist.githack.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/ymaps-jsapi.js'; | |
} | |
} | |
setup.priority = 'high'; | |
setup.info = plugin_info; //add the script info data to the function as a property | |
if(!window.bootPlugins) window.bootPlugins = []; | |
window.bootPlugins.push(setup); | |
// if IITC has already booted, immediately run the 'setup' function | |
if(window.iitcLoaded && typeof setup === 'function') setup(); | |
} // wrapper end | |
// inject code into site context | |
var script = document.createElement('script'); | |
var info = {}; | |
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; | |
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); | |
(document.body || document.head || document.documentElement).appendChild(script); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @author johnd0e | |
// @name IITC plugin: Yandex maps jsapi loader | |
// @category Layer | |
// @version 0.1.0 | |
// @description Loads local copy of jsapi script in case when online one is not available (e.g. blocked by provider). | |
// @namespace https://gist.github.com/johnd0e | |
// @homepageURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785 | |
// @supportURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785#new_comment_field | |
// @updateURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.meta.js | |
// @downloadURL https://gist.github.com/johnd0e/d7c58f4bcb19c40dc68760a44c847785/raw/yandex-maps-api-loader.user.js | |
// @id yandex-maps-api-loader | |
// @match https://intel.ingress.com/* | |
// @grant none | |
// ==/UserScript== | |
function wrapper(plugin_info) { | |
// ensure plugin framework is there, even if iitc is not yet loaded | |
if(typeof window.plugin !== 'function') window.plugin = function() {}; | |
function onerror (resolve, reject) { | |
try { | |
// https://api-maps.yandex.ru/2.1/?lang=ru_RU | |
// (should be updated from time to time) | |
(function ymapsInit(e){var n=this,t={ns:{},supports:{},env:e},r=.01;t.performance=function(e){function n(){E=E||setTimeout(t,_)}function t(){clearTimeout(E),E=null;var e=r();if(e){var t=s+"/vars="+e+"/*";if(!a||!navigator.sendBeacon(o,t)){var i=new Image,u=(new Date).getTime()+Math.round(100*Math.random());i.src=o+"/rnd="+u+t}n()}}function r(){var e=[];return i(e,v),i(e,p),e.join(",")}function i(e,n){for(var t in n)if(n.hasOwnProperty(t)&&n[t].length&&(e.push(t+"="+n[t].shift()),e.length>=g))return}var o,s,a,u,c={exports:{}},l=(c.exports,window.performance||Object.create(null)),d=l.now?l.now.bind(l):function(){return Date.now()},f=l.getEntriesByType?function(e){return l.getEntriesByType("resource").filter(function(n){return n.name===e})[0]}:function(){},p={},v={},h={initjs:"i",mapjs:"m",combine_s:"cs",combine_m:"cm",combine_l:"cl"},m={eval:"e",duration:"d",cached:"c",encodedSize:"esz",decodedSize:"dsz",responseDuration:"res",requestDuration:"req"},y={statistics:{combine:{total:0,size:0,modules:0}},initTimings:{},now:d,getResourceTimings:function(e){return f(e)||{}},init:function(e){o=e.url,s="/pid=443/cid=73188/dtype=stred"+e.data,a=Boolean(e.useSendBeacon&&navigator.sendBeacon),u=e.enable,y.initTimings=y.getResourceTimings(e.initUrl),y.saveResourceTimings("initjs",y.initTimings,{size:!1,cached:!1})},saveMeasure:function(e,t){if(u){var r=/^@/.test(e);if(r){var i=e.replace(/^@/,"").split(".");e=(h[i[0]]||i[0])+"."+(m[i[1]]||i[1])}if(t=Math.round(t),!isNaN(t)){var o=r?p:v;o[e]=o[e]||[],o[e].push(t),n()}}},startMeasure:function(e,n){n="undefined"==typeof n?d():n;var t=!1;return{finish:function(r){t||(r="undefined"==typeof r?d():r,y.saveMeasure(e,r-n),t=!0)}}},saveResourceTimings:function(e,n,t){var r="object"==typeof n?n:f(n);if(r&&(t=t||{},e=e.replace(/^@?/,"@"),this.saveMeasure(e+".duration",r.duration),r.responseStart)){var i=0===r.transferSize?1:0;this.saveMeasure(e+".responseDuration",r.responseEnd-r.responseStart),this.saveMeasure(e+".requestDuration",r.responseStart-r.requestStart),t.cached!==!1&&this.saveMeasure(e+".cached",i),t.size===!1||i||(this.saveMeasure(e+".encodedSize",r.encodedBodySize/1024),this.saveMeasure(e+".decodedSize",r.decodedBodySize/1024))}}},g=40,_=5e3,E=null;return window.addEventListener("beforeunload",function(){y.saveMeasure("combine.total",y.statistics.combine.total),y.saveMeasure("combine.modules",y.statistics.combine.modules),y.saveMeasure("combine.size",y.statistics.combine.size/1024),t()}),c.exports=y,c.exports}();var i=t.performance.startMeasure("@initjs.eval");t.count=function(e){function n(){r.push(arguments)}var t={exports:{}},r=(t.exports,[]),i=null,o=function(){(i||n).apply(null,arguments)};return o.provideImplementation=function(e){if(i)throw new Error("ym.count: implementation was already provided.");i=e(r)},t.exports=o,t.exports}(),t.vow=t.ns.vow=function(e){var t,r={exports:{}};r.exports;return function(e){var n,i=function(){var n=[],t=function(e){return n.push(e),1===n.length},r=function(){var e=n,t=0,r=n.length;for(n=[];t<r;)e[t++]()};if("function"==typeof setImmediate)return function(e){t(e)&&setImmediate(r)};if("object"==typeof process&&process.nextTick)return function(e){t(e)&&process.nextTick(r)};var i=e.MutationObserver||e.WebKitMutationObserver;if(i){var o=1,s=document.createTextNode("");return new i(r).observe(s,{characterData:!0}),function(e){t(e)&&(s.data=o*=-1)}}if(e.postMessage){var a=!0;if(e.attachEvent){var u=function(){a=!1};e.attachEvent("onmessage",u),e.postMessage("__checkAsync","*"),e.detachEvent("onmessage",u)}if(a){var c="__promise"+Math.random()+"_"+new Date,l=function(e){e.data===c&&(e.stopPropagation&&e.stopPropagation(),r())};return e.addEventListener?e.addEventListener("message",l,!0):e.attachEvent("onmessage",l),function(n){t(n)&&e.postMessage(c,"*")}}}var d=e.document;if("onreadystatechange"in d.createElement("script")){var f=function(){var e=d.createElement("script");e.onreadystatechange=function(){e.parentNode.removeChild(e),e=e.onreadystatechange=null,r()},(d.documentElement||d.body).appendChild(e)};return function(e){t(e)&&f()}}return function(e){t(e)&&setTimeout(r,0)}}(),o=function(e){i(function(){throw e})},s=function(e){return"function"==typeof e},a=function(e){return null!==e&&"object"==typeof e},u=Object.prototype.toString,c=Array.isArray||function(e){return"[object Array]"===u.call(e)},l=function(e){for(var n=[],t=0,r=e.length;t<r;)n.push(t++);return n},d=Object.keys||function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(t);return n},f=function(e){var n=function(n){this.name=e,this.message=n};return n.prototype=new Error,n},p=function(e,n){return function(t){e.call(this,t,n)}},v=function(){this._promise=new m};v.prototype={promise:function(){return this._promise},resolve:function(e){this._promise.isResolved()||this._promise._resolve(e)},reject:function(e){this._promise.isResolved()||(_.isPromise(e)?(e=e.then(function(e){var n=_.defer();return n.reject(e),n.promise()}),this._promise._resolve(e)):this._promise._reject(e))},notify:function(e){this._promise.isResolved()||this._promise._notify(e)}};var h={PENDING:0,RESOLVED:1,FULFILLED:2,REJECTED:3},m=function(e){if(this._value=n,this._status=h.PENDING,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[],e){var t=this,r=e.length;e(function(e){t.isResolved()||t._resolve(e)},r>1?function(e){t.isResolved()||t._reject(e)}:n,r>2?function(e){t.isResolved()||t._notify(e)}:n)}};m.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==h.PENDING},isFulfilled:function(){return this._status===h.FULFILLED},isRejected:function(){return this._status===h.REJECTED},then:function(e,n,t,r){var i=new v;return this._addCallbacks(i,e,n,t,r),i.promise()},"catch":function(e,t){return this.then(n,e,t)},fail:function(e,t){return this.then(n,e,t)},always:function(e,n){var t=this,r=function(){return e.call(this,t)};return this.then(r,r,n)},progress:function(e,t){return this.then(n,n,e,t)},spread:function(e,n,t){return this.then(function(n){return e.apply(this,n)},n,t)},done:function(e,n,t,r){this.then(e,n,t,r).fail(o)},delay:function(e){var n,t=this.then(function(t){var r=new v;return n=setTimeout(function(){r.resolve(t)},e),r.promise()});return t.always(function(){clearTimeout(n)}),t},timeout:function(e){var n=new v,t=setTimeout(function(){n.reject(new _.TimedOutError("timed out"))},e);return this.then(function(e){n.resolve(e)},function(e){n.reject(e)}),n.promise().always(function(){clearTimeout(t)}),n.promise()},_vow:!0,_resolve:function(e){if(!(this._status>h.RESOLVED)){if(e===this)return void this._reject(TypeError("Can't resolve promise with itself"));if(this._status=h.RESOLVED,e&&e._vow)return void(e.isFulfilled()?this._fulfill(e.valueOf()):e.isRejected()?this._reject(e.valueOf()):e.then(this._fulfill,this._reject,this._notify,this));if(a(e)||s(e)){var n;try{n=e.then}catch(t){return void this._reject(t)}if(s(n)){var r=this,i=!1;try{n.call(e,function(e){i||(i=!0,r._resolve(e))},function(e){i||(i=!0,r._reject(e))},function(e){r._notify(e)})}catch(t){i||this._reject(t)}return}}this._fulfill(e)}},_fulfill:function(e){this._status>h.RESOLVED||(this._status=h.FULFILLED,this._value=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_reject:function(e){this._status>h.RESOLVED||(this._status=h.REJECTED,this._value=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_notify:function(e){this._callCallbacks(this._progressCallbacks,e)},_addCallbacks:function(e,t,r,i,o){r&&!s(r)?(o=r,r=n):i&&!s(i)&&(o=i,i=n);var a;this.isRejected()||(a={defer:e,fn:s(t)?t:n,ctx:o},this.isFulfilled()?this._callCallbacks([a],this._value):this._fulfilledCallbacks.push(a)),this.isFulfilled()||(a={defer:e,fn:r,ctx:o},this.isRejected()?this._callCallbacks([a],this._value):this._rejectedCallbacks.push(a)),this._status<=h.RESOLVED&&this._progressCallbacks.push({defer:e,fn:i,ctx:o})},_callCallbacks:function(e,n){var t=e.length;if(t){var r=this.isResolved(),o=this.isFulfilled(),s=this.isRejected();i(function(){for(var i,a,u,c=0;c<t;)if(i=e[c++],a=i.defer,u=i.fn){var l,d=i.ctx;try{l=d?u.call(d,n):u(n)}catch(f){a.reject(f);continue}r?a.resolve(l):a.notify(l)}else o?a.resolve(n):s?a.reject(n):a.notify(n)})}}};var y={cast:function(e){return _.cast(e)},all:function(e){return _.all(e)},race:function(e){return _.anyResolved(e)},resolve:function(e){return _.resolve(e)},reject:function(e){return _.reject(e)}};for(var g in y)y.hasOwnProperty(g)&&(m[g]=y[g]);var _={Deferred:v,Promise:m,defer:function(){return new v},when:function(e,n,t,r,i){return _.cast(e).then(n,t,r,i)},fail:function(e,t,r){return _.when(e,n,t,r)},always:function(e,n,t){return _.when(e).always(n,t)},progress:function(e,n,t){return _.when(e).progress(n,t)},spread:function(e,n,t,r){return _.when(e).spread(n,t,r)},done:function(e,n,t,r,i){_.when(e).done(n,t,r,i)},isPromise:function(e){return a(e)&&s(e.then)},cast:function(e){return e&&e._vow?e:_.resolve(e)},valueOf:function(e){return e&&s(e.valueOf)?e.valueOf():e},isFulfilled:function(e){return!e||!s(e.isFulfilled)||e.isFulfilled()},isRejected:function(e){return!(!e||!s(e.isRejected))&&e.isRejected()},isResolved:function(e){return!e||!s(e.isResolved)||e.isResolved()},resolve:function(e){var n=_.defer();return n.resolve(e),n.promise()},fulfill:function(e){var n=_.defer(),t=n.promise();return n.resolve(e),t.isFulfilled()?t:t.then(null,function(e){return e})},reject:function(e){var n=_.defer();return n.reject(e),n.promise()},invoke:function(n,t){var r,i=Math.max(arguments.length-1,0);if(i){r=Array(i);for(var o=0;o<i;)r[o++]=arguments[o]}try{return _.resolve(r?n.apply(e,r):n.call(e))}catch(s){return _.reject(s)}},all:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=i;return _._forEach(e,function(e,t){o[r[t]]=e,--s||n.resolve(o)},n.reject,n.notify,n,r),n.promise()},allResolved:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=function(){--i||n.resolve(e)};return _._forEach(e,s,s,n.notify,n,r),n.promise()},allPatiently:function(e){return _.allResolved(e).then(function(){var n,t,r,i,o=c(e),s=o?l(e):d(e),a=s.length,u=0;if(!a)return o?[]:{};for(;u<a;)r=s[u++],i=e[r],_.isRejected(i)?(n||(n=o?[]:{}),o?n.push(i.valueOf()):n[r]=i.valueOf()):n||((t||(t=o?[]:{}))[r]=_.valueOf(i));if(n)throw n;return t})},any:function(e){var n=new v,t=e.length;if(!t)return n.reject(Error()),n.promise();var r,i=0;return _._forEach(e,n.resolve,function(e){i||(r=e),++i===t&&n.reject(r)},n.notify,n),n.promise()},anyResolved:function(e){var n=new v,t=e.length;return t?(_._forEach(e,n.resolve,n.reject,n.notify,n),n.promise()):(n.reject(Error()),n.promise())},delay:function(e,n){return _.resolve(e).delay(n)},timeout:function(e,n){return _.resolve(e).timeout(n)},_forEach:function(e,n,t,r,i,o){for(var s=o?o.length:e.length,a=0;a<s;)_.when(e[o?o[a]:a],p(n,a),t,r,i),++a},TimedOutError:f("TimedOut")};_.__nextTick__=i;var E=!0;"object"==typeof r&&"object"==typeof r.exports&&(r.exports=_,E=!1),"object"==typeof modules&&s(modules.define)&&(modules.define("vow",function(e){e(_)}),E=!1),"function"==typeof t&&(t(function(e,n,t){t.exports=_}),E=!1),E&&(e.vow=_)}("undefined"!=typeof window?window:n),r.exports}(),t.utils=function(e){function n(n){return e[n]}var t={exports:{}},r=t.exports,i=n("vow"),o=Object.prototype.hasOwnProperty;return r.nextTick=i.__nextTick__,i.__nextTick__=void 0,r.isArray=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r.extend=Object.assign?Object.assign:function(e){for(var n=1,t=arguments.length;n<t;n++){var r=arguments[n];if(null!=r)for(var i in r)o.call(r,i)&&(e[i]=r[i])}return e},r.accessDeep=function(e,n){for(var t=n.split("."),r=0;r<t.length-1;r++){var i=t[r];e[i]=e[i]||{},e=e[i]}return{parent:e,name:t[t.length-1]}},r.createPackage=function(e,n,t){var i=r.registerImports({},e,n);return t&&(i.__expand={depends:e,imports:n}),i},r.registerImports=function(e,n,t){for(var i=0;i<n.length;i++)if(t[i].__expand)r.registerImports(e,t[i].__expand.depends,t[i].__expand.imports);else{var o=r.accessDeep(e,n[i]);o.parent[o.name]=t[i]}return e},t.exports}({vow:t.vow});var o=t.env.namespace?t.utils.accessDeep(n,t.env.namespace):null;o&&o.parent&&o.parent[o.name]&&o.parent[o.name].modules&&o.parent[o.name].ready&&console.error("(Yandex Maps JS API): api is already enabled on this page with same namespace."),function(){function e(e){return"undefined"==typeof d[e]?d[e]=n(e):d[e]}function n(e){return r(e)||r(f+o(e))||r(t.env.browser.cssPrefix+o(e))}function r(e){return"undefined"!=typeof i().style[e]?e:null}function i(){return u||(u=document.createElement("div"))}function o(e){return e?e.substr(0,1).toUpperCase()+e.substr(1):e}function s(n){var t=e(n);return t&&t!=n&&(t="-"+f+"-"+n),t}function a(n){return c[n]&&e("transitionProperty")?s(c[n]):null}var u,c={transform:"transform",opacity:"opacity",transitionTimingFunction:"transition-timing-function",userSelect:"user-select",height:"height"},l={},d={},f=t.env.browser.cssPrefix.toLowerCase();t.supports.css={checkProperty:e,checkTransitionProperty:function(e){return"undefined"==typeof l[e]?l[e]=a(e):l[e]},checkTransitionAvailability:a}}(),t.supports.csp={isSupported:"undefined"!=typeof Blob&&"undefined"!=typeof URL,isNonceSupported:t.env.browser.name&&t.env.browser.version?!(t.env.browser.name.search("Safari")!=-1&&parseInt(t.env.browser.version)<10):null},function(){function e(){if(!window.WebGLRenderingContext)return!1;var e={"Samsung Internet":!0,AndroidBrowser:!0},n="Webkit"==t.env.browser.engine&&+t.env.browser.engineVersion<537;return!n&&!e[t.env.browser.name]}function n(){if(!e())return null;var n,t;try{var r=document.createElement("canvas");t=r.getContext(n="webgl",i),t||(t=r.getContext(n="experimental-webgl",i),t||(n=null))}catch(o){n=null}return n?{contextName:n,context:t}:null}function r(e,n){e.width=226,e.height=256,n.fillStyle="#fff",n.fillRect(0,0,150,150),n.globalCompositeOperation="xor",n.fillStyle="#f00",n.fillRect(10,10,100,100),n.fillStyle="#0f0",n.fillRect(50,50,100,100);for(var t=n.getImageData(49,49,2,2),r=[],i=0;i<16;i++)r.push(t.data[i]);return"0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255"==r.join("x")}var i={failIfMajorPerformanceCaveat:!0,antialias:!1},o={};t.supports.graphics={hasSvg:function(){return"svg"in o||(o.svg=document.implementation&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")),o.svg},hasCanvas:function(){if(!("canvas"in o)){var e=document.createElement("canvas"),n="getContext"in e?e.getContext("2d"):null;o.canvas=!!n&&r(e,n)}return o.canvas},hasWebGl:function(){return"webgl"in o||(o.webgl=n()),o.webgl},redetect:function(){o={}},getWebGlContextName:function(){return o.webgl&&o.webgl.contextName}}}(),function(){function e(){var e=!0;"MacOS"==t.env.browser.osFamily&&/^10\.[0-8](\.|$)/.test(t.env.browser.osVersion)&&(e=!1,n("OldMac"));var o=["requestAnimationFrame","Worker","URL","Blob","XMLHttpRequest","Set","Map","WebAssembly"];o.forEach(function(t){window[t]||(e=!1,n(t))}),"function"!=typeof Math.trunc&&(e=!1,n("MathTrunc"));var s=t.supports.graphics.hasWebGl();if(!s||"webgl"!==s.contextName)return n("hasWebGl"),!1;var a=s.context;0==a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS)&&(e=!1,n("MAX_VERTEX_TEXTURE_IMAGE_UNITS")),a.getExtension("OES_vertex_array_object")||(e=!1,n("OES_vertex_array_object")),a.getExtension("OES_standard_derivatives")||(e=!1,n("OES_standard_derivatives"));var u=a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT);if(u&&0!=u.precision||(e=!1,n("highp")),!r()){var c=i();e=!1,t.count("error",{path:["vectorEngine.drawPointsError",t.env.browser.platform,t.env.browser.name,c.vendor,c.renderer].join("."),share:1})}return e}function n(e){var n=i();t.count("error",{path:["vectorEngine.reasonsVectorNotSupported",e,t.env.browser.platform,t.env.browser.name,n.vendor,n.renderer].join("."),share:.1})}function r(){var e=document.createElement("canvas");e.width=1,e.height=1;var n=e.getContext("webgl",{alpha:!1,depth:!1,antialias:!1}),t=n.createShader(n.VERTEX_SHADER);n.shaderSource(t,"#version 100\nattribute vec2 p;\nvoid main() {\n gl_Position = vec4(p,0,1);\n gl_PointSize = 1.0;\n}"),n.compileShader(t);var r=n.createShader(n.FRAGMENT_SHADER);n.shaderSource(r,"#version 100\nvoid main() {\n gl_FragColor = vec4(1, 0, 0, 1);\n}"),n.compileShader(r);var i=n.createProgram();n.attachShader(i,t),n.attachShader(i,r),n.bindAttribLocation(i,0,"p"),n.linkProgram(i);var o=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,o),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,0]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.clearColor(0,1,0,1),n.clear(n.COLOR_BUFFER_BIT),n.useProgram(i),n.drawArrays(n.POINTS,0,1);var s=new Uint8Array(4);return n.readPixels(0,0,1,1,n.RGBA,n.UNSIGNED_BYTE,s),255===s[0]}function i(){var e={},n=t.supports.graphics.hasWebGl();if(!n)return e;var r=n.context,i=r.getExtension("WEBGL_debug_renderer_info");return i&&(e.vendor=r.getParameter(i.UNMASKED_VENDOR_WEBGL).replace(/\W/g,"_"),e.renderer=r.getParameter(i.UNMASKED_RENDERER_WEBGL).replace(/\W/g,"_")),e}var o;t.supports.vector={isSupported:function(){return void 0===o&&(o=e()),o}}}(),t.supports.printPatchNeeded=!t.supports.css.checkProperty("printColorAdjust"),t.logger=function(e){function n(e,n){var r="";return t.env.debug&&(r+="("+e+"): "),r+=n}var r={exports:{}},i=(r.exports,"Yandex Maps JS API");return r.exports={assert:function(e,r){e||t.env.debug&&console.log(n(i,r))},log:function(e){t.env.debug&&console.log(n(i,e))},notice:function(e){t.env.debug&&console.info(n(i,e))},warning:function(e){t.env.debug&&console.warn(n(i,e))},error:function(e){console.error(n(i,e))},exception:function(e,t){throw new Error(n(e,t))}},r.exports}(),function(){var e=t.env.browser;e.documentMode=document.documentMode,e.isIE="MSIE"==e.name||"IEMobile"==e.name,e.isEdge="Edge"==e.engine,e.isChromium=e.base&&"chromium"==e.base.toLocaleLowerCase(),e.isSafari="Safari"==e.name;var n="Edge"==e.engine||"MSIE"==e.name&&e.osVersion>6.1||"IEMobile"==e.name&&e.engineVersion>=6;n?e.eventMapper="pointer":e.eventMapper="touchMouse",e.androidBrokenBuild="AndroidBrowser"==e.name&&"534.30"==e.engineVersion;var r=window.devicePixelRatio||screen.deviceXDPI&&screen.deviceXDPI/96||1,i="iOS"===e.osFamily||"Safari"===e.name||"WebKit"===e.engine&&"Safari"===e.base;"MSIE"==e.name||"IEMobile"==e.name||"Android"==e.osFamily&&"Gecko"==e.engine||i||r>1&&r<2?e.graphicsRenderEngine="svg":e.graphicsRenderEngine="canvas",e.transformTransition="Android"==e.osFamily||"iOS"==e.osFamily||"MSIE"==e.name||e.isChromium,e.css3DTransform="WebKit"==e.engine&&!("Android"==e.osFamily&&parseFloat(e.osVersion)<3)||"Gecko"==e.engine&&parseInt(e.engineVersion.split(".")[0])>=10,e.unsupported="OperaMini"==e.name}();var s=function(e){function n(n){return e[n]}function t(e){this._config=e,this._sandbox=this._config.createSandbox(this),this._definitionsByName=Object.create(null),this._definitionsByStorage=Object.create(null),this._remoteLoadingAllowed=d.defer(),this._initialized=this._remoteLoadingAllowed.promise().then(function(){return this._loadBundle(this._config.initialBudleName)},this)}function r(e,n,t,r,i,o,s,a,u){this.state=e,this.alias=null,this.name=n,this.storage=t,this.key=r,this.depends=i,this.dynamicDepends=a,this.declaration=o,this.context=s,this.exports=e===m.DEFINED?u:void 0,this.resolvingPromise=void 0,this.fetchingDeferred=void 0}function i(e,n){if(!e.dynamicDepends)return h;var t=[];for(var r in e.dynamicDepends)if(p.call(e.dynamicDepends,r))for(var i=0,o=n.length;i<o;i++){var a=n[i];if(void 0!==a){var u=e.dynamicDepends[r](a);s(u)&&t.push(u)}}return t}function o(e,n,t){return p.call(e.dynamicDepends,n)?e.dynamicDepends[n].call(null,t):v}function s(e){return"string"==typeof e||u(e)}function a(e){return e&&"object"==typeof e?e.key+"@"+e.storage:String(e)}function u(e){return null!=e&&"object"==typeof e&&"string"==typeof e.key&&"string"==typeof e.storage}function c(e){var n=f.isArray(e);return"object"==typeof e&&!n&&p.call(e,"modules")?{modules:f.isArray(e.modules)?e.modules:[e.modules],data:e.data}:n?{modules:e}:{modules:[e]}}var l={exports:{}},d=(l.exports,n("vow")),f=n("./ym.utils"),p=Object.prototype.hasOwnProperty,v={},h=Object.freeze([]),m={MENTIONED:1,QUEUED:2,FETCHING:3,DECLARED:4,RESOLVING:5,ERROR:6,DEFINED:7};return l.exports=t,t.prototype.allowRemoteLoading=function(){this._remoteLoadingAllowed.resolve()},t.prototype.isDefined=function(e){return Boolean(this._findDefinition(e))},t.prototype.preload=function(e){return e},t.prototype.define=function(e,n,t,i){var o,s,a,u;if("object"==typeof e){var c=e;e=c.name,s=c.storage,o=c.key,n=c.depends,t=c.declaration,i=c.context,a=c.dynamicDepends,u=c.exports}else 2===arguments.length&&(t=n,n=null);var l=new r(m.DECLARED,e,s,o,n,t,i,a,u);this._define(l)},t.prototype.defineSync=function(e){var n=new r(m.DEFINED,e.name,e.storage,e.key,null,null,null,null,e.module);this._define(n)},t.prototype._define=function(e){function n(){var n=new Error("ymaps.modules: redefinition of "+e.name);throw console.error(n),n}var t=this._definitionsByName[e.name];if(t){if(t.state>=m.DECLARED)return;return t.state!==m.FETCHING&&n(),t.state=m.DECLARED,t.declaration=e.declaration,t.context=e.context,t.storage=e.storage,t.key=e.key,e.depends&&("function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),t.depends=e.depends),t.dynamicDepends=e.dynamicDepends,void(t.exports=e.exports)}"function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),e.depends=e.depends||h,this._definitionsByName[e.name]=e,this._saveDefinitionToStorage(e)},t.prototype._resolve=function(e,n){if(!e.dynamicDepends){if(e.state===m.DEFINED)return d.resolve(e.exports);if(e.state===m.ERROR)return d.reject(e.exports)}e.state<m.RESOLVING&&!e.resolvingPromise&&(e.resolvingPromise=this._resolveCore(e,n).always(function(n){return e.resolvingPromise=void 0,n}));var t=i(e,[n]);return d.all([e.resolvingPromise,this._require(t,n)]).then(function(){return e.state===m.DEFINED?d.resolve(e.exports):d.reject(e.exports)})},t.prototype._resolveCore=function(e,n){return this._fetchModule(e,n).then(function(){return e.state=m.RESOLVING,this._require(e.depends,n)},this).then(function(n){function t(n,t){e.state===m.RESOLVING&&(e.state=t?m.ERROR:m.DEFINED,e.exports=t||n),i&&i.resolve(),t&&console.warn("ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `"+e.name+"`.")}var r,i;t.async=function(n){e.state===m.RESOLVING&&(r=n.then(function(e){t(e)},function(e){t(void 0,e)}))},t.provide=t,t.provideAsync=t.async,t.dynamicDepends=e.dynamicDepends?{getValue:function(n,t){var r=o(e,n,t);return r===v?d.reject(new Error("ymaps.modules: dynamic dependency `"+n+"` is not declared.")):s(r)?this._require([r],t):d.resolve([r])}.bind(this),getValueSync:function(n,t){var r=o(e,n,t);if(!s(r))return r;var i=this._findDefinition(r);return i?this._requireSingleSync(i,t):void 0}.bind(this)}:null;var a=e.context||{name:e.name,depends:e.depends};try{e.declaration.apply(a,[t].concat(n))}catch(u){return e.state=m.ERROR,void(e.exports=u)}return r?r:e.state!==m.DEFINED&&e.state!==m.ERROR?(console.warn("ymaps.modules: asynchronous provide is deprecated and will be removed. Module `"+e.name+"`."),i=d.defer(),i.promise()):void 0},this)},t.prototype.require=function(e,n,t,r){var i="object"==typeof e&&!f.isArray(e),o=1===arguments.length;i&&(n=e.successCallback,t=e.errorCallback,r=e.context,o=!n&&!t),e=c(e);var s=this._require(e.modules,e.data);return o?s:void s.spread(n,t,r)},t.prototype.requireSync=function(e){if(e=c(e),1!==e.modules.length)throw new Error("ymaps.modules: only one module can be required synchronously.");var n=this._findDefinition(e.modules[0]);return n&&this._requireSingleSync(n,e.data)},t.prototype._requireSingleSync=function(e,n){for(var t=i(e,[n]),r=0,o=t.length;r<o;r++){var s=this._findDefinition(t[r]);if(!s||!this._requireSingleSync(s,n))return}return e.state===m.DEFINED?e.exports:void 0},t.prototype._require=function(e,n){var t=e.map(function(e){return this._requireSingle(e,n)},this);return d.all(t)},t.prototype._requireSingle=function(e,n){var t=this._findDefinition(e);return t?this._resolve(t,n):this._initialized.then(function(){var t=this._findDefinition(e);return t?this._resolve(t,n):d.reject(new Error("ymaps.modules: module `"+a(e)+"` is not defined."))},this)},t.prototype._findDefinition=function(e){if("undefined"!=typeof e)return"string"==typeof e?this._definitionsByName[e]:this._definitionsByStorage[e.storage]&&this._definitionsByStorage[e.storage][e.key]},t.prototype._saveDefinitionToStorage=function(e,n){if(e.key&&e.storage){n=n||{key:e.key,storage:e.storage};for(var t=f.isArray(n.key)?n.key:[n.key],r=0,i=t.length;r<i;r++)this._definitionsByStorage[n.storage]=this._definitionsByStorage[n.storage]||{},this._definitionsByStorage[n.storage][t[r]]=e}},t.prototype._fetchModule=function(e){return e.state>=m.DECLARED?d.resolve():this._loadFullBundle()},t.prototype._loadFullBundle=function(){if(!this._fullBundlePromise){for(var e in this._definitionsByName)this._definitionsByName[e].state===m.MENTIONED&&(this._definitionsByName[e].state=m.FETCHING);this._fullBundlePromise=this._loadBundle("full")}return this._fullBundlePromise},t.prototype._loadBundle=function(e){return this._config.fetchBundle(e).then(function(e){function n(){return d.delay().then(function(){var e=i.splice(0,o);if(e.forEach(function(e){e(t)}),i.length>0)return n()})}e.missingModules.forEach(function(e){var n=new r(m.MENTIONED,e,(void 0),(void 0),[],null,null,(void 0));this._definitionsByName[e]=n},this);var t=this._sandbox,i=e.modules,o=400;return n()},this)["catch"](function(n){throw console.error('ymaps: Failed to bundle "'+e+'".'+(n?n.stack||n.message||"":"")),n})},t.prototype._loadModulesMap=function(){return this._config.fetchMap().spread(function(e,n){this._processLoadedMap(e),n()},this)},l.exports}({vow:t.vow,"./ym.utils":t.utils}),a=t.env.server.url+"/"+t.env.server.path.replace(/\/$/,"")+"/images/";t.modules=new s({dependenciesContext:t,initialBudleName:t.env.preload.bundle,fetchBundle:function(e){var r=("__ymaps_"+t.env.namespace+"_"+Date.now()).replace(/\W/g,"_");n[r]=t.ns;var i=document.createElement("script");i.src=t.env.bundles.BASE+t.env.bundles[e],i.setAttribute("data-ymaps-api-ns",r),i.setAttribute("data-ymaps-api-version","2.1.78"),i.async=!0;var o=t.vow.defer();return i.onerror=o.reject.bind(o),t.ns.__provideBundle=o.resolve.bind(o),document.head.appendChild(i),o.promise().always(function(e){return delete n[r],e})},createSandbox:function(e){var n=Object.create(e);return n.importImages=function(e){return{get:function(n){return a+e[n].src}}},t.utils.extend({},t,{modules:n})}}),t.ns.load=function(e,n,r,i){return"function"==typeof e?n?t.ns.ready(["package.full"],e,n):t.ns.ready(["package.full"],e):("string"==typeof e&&(e=[e]),t.ns.ready.apply(this,arguments))},function(){function e(e){return function(){console.warn("{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.".replace(/\{NS\}/g,t.env.namespace).replace(/\{FN\}/g,e));var n=t.modules[e].apply(t.modules,arguments);return n===t.modules?t.ns.modules:n}}t.ns.modules={require:function(){return t.modules.require.apply(t.modules,arguments)},isDefined:function(){return t.modules.isDefined.apply(t.modules,arguments)},requireSync:function(){return t.modules.requireSync.apply(t.modules,arguments)},define:function(e,n,r,i){return t.modules.define.apply(t.modules,arguments),t.ns.modules},defineSync:e("defineSync"),getDefinition:e("getDefinition"),getState:e("getState"),setOptions:e("setOptions"),flush:e("flush"),nextTick:e("nextTick"),watchResolving:e("watchResolving"),__modules:t.modules}}(),function(e){function n(){l&&(t.performance.saveMeasure("ymaps.readyDelay",t.performance.now()-t.performance.initTimings.responseEnd),l=!1);var e=t.performance.startMeasure("ymaps.ready"),n={};arguments.length&&(1!=arguments.length||"object"!=typeof arguments[0]||arguments[0].length?"function"!=typeof arguments[0]?(n.require="string"==typeof arguments[0]?[arguments[0]]:arguments[0],n.successCallback=arguments[1],n.errorCallback=arguments[2]&&"function"==typeof arguments[2]?arguments[2]:null,n.context=arguments[2]&&"object"==typeof arguments[2]?arguments[2]:arguments[3]):(n.successCallback=arguments[0],n.errorCallback=arguments[1]&&"function"==typeof arguments[1]?arguments[1]:null,n.context=arguments[1]&&"object"==typeof arguments[1]?arguments[1]:arguments[2]):n=arguments[0]);var r=n.require||[],i=o.all([t.modules.require(r),u,c]).spread(function(n){return t.utils.registerImports(t.ns,r,n),e.finish(),t.ns});return i.then(n.successCallback&&function(e){setTimeout(n.successCallback.bind(n.context),0,e)},n.errorCallback&&function(e){setTimeout(n.errorCallback.bind(n.context),0,e)}),i}function r(n,t){if(n){var r=i(e,n);r&&setTimeout(function(){r.method.call(r.context,t)})}}function i(e,n){var t=e;n=n.split(".");for(var r=0,i=n.length-1;r<i;r++)if(t=t[n[r]],!t)return;return{method:t[n[i]],context:t}}var o=t.vow,s=[].concat(["package.system"],t.env.preload.load.split(",").filter(Boolean)),a=t.performance.startMeasure("ymaps.preload"),u=t.modules.require(s).then(function(e){t.utils.registerImports(t.ns,s,e),a.finish(),r(t.env.preload.onLoad,t.ns)},function(e){return r(t.env.preload.onError,e),o.reject(e)}),c="complete"===document.readyState||"interactive"===document.readyState?o.resolve():new o.Promise(function(e){document.addEventListener("DOMContentLoaded",e,!1),document.addEventListener("load",e,!1)});t.ns.ready=n;var l=!0}(this),t.env.server.params.csp&&!t.supports.csp.isSupported&&t.logger.warning("CSP is not suported in this browser"),t.modules.define("vectorEngine.loadEngine",["vow","Hotspot","Monitor","collection.Item","event.Manager","hotspot.layer.Hint","hotspot.layer.optionMapper","interactivityModel.EventController","interactivityModel.layer","option.Manager","poi.BalloonManager","util.shapeFactory"],function(e,n){function r(){var e=n.defer(),r=document.createElement("script");return r.onload=e.resolve.bind(e),r.onerror=e.reject.bind(e),r.src=t.env.hosts.vectorIndex.replace("{{version}}",t.env.vectorVersion),t.env.vectorEngineFileName&&(r.src=r.src.replace("vector.min.js",t.env.vectorEngineFileName)),document.head.insertAdjacentElement("afterbegin",r),e.promise()["catch"](function(){return n.reject(new Error("Failed to load vector engine"))})}if("ymaps"!==t.env.namespace)throw new Error("Vector supports only `ymaps` namespace.");if(null==t.env.vectorVersion)throw new Error("No vector version.");var i=null;e(function(){return i=i||r()})}),t.modules.define("vectorEngine.preload",[],function(e){t.supports.vector.isSupported()&&t.modules.require(["vectorEngine.loadEngine"]).spread(function(e){e()}),e({})}),t.modules.allowRemoteLoading(),o&&(o.parent[o.name]=t.ns),t.performance.init({url:t.env.hosts.api.statCounter+"/counter",data:"/path="+t.env.version.replace(/\W/g,"_")+"."+t.env.browser.platform,enable:"all"==t.env.counters||Math.random()<r&&!t.env.server.params.debug,initUrl:document.currentScript&&document.currentScript.src,useSendBeacon:!t.env.server.params.csp}),t.env.hasValidApiKey||(t.env.apikey=void 0,"undefined"!=typeof t.env.hasValidApiKey&&console.warn("(Yandex Maps JS API): Invalid API key")),i.finish()})({"vectorVersion":"5.15.2","vectorVersionTimestamp":1620814269072,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/release","params":{"mode":"release","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"release","debug":false,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.93","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"stv":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"sta":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"trf":{"version":"1620814200","scaled":true},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"a005daa235b407b431a9b150bb3ea073","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/release/panoramas-8d02ed1377a16bfcc73b4950c04e42d8bed31c02.js","full":"/release/full-ffb813a29f30feadb63b5654242d042b7b6a91aa.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null) | |
resolve(); | |
} catch (e) { | |
console.error(e); | |
reject('API loading failed'); | |
} | |
} | |
function setup () { | |
L.Yandex.include({ | |
_loadScript: function (url) { | |
return new Promise(function (resolve, reject) { | |
var script = document.createElement('script'); | |
script.onload = resolve; | |
script.onerror = function () { | |
console.warn('Error loading Yandex maps jsapi. Trying to load embedded script...') | |
loadlocal(resolve, reject); | |
}; | |
script.src = url; | |
document.body.appendChild(script); | |
}); | |
} | |
}); | |
} | |
setup.priority = 'low'; | |
setup.info = plugin_info; //add the script info data to the function as a property | |
if(!window.bootPlugins) window.bootPlugins = []; | |
window.bootPlugins.push(setup); | |
// if IITC has already booted, immediately run the 'setup' function | |
if(window.iitcLoaded && typeof setup === 'function') setup(); | |
} // wrapper end | |
// inject code into site context | |
var script = document.createElement('script'); | |
var info = {}; | |
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; | |
script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); | |
(document.body || document.head || document.documentElement).appendChild(script); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function ymapsInit (env) { | |
var global = this; | |
var ym = { | |
ns: {}, | |
supports: {}, | |
env: env | |
}; | |
var PERFORMANCE_SHARE = 0.01; | |
ym.performance = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
var performance = window.performance || Object.create(null); | |
var now = performance.now ? performance.now.bind(performance) : function () { return Date.now(); }; | |
var getResourceTimings = !performance.getEntriesByType ? function () {} : | |
function getResourceTimings (url) { | |
return performance.getEntriesByType('resource').filter(function (x) { return x.name === url; })[0]; | |
}; | |
var url, dataBase, useSendBeacon, enable; | |
var pendingResourceMeasures = {}; | |
var pendingMeasures = {}; | |
var RESOURCE_MAP = { initjs: 'i', mapjs: 'm', combine_s: 'cs', combine_m: 'cm', combine_l: 'cl' }; | |
var TIMING_MAP = { eval: 'e', duration: 'd', cached: 'c', encodedSize: 'esz', decodedSize: 'dsz', responseDuration: 'res', requestDuration: 'req' }; | |
var ymPerformance = { | |
statistics: { | |
combine: { | |
total: 0, | |
size: 0, | |
modules: 0 | |
} | |
}, | |
initTimings: {}, | |
now: now, | |
getResourceTimings: function (url) { return getResourceTimings(url) || {}; }, | |
init: function (options) { | |
url = options.url; | |
dataBase = '/pid=443/cid=73188/dtype=stred' + options.data; | |
useSendBeacon = Boolean(options.useSendBeacon && navigator.sendBeacon); | |
enable = options.enable; | |
ymPerformance.initTimings = ymPerformance.getResourceTimings(options.initUrl); | |
ymPerformance.saveResourceTimings('initjs', ymPerformance.initTimings, { size: false, cached: false }); | |
}, | |
/** Saves measure to count it later. Prioritizes non-resources over resources (name starts with @). */ | |
saveMeasure: function (name, value) { | |
if (!enable) { | |
return; | |
} | |
var isResource = /^@/.test(name); | |
if (isResource) { | |
// Make resources name shorter. | |
var parts = name.replace(/^@/, '').split('.'); | |
name = (RESOURCE_MAP[parts[0]] || parts[0]) + '.' + (TIMING_MAP[parts[1]] || parts[1]); | |
} | |
value = Math.round(value); | |
if (!isNaN(value)) { | |
var pending = isResource ? pendingResourceMeasures : pendingMeasures; | |
pending[name] = pending[name] || []; | |
pending[name].push(value); | |
enqueueFlush(); | |
} | |
}, | |
startMeasure: function (name, start) { | |
start = typeof start === 'undefined' ? now() : start; | |
var finished = false; | |
return { | |
finish: function (end) { | |
if (!finished) { | |
end = typeof end === 'undefined' ? now() : end; | |
ymPerformance.saveMeasure(name, end - start); | |
finished = true; | |
} | |
} | |
}; | |
}, | |
/** Saves all available measures for resource. */ | |
saveResourceTimings: function (name, filterOrTimings, options) { | |
var timings = typeof filterOrTimings === 'object' ? filterOrTimings : getResourceTimings(filterOrTimings); | |
if (!timings) { | |
return; | |
} | |
options = options || {}; | |
name = name.replace(/^@?/, '@'); | |
this.saveMeasure(name + '.duration', timings.duration); | |
if (!timings.responseStart) { | |
// Timing-Allow-Origin is not working, nothing to measure. | |
return; | |
} | |
var cached = timings.transferSize === 0 ? 1 : 0; | |
this.saveMeasure(name + '.responseDuration', timings.responseEnd - timings.responseStart); | |
this.saveMeasure(name + '.requestDuration', timings.responseStart - timings.requestStart); | |
if (options.cached !== false) { | |
this.saveMeasure(name + '.cached', cached); | |
} | |
if (options.size !== false && !cached) { | |
this.saveMeasure(name + '.encodedSize', timings.encodedBodySize / 1024); | |
this.saveMeasure(name + '.decodedSize', timings.decodedBodySize / 1024); | |
} | |
} | |
}; | |
var BATCH_SIZE = 40; | |
var BATCH_TIMEOUT = 5000; | |
var nextFlushTimer = null; | |
function enqueueFlush () { | |
nextFlushTimer = nextFlushTimer || setTimeout(flush, BATCH_TIMEOUT); | |
} | |
function flush () { | |
clearTimeout(nextFlushTimer); | |
nextFlushTimer = null; | |
var batch = getNextBatch(); | |
if (!batch) { | |
return; | |
} | |
var data = dataBase + '/vars=' + batch + '/*'; | |
if (!useSendBeacon || !navigator.sendBeacon(url, data)) { | |
var img = new Image(); | |
var rnd = (new Date()).getTime() + Math.round(Math.random() * 100); | |
img.src = url + '/rnd=' + rnd + data; | |
} | |
enqueueFlush(); | |
} | |
function getNextBatch () { | |
var batch = []; | |
// Prioritize non-resource measures over resource measures. | |
fillBatch(batch, pendingMeasures); | |
fillBatch(batch, pendingResourceMeasures); | |
return batch.join(','); | |
} | |
function fillBatch (batch, measures) { | |
for (var key in measures) { | |
if (measures.hasOwnProperty(key) && measures[key].length) { | |
batch.push(key + '=' + measures[key].shift()); | |
if (batch.length >= BATCH_SIZE) { | |
return; | |
} | |
} | |
} | |
} | |
window.addEventListener('beforeunload', function () { | |
ymPerformance.saveMeasure('combine.total', ymPerformance.statistics.combine.total); | |
ymPerformance.saveMeasure('combine.modules', ymPerformance.statistics.combine.modules); | |
ymPerformance.saveMeasure('combine.size', ymPerformance.statistics.combine.size / 1024); | |
flush(); | |
}); | |
module.exports = ymPerformance; | |
return module.exports; | |
})(); | |
var initEvalMeasure = ym.performance.startMeasure('@initjs.eval'); | |
ym.count = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
// Store counts in queue until real counter is loaded. | |
var queue = []; | |
function enqueueCount () { queue.push(arguments); } | |
// Add another level of indirection because Sandbox runs modules not with | |
// ym itself, but with its clone. | |
var countImplementation = null; | |
var count = function () { | |
(countImplementation || enqueueCount).apply(null, arguments); | |
}; | |
// Replace queue counter with real implementation. | |
count.provideImplementation = function (getImplementation) { | |
if (countImplementation) { | |
throw new Error('ym.count: implementation was already provided.'); | |
} | |
countImplementation = getImplementation(queue); | |
}; | |
module.exports = count; | |
return module.exports; | |
})(); | |
ym.vow = ym.ns.vow = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
/** | |
* @module vow | |
* @author Filatov Dmitry <dfilatov@yandex-team.ru> | |
* @version 0.4.13 | |
* @license | |
* Dual licensed under the MIT and GPL licenses: | |
* * http://www.opensource.org/licenses/mit-license.php | |
* * http://www.gnu.org/licenses/gpl.html | |
*/ | |
(function(global) { | |
var undef, | |
nextTick = (function() { | |
var fns = [], | |
enqueueFn = function(fn) { | |
fns.push(fn); | |
return fns.length === 1; | |
}, | |
callFns = function() { | |
var fnsToCall = fns, i = 0, len = fns.length; | |
fns = []; | |
while(i < len) { | |
fnsToCall[i++](); | |
} | |
}; | |
if(typeof setImmediate === 'function') { // ie10, nodejs >= 0.10 | |
return function(fn) { | |
enqueueFn(fn) && setImmediate(callFns); | |
}; | |
} | |
if(typeof process === 'object' && process.nextTick) { // nodejs < 0.10 | |
return function(fn) { | |
enqueueFn(fn) && process.nextTick(callFns); | |
}; | |
} | |
var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; // modern browsers | |
if(MutationObserver) { | |
var num = 1, | |
node = document.createTextNode(''); | |
new MutationObserver(callFns).observe(node, { characterData : true }); | |
return function(fn) { | |
enqueueFn(fn) && (node.data = (num *= -1)); | |
}; | |
} | |
if(global.postMessage) { | |
var isPostMessageAsync = true; | |
if(global.attachEvent) { | |
var checkAsync = function() { | |
isPostMessageAsync = false; | |
}; | |
global.attachEvent('onmessage', checkAsync); | |
global.postMessage('__checkAsync', '*'); | |
global.detachEvent('onmessage', checkAsync); | |
} | |
if(isPostMessageAsync) { | |
var msg = '__promise' + Math.random() + '_' +new Date, | |
onMessage = function(e) { | |
if(e.data === msg) { | |
e.stopPropagation && e.stopPropagation(); | |
callFns(); | |
} | |
}; | |
global.addEventListener? | |
global.addEventListener('message', onMessage, true) : | |
global.attachEvent('onmessage', onMessage); | |
return function(fn) { | |
enqueueFn(fn) && global.postMessage(msg, '*'); | |
}; | |
} | |
} | |
var doc = global.document; | |
if('onreadystatechange' in doc.createElement('script')) { // ie6-ie8 | |
var createScript = function() { | |
var script = doc.createElement('script'); | |
script.onreadystatechange = function() { | |
script.parentNode.removeChild(script); | |
script = script.onreadystatechange = null; | |
callFns(); | |
}; | |
(doc.documentElement || doc.body).appendChild(script); | |
}; | |
return function(fn) { | |
enqueueFn(fn) && createScript(); | |
}; | |
} | |
return function(fn) { // old browsers | |
enqueueFn(fn) && setTimeout(callFns, 0); | |
}; | |
})(), | |
throwException = function(e) { | |
nextTick(function() { | |
throw e; | |
}); | |
}, | |
isFunction = function(obj) { | |
return typeof obj === 'function'; | |
}, | |
isObject = function(obj) { | |
return obj !== null && typeof obj === 'object'; | |
}, | |
toStr = Object.prototype.toString, | |
isArray = Array.isArray || function(obj) { | |
return toStr.call(obj) === '[object Array]'; | |
}, | |
getArrayKeys = function(arr) { | |
var res = [], | |
i = 0, len = arr.length; | |
while(i < len) { | |
res.push(i++); | |
} | |
return res; | |
}, | |
getObjectKeys = Object.keys || function(obj) { | |
var res = []; | |
for(var i in obj) { | |
obj.hasOwnProperty(i) && res.push(i); | |
} | |
return res; | |
}, | |
defineCustomErrorType = function(name) { | |
var res = function(message) { | |
this.name = name; | |
this.message = message; | |
}; | |
res.prototype = new Error(); | |
return res; | |
}, | |
wrapOnFulfilled = function(onFulfilled, idx) { | |
return function(val) { | |
onFulfilled.call(this, val, idx); | |
}; | |
}; | |
/** | |
* @class Deferred | |
* @exports vow:Deferred | |
* @description | |
* The `Deferred` class is used to encapsulate newly-created promise object along with functions that resolve, reject or notify it. | |
*/ | |
/** | |
* @constructor | |
* @description | |
* You can use `vow.defer()` instead of using this constructor. | |
* | |
* `new vow.Deferred()` gives the same result as `vow.defer()`. | |
*/ | |
var Deferred = function() { | |
this._promise = new Promise(); | |
}; | |
Deferred.prototype = /** @lends Deferred.prototype */{ | |
/** | |
* Returns the corresponding promise. | |
* | |
* @returns {vow:Promise} | |
*/ | |
promise : function() { | |
return this._promise; | |
}, | |
/** | |
* Resolves the corresponding promise with the given `value`. | |
* | |
* @param {*} value | |
* | |
* @example | |
* ```js | |
* var defer = vow.defer(), | |
* promise = defer.promise(); | |
* | |
* promise.then(function(value) { | |
* // value is "'success'" here | |
* }); | |
* | |
* defer.resolve('success'); | |
* ``` | |
*/ | |
resolve : function(value) { | |
this._promise.isResolved() || this._promise._resolve(value); | |
}, | |
/** | |
* Rejects the corresponding promise with the given `reason`. | |
* | |
* @param {*} reason | |
* | |
* @example | |
* ```js | |
* var defer = vow.defer(), | |
* promise = defer.promise(); | |
* | |
* promise.fail(function(reason) { | |
* // reason is "'something is wrong'" here | |
* }); | |
* | |
* defer.reject('something is wrong'); | |
* ``` | |
*/ | |
reject : function(reason) { | |
if(this._promise.isResolved()) { | |
return; | |
} | |
if(vow.isPromise(reason)) { | |
reason = reason.then(function(val) { | |
var defer = vow.defer(); | |
defer.reject(val); | |
return defer.promise(); | |
}); | |
this._promise._resolve(reason); | |
} | |
else { | |
this._promise._reject(reason); | |
} | |
}, | |
/** | |
* Notifies the corresponding promise with the given `value`. | |
* | |
* @param {*} value | |
* | |
* @example | |
* ```js | |
* var defer = vow.defer(), | |
* promise = defer.promise(); | |
* | |
* promise.progress(function(value) { | |
* // value is "'20%'", "'40%'" here | |
* }); | |
* | |
* defer.notify('20%'); | |
* defer.notify('40%'); | |
* ``` | |
*/ | |
notify : function(value) { | |
this._promise.isResolved() || this._promise._notify(value); | |
} | |
}; | |
var PROMISE_STATUS = { | |
PENDING : 0, | |
RESOLVED : 1, | |
FULFILLED : 2, | |
REJECTED : 3 | |
}; | |
/** | |
* @class Promise | |
* @exports vow:Promise | |
* @description | |
* The `Promise` class is used when you want to give to the caller something to subscribe to, | |
* but not the ability to resolve or reject the deferred. | |
*/ | |
/** | |
* @constructor | |
* @param {Function} resolver See https://github.com/domenic/promises-unwrapping/blob/master/README.md#the-promise-constructor for details. | |
* @description | |
* You should use this constructor directly only if you are going to use `vow` as DOM Promises implementation. | |
* In other case you should use `vow.defer()` and `defer.promise()` methods. | |
* @example | |
* ```js | |
* function fetchJSON(url) { | |
* return new vow.Promise(function(resolve, reject, notify) { | |
* var xhr = new XMLHttpRequest(); | |
* xhr.open('GET', url); | |
* xhr.responseType = 'json'; | |
* xhr.send(); | |
* xhr.onload = function() { | |
* if(xhr.response) { | |
* resolve(xhr.response); | |
* } | |
* else { | |
* reject(new TypeError()); | |
* } | |
* }; | |
* }); | |
* } | |
* ``` | |
*/ | |
var Promise = function(resolver) { | |
this._value = undef; | |
this._status = PROMISE_STATUS.PENDING; | |
this._fulfilledCallbacks = []; | |
this._rejectedCallbacks = []; | |
this._progressCallbacks = []; | |
if(resolver) { // NOTE: see https://github.com/domenic/promises-unwrapping/blob/master/README.md | |
var _this = this, | |
resolverFnLen = resolver.length; | |
resolver( | |
function(val) { | |
_this.isResolved() || _this._resolve(val); | |
}, | |
resolverFnLen > 1? | |
function(reason) { | |
_this.isResolved() || _this._reject(reason); | |
} : | |
undef, | |
resolverFnLen > 2? | |
function(val) { | |
_this.isResolved() || _this._notify(val); | |
} : | |
undef); | |
} | |
}; | |
Promise.prototype = /** @lends Promise.prototype */ { | |
/** | |
* Returns the value of the fulfilled promise or the reason in case of rejection. | |
* | |
* @returns {*} | |
*/ | |
valueOf : function() { | |
return this._value; | |
}, | |
/** | |
* Returns `true` if the promise is resolved. | |
* | |
* @returns {Boolean} | |
*/ | |
isResolved : function() { | |
return this._status !== PROMISE_STATUS.PENDING; | |
}, | |
/** | |
* Returns `true` if the promise is fulfilled. | |
* | |
* @returns {Boolean} | |
*/ | |
isFulfilled : function() { | |
return this._status === PROMISE_STATUS.FULFILLED; | |
}, | |
/** | |
* Returns `true` if the promise is rejected. | |
* | |
* @returns {Boolean} | |
*/ | |
isRejected : function() { | |
return this._status === PROMISE_STATUS.REJECTED; | |
}, | |
/** | |
* Adds reactions to the promise. | |
* | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified | |
* @param {Object} [ctx] Context of the callbacks execution | |
* @returns {vow:Promise} A new promise, see https://github.com/promises-aplus/promises-spec for details | |
*/ | |
then : function(onFulfilled, onRejected, onProgress, ctx) { | |
var defer = new Deferred(); | |
this._addCallbacks(defer, onFulfilled, onRejected, onProgress, ctx); | |
return defer.promise(); | |
}, | |
/** | |
* Adds only a rejection reaction. This method is a shorthand for `promise.then(undefined, onRejected)`. | |
* | |
* @param {Function} onRejected Callback that will be called with a provided 'reason' as argument after the promise has been rejected | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
'catch' : function(onRejected, ctx) { | |
return this.then(undef, onRejected, ctx); | |
}, | |
/** | |
* Adds only a rejection reaction. This method is a shorthand for `promise.then(null, onRejected)`. It's also an alias for `catch`. | |
* | |
* @param {Function} onRejected Callback to be called with the value after promise has been rejected | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
fail : function(onRejected, ctx) { | |
return this.then(undef, onRejected, ctx); | |
}, | |
/** | |
* Adds a resolving reaction (for both fulfillment and rejection). | |
* | |
* @param {Function} onResolved Callback that will be invoked with the promise as an argument, after the promise has been resolved. | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
always : function(onResolved, ctx) { | |
var _this = this, | |
cb = function() { | |
return onResolved.call(this, _this); | |
}; | |
return this.then(cb, cb, ctx); | |
}, | |
/** | |
* Adds a progress reaction. | |
* | |
* @param {Function} onProgress Callback that will be called with a provided value when the promise has been notified | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
progress : function(onProgress, ctx) { | |
return this.then(undef, undef, onProgress, ctx); | |
}, | |
/** | |
* Like `promise.then`, but "spreads" the array into a variadic value handler. | |
* It is useful with the `vow.all` and the `vow.allResolved` methods. | |
* | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Object} [ctx] Context of the callbacks execution | |
* @returns {vow:Promise} | |
* | |
* @example | |
* ```js | |
* var defer1 = vow.defer(), | |
* defer2 = vow.defer(); | |
* | |
* vow.all([defer1.promise(), defer2.promise()]).spread(function(arg1, arg2) { | |
* // arg1 is "1", arg2 is "'two'" here | |
* }); | |
* | |
* defer1.resolve(1); | |
* defer2.resolve('two'); | |
* ``` | |
*/ | |
spread : function(onFulfilled, onRejected, ctx) { | |
return this.then( | |
function(val) { | |
return onFulfilled.apply(this, val); | |
}, | |
onRejected, | |
ctx); | |
}, | |
/** | |
* Like `then`, but terminates a chain of promises. | |
* If the promise has been rejected, this method throws it's "reason" as an exception in a future turn of the event loop. | |
* | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified | |
* @param {Object} [ctx] Context of the callbacks execution | |
* | |
* @example | |
* ```js | |
* var defer = vow.defer(); | |
* defer.reject(Error('Internal error')); | |
* defer.promise().done(); // exception to be thrown | |
* ``` | |
*/ | |
done : function(onFulfilled, onRejected, onProgress, ctx) { | |
this | |
.then(onFulfilled, onRejected, onProgress, ctx) | |
.fail(throwException); | |
}, | |
/** | |
* Returns a new promise that will be fulfilled in `delay` milliseconds if the promise is fulfilled, | |
* or immediately rejected if the promise is rejected. | |
* | |
* @param {Number} delay | |
* @returns {vow:Promise} | |
*/ | |
delay : function(delay) { | |
var timer, | |
promise = this.then(function(val) { | |
var defer = new Deferred(); | |
timer = setTimeout( | |
function() { | |
defer.resolve(val); | |
}, | |
delay); | |
return defer.promise(); | |
}); | |
promise.always(function() { | |
clearTimeout(timer); | |
}); | |
return promise; | |
}, | |
/** | |
* Returns a new promise that will be rejected in `timeout` milliseconds | |
* if the promise is not resolved beforehand. | |
* | |
* @param {Number} timeout | |
* @returns {vow:Promise} | |
* | |
* @example | |
* ```js | |
* var defer = vow.defer(), | |
* promiseWithTimeout1 = defer.promise().timeout(50), | |
* promiseWithTimeout2 = defer.promise().timeout(200); | |
* | |
* setTimeout( | |
* function() { | |
* defer.resolve('ok'); | |
* }, | |
* 100); | |
* | |
* promiseWithTimeout1.fail(function(reason) { | |
* // promiseWithTimeout to be rejected in 50ms | |
* }); | |
* | |
* promiseWithTimeout2.then(function(value) { | |
* // promiseWithTimeout to be fulfilled with "'ok'" value | |
* }); | |
* ``` | |
*/ | |
timeout : function(timeout) { | |
var defer = new Deferred(), | |
timer = setTimeout( | |
function() { | |
defer.reject(new vow.TimedOutError('timed out')); | |
}, | |
timeout); | |
this.then( | |
function(val) { | |
defer.resolve(val); | |
}, | |
function(reason) { | |
defer.reject(reason); | |
}); | |
defer.promise().always(function() { | |
clearTimeout(timer); | |
}); | |
return defer.promise(); | |
}, | |
_vow : true, | |
_resolve : function(val) { | |
if(this._status > PROMISE_STATUS.RESOLVED) { | |
return; | |
} | |
if(val === this) { | |
this._reject(TypeError('Can\'t resolve promise with itself')); | |
return; | |
} | |
this._status = PROMISE_STATUS.RESOLVED; | |
if(val && !!val._vow) { // shortpath for vow.Promise | |
val.isFulfilled()? | |
this._fulfill(val.valueOf()) : | |
val.isRejected()? | |
this._reject(val.valueOf()) : | |
val.then( | |
this._fulfill, | |
this._reject, | |
this._notify, | |
this); | |
return; | |
} | |
if(isObject(val) || isFunction(val)) { | |
var then; | |
try { | |
then = val.then; | |
} | |
catch(e) { | |
this._reject(e); | |
return; | |
} | |
if(isFunction(then)) { | |
var _this = this, | |
isResolved = false; | |
try { | |
then.call( | |
val, | |
function(val) { | |
if(isResolved) { | |
return; | |
} | |
isResolved = true; | |
_this._resolve(val); | |
}, | |
function(err) { | |
if(isResolved) { | |
return; | |
} | |
isResolved = true; | |
_this._reject(err); | |
}, | |
function(val) { | |
_this._notify(val); | |
}); | |
} | |
catch(e) { | |
isResolved || this._reject(e); | |
} | |
return; | |
} | |
} | |
this._fulfill(val); | |
}, | |
_fulfill : function(val) { | |
if(this._status > PROMISE_STATUS.RESOLVED) { | |
return; | |
} | |
this._status = PROMISE_STATUS.FULFILLED; | |
this._value = val; | |
this._callCallbacks(this._fulfilledCallbacks, val); | |
this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef; | |
}, | |
_reject : function(reason) { | |
if(this._status > PROMISE_STATUS.RESOLVED) { | |
return; | |
} | |
this._status = PROMISE_STATUS.REJECTED; | |
this._value = reason; | |
this._callCallbacks(this._rejectedCallbacks, reason); | |
this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef; | |
}, | |
_notify : function(val) { | |
this._callCallbacks(this._progressCallbacks, val); | |
}, | |
_addCallbacks : function(defer, onFulfilled, onRejected, onProgress, ctx) { | |
if(onRejected && !isFunction(onRejected)) { | |
ctx = onRejected; | |
onRejected = undef; | |
} | |
else if(onProgress && !isFunction(onProgress)) { | |
ctx = onProgress; | |
onProgress = undef; | |
} | |
var cb; | |
if(!this.isRejected()) { | |
cb = { defer : defer, fn : isFunction(onFulfilled)? onFulfilled : undef, ctx : ctx }; | |
this.isFulfilled()? | |
this._callCallbacks([cb], this._value) : | |
this._fulfilledCallbacks.push(cb); | |
} | |
if(!this.isFulfilled()) { | |
cb = { defer : defer, fn : onRejected, ctx : ctx }; | |
this.isRejected()? | |
this._callCallbacks([cb], this._value) : | |
this._rejectedCallbacks.push(cb); | |
} | |
if(this._status <= PROMISE_STATUS.RESOLVED) { | |
this._progressCallbacks.push({ defer : defer, fn : onProgress, ctx : ctx }); | |
} | |
}, | |
_callCallbacks : function(callbacks, arg) { | |
var len = callbacks.length; | |
if(!len) { | |
return; | |
} | |
var isResolved = this.isResolved(), | |
isFulfilled = this.isFulfilled(), | |
isRejected = this.isRejected(); | |
nextTick(function() { | |
var i = 0, cb, defer, fn; | |
while(i < len) { | |
cb = callbacks[i++]; | |
defer = cb.defer; | |
fn = cb.fn; | |
if(fn) { | |
var ctx = cb.ctx, | |
res; | |
try { | |
res = ctx? fn.call(ctx, arg) : fn(arg); | |
} | |
catch(e) { | |
defer.reject(e); | |
continue; | |
} | |
isResolved? | |
defer.resolve(res) : | |
defer.notify(res); | |
} | |
else if(isFulfilled) { | |
defer.resolve(arg); | |
} | |
else if(isRejected) { | |
defer.reject(arg); | |
} | |
else { | |
defer.notify(arg); | |
} | |
} | |
}); | |
} | |
}; | |
/** @lends Promise */ | |
var staticMethods = { | |
/** | |
* Coerces the given `value` to a promise, or returns the `value` if it's already a promise. | |
* | |
* @param {*} value | |
* @returns {vow:Promise} | |
*/ | |
cast : function(value) { | |
return vow.cast(value); | |
}, | |
/** | |
* Returns a promise, that will be fulfilled only after all the items in `iterable` are fulfilled. | |
* If any of the `iterable` items gets rejected, then the returned promise will be rejected. | |
* | |
* @param {Array|Object} iterable | |
* @returns {vow:Promise} | |
*/ | |
all : function(iterable) { | |
return vow.all(iterable); | |
}, | |
/** | |
* Returns a promise, that will be fulfilled only when any of the items in `iterable` are fulfilled. | |
* If any of the `iterable` items gets rejected, then the returned promise will be rejected. | |
* | |
* @param {Array} iterable | |
* @returns {vow:Promise} | |
*/ | |
race : function(iterable) { | |
return vow.anyResolved(iterable); | |
}, | |
/** | |
* Returns a promise that has already been resolved with the given `value`. | |
* If `value` is a promise, the returned promise will have `value`'s state. | |
* | |
* @param {*} value | |
* @returns {vow:Promise} | |
*/ | |
resolve : function(value) { | |
return vow.resolve(value); | |
}, | |
/** | |
* Returns a promise that has already been rejected with the given `reason`. | |
* | |
* @param {*} reason | |
* @returns {vow:Promise} | |
*/ | |
reject : function(reason) { | |
return vow.reject(reason); | |
} | |
}; | |
for(var prop in staticMethods) { | |
staticMethods.hasOwnProperty(prop) && | |
(Promise[prop] = staticMethods[prop]); | |
} | |
var vow = /** @exports vow */ { | |
Deferred : Deferred, | |
Promise : Promise, | |
/** | |
* Creates a new deferred. This method is a factory method for `vow:Deferred` class. | |
* It's equivalent to `new vow.Deferred()`. | |
* | |
* @returns {vow:Deferred} | |
*/ | |
defer : function() { | |
return new Deferred(); | |
}, | |
/** | |
* Static equivalent to `promise.then`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified | |
* @param {Object} [ctx] Context of the callbacks execution | |
* @returns {vow:Promise} | |
*/ | |
when : function(value, onFulfilled, onRejected, onProgress, ctx) { | |
return vow.cast(value).then(onFulfilled, onRejected, onProgress, ctx); | |
}, | |
/** | |
* Static equivalent to `promise.fail`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} onRejected Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
fail : function(value, onRejected, ctx) { | |
return vow.when(value, undef, onRejected, ctx); | |
}, | |
/** | |
* Static equivalent to `promise.always`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} onResolved Callback that will be invoked with the promise as an argument, after the promise has been resolved. | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
always : function(value, onResolved, ctx) { | |
return vow.when(value).always(onResolved, ctx); | |
}, | |
/** | |
* Static equivalent to `promise.progress`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} onProgress Callback that will be invoked with a provided value after the promise has been notified | |
* @param {Object} [ctx] Context of the callback execution | |
* @returns {vow:Promise} | |
*/ | |
progress : function(value, onProgress, ctx) { | |
return vow.when(value).progress(onProgress, ctx); | |
}, | |
/** | |
* Static equivalent to `promise.spread`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Object} [ctx] Context of the callbacks execution | |
* @returns {vow:Promise} | |
*/ | |
spread : function(value, onFulfilled, onRejected, ctx) { | |
return vow.when(value).spread(onFulfilled, onRejected, ctx); | |
}, | |
/** | |
* Static equivalent to `promise.done`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Function} [onFulfilled] Callback that will be invoked with a provided value after the promise has been fulfilled | |
* @param {Function} [onRejected] Callback that will be invoked with a provided reason after the promise has been rejected | |
* @param {Function} [onProgress] Callback that will be invoked with a provided value after the promise has been notified | |
* @param {Object} [ctx] Context of the callbacks execution | |
*/ | |
done : function(value, onFulfilled, onRejected, onProgress, ctx) { | |
vow.when(value).done(onFulfilled, onRejected, onProgress, ctx); | |
}, | |
/** | |
* Checks whether the given `value` is a promise-like object | |
* | |
* @param {*} value | |
* @returns {Boolean} | |
* | |
* @example | |
* ```js | |
* vow.isPromise('something'); // returns false | |
* vow.isPromise(vow.defer().promise()); // returns true | |
* vow.isPromise({ then : function() { }); // returns true | |
* ``` | |
*/ | |
isPromise : function(value) { | |
return isObject(value) && isFunction(value.then); | |
}, | |
/** | |
* Coerces the given `value` to a promise, or returns the `value` if it's already a promise. | |
* | |
* @param {*} value | |
* @returns {vow:Promise} | |
*/ | |
cast : function(value) { | |
return value && !!value._vow? | |
value : | |
vow.resolve(value); | |
}, | |
/** | |
* Static equivalent to `promise.valueOf`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @returns {*} | |
*/ | |
valueOf : function(value) { | |
return value && isFunction(value.valueOf)? value.valueOf() : value; | |
}, | |
/** | |
* Static equivalent to `promise.isFulfilled`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @returns {Boolean} | |
*/ | |
isFulfilled : function(value) { | |
return value && isFunction(value.isFulfilled)? value.isFulfilled() : true; | |
}, | |
/** | |
* Static equivalent to `promise.isRejected`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @returns {Boolean} | |
*/ | |
isRejected : function(value) { | |
return value && isFunction(value.isRejected)? value.isRejected() : false; | |
}, | |
/** | |
* Static equivalent to `promise.isResolved`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @returns {Boolean} | |
*/ | |
isResolved : function(value) { | |
return value && isFunction(value.isResolved)? value.isResolved() : true; | |
}, | |
/** | |
* Returns a promise that has already been resolved with the given `value`. | |
* If `value` is a promise, the returned promise will have `value`'s state. | |
* | |
* @param {*} value | |
* @returns {vow:Promise} | |
*/ | |
resolve : function(value) { | |
var res = vow.defer(); | |
res.resolve(value); | |
return res.promise(); | |
}, | |
/** | |
* Returns a promise that has already been fulfilled with the given `value`. | |
* If `value` is a promise, the returned promise will be fulfilled with the fulfill/rejection value of `value`. | |
* | |
* @param {*} value | |
* @returns {vow:Promise} | |
*/ | |
fulfill : function(value) { | |
var defer = vow.defer(), | |
promise = defer.promise(); | |
defer.resolve(value); | |
return promise.isFulfilled()? | |
promise : | |
promise.then(null, function(reason) { | |
return reason; | |
}); | |
}, | |
/** | |
* Returns a promise that has already been rejected with the given `reason`. | |
* If `reason` is a promise, the returned promise will be rejected with the fulfill/rejection value of `reason`. | |
* | |
* @param {*} reason | |
* @returns {vow:Promise} | |
*/ | |
reject : function(reason) { | |
var defer = vow.defer(); | |
defer.reject(reason); | |
return defer.promise(); | |
}, | |
/** | |
* Invokes the given function `fn` with arguments `args` | |
* | |
* @param {Function} fn | |
* @param {...*} [args] | |
* @returns {vow:Promise} | |
* | |
* @example | |
* ```js | |
* var promise1 = vow.invoke(function(value) { | |
* return value; | |
* }, 'ok'), | |
* promise2 = vow.invoke(function() { | |
* throw Error(); | |
* }); | |
* | |
* promise1.isFulfilled(); // true | |
* promise1.valueOf(); // 'ok' | |
* promise2.isRejected(); // true | |
* promise2.valueOf(); // instance of Error | |
* ``` | |
*/ | |
invoke : function(fn, args) { | |
var len = Math.max(arguments.length - 1, 0), | |
callArgs; | |
if(len) { // optimization for V8 | |
callArgs = Array(len); | |
var i = 0; | |
while(i < len) { | |
callArgs[i++] = arguments[i]; | |
} | |
} | |
try { | |
return vow.resolve(callArgs? | |
fn.apply(global, callArgs) : | |
fn.call(global)); | |
} | |
catch(e) { | |
return vow.reject(e); | |
} | |
}, | |
/** | |
* Returns a promise, that will be fulfilled only after all the items in `iterable` are fulfilled. | |
* If any of the `iterable` items gets rejected, the promise will be rejected. | |
* | |
* @param {Array|Object} iterable | |
* @returns {vow:Promise} | |
* | |
* @example | |
* with array: | |
* ```js | |
* var defer1 = vow.defer(), | |
* defer2 = vow.defer(); | |
* | |
* vow.all([defer1.promise(), defer2.promise(), 3]) | |
* .then(function(value) { | |
* // value is "[1, 2, 3]" here | |
* }); | |
* | |
* defer1.resolve(1); | |
* defer2.resolve(2); | |
* ``` | |
* | |
* @example | |
* with object: | |
* ```js | |
* var defer1 = vow.defer(), | |
* defer2 = vow.defer(); | |
* | |
* vow.all({ p1 : defer1.promise(), p2 : defer2.promise(), p3 : 3 }) | |
* .then(function(value) { | |
* // value is "{ p1 : 1, p2 : 2, p3 : 3 }" here | |
* }); | |
* | |
* defer1.resolve(1); | |
* defer2.resolve(2); | |
* ``` | |
*/ | |
all : function(iterable) { | |
var defer = new Deferred(), | |
isPromisesArray = isArray(iterable), | |
keys = isPromisesArray? | |
getArrayKeys(iterable) : | |
getObjectKeys(iterable), | |
len = keys.length, | |
res = isPromisesArray? [] : {}; | |
if(!len) { | |
defer.resolve(res); | |
return defer.promise(); | |
} | |
var i = len; | |
vow._forEach( | |
iterable, | |
function(value, idx) { | |
res[keys[idx]] = value; | |
if(!--i) { | |
defer.resolve(res); | |
} | |
}, | |
defer.reject, | |
defer.notify, | |
defer, | |
keys); | |
return defer.promise(); | |
}, | |
/** | |
* Returns a promise, that will be fulfilled only after all the items in `iterable` are resolved. | |
* | |
* @param {Array|Object} iterable | |
* @returns {vow:Promise} | |
* | |
* @example | |
* ```js | |
* var defer1 = vow.defer(), | |
* defer2 = vow.defer(); | |
* | |
* vow.allResolved([defer1.promise(), defer2.promise()]).spread(function(promise1, promise2) { | |
* promise1.isRejected(); // returns true | |
* promise1.valueOf(); // returns "'error'" | |
* promise2.isFulfilled(); // returns true | |
* promise2.valueOf(); // returns "'ok'" | |
* }); | |
* | |
* defer1.reject('error'); | |
* defer2.resolve('ok'); | |
* ``` | |
*/ | |
allResolved : function(iterable) { | |
var defer = new Deferred(), | |
isPromisesArray = isArray(iterable), | |
keys = isPromisesArray? | |
getArrayKeys(iterable) : | |
getObjectKeys(iterable), | |
i = keys.length, | |
res = isPromisesArray? [] : {}; | |
if(!i) { | |
defer.resolve(res); | |
return defer.promise(); | |
} | |
var onResolved = function() { | |
--i || defer.resolve(iterable); | |
}; | |
vow._forEach( | |
iterable, | |
onResolved, | |
onResolved, | |
defer.notify, | |
defer, | |
keys); | |
return defer.promise(); | |
}, | |
allPatiently : function(iterable) { | |
return vow.allResolved(iterable).then(function() { | |
var isPromisesArray = isArray(iterable), | |
keys = isPromisesArray? | |
getArrayKeys(iterable) : | |
getObjectKeys(iterable), | |
rejectedPromises, fulfilledPromises, | |
len = keys.length, i = 0, key, promise; | |
if(!len) { | |
return isPromisesArray? [] : {}; | |
} | |
while(i < len) { | |
key = keys[i++]; | |
promise = iterable[key]; | |
if(vow.isRejected(promise)) { | |
rejectedPromises || (rejectedPromises = isPromisesArray? [] : {}); | |
isPromisesArray? | |
rejectedPromises.push(promise.valueOf()) : | |
rejectedPromises[key] = promise.valueOf(); | |
} | |
else if(!rejectedPromises) { | |
(fulfilledPromises || (fulfilledPromises = isPromisesArray? [] : {}))[key] = vow.valueOf(promise); | |
} | |
} | |
if(rejectedPromises) { | |
throw rejectedPromises; | |
} | |
return fulfilledPromises; | |
}); | |
}, | |
/** | |
* Returns a promise, that will be fulfilled if any of the items in `iterable` is fulfilled. | |
* If all of the `iterable` items get rejected, the promise will be rejected (with the reason of the first rejected item). | |
* | |
* @param {Array} iterable | |
* @returns {vow:Promise} | |
*/ | |
any : function(iterable) { | |
var defer = new Deferred(), | |
len = iterable.length; | |
if(!len) { | |
defer.reject(Error()); | |
return defer.promise(); | |
} | |
var i = 0, reason; | |
vow._forEach( | |
iterable, | |
defer.resolve, | |
function(e) { | |
i || (reason = e); | |
++i === len && defer.reject(reason); | |
}, | |
defer.notify, | |
defer); | |
return defer.promise(); | |
}, | |
/** | |
* Returns a promise, that will be fulfilled only when any of the items in `iterable` is fulfilled. | |
* If any of the `iterable` items gets rejected, the promise will be rejected. | |
* | |
* @param {Array} iterable | |
* @returns {vow:Promise} | |
*/ | |
anyResolved : function(iterable) { | |
var defer = new Deferred(), | |
len = iterable.length; | |
if(!len) { | |
defer.reject(Error()); | |
return defer.promise(); | |
} | |
vow._forEach( | |
iterable, | |
defer.resolve, | |
defer.reject, | |
defer.notify, | |
defer); | |
return defer.promise(); | |
}, | |
/** | |
* Static equivalent to `promise.delay`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Number} delay | |
* @returns {vow:Promise} | |
*/ | |
delay : function(value, delay) { | |
return vow.resolve(value).delay(delay); | |
}, | |
/** | |
* Static equivalent to `promise.timeout`. | |
* If `value` is not a promise, then `value` is treated as a fulfilled promise. | |
* | |
* @param {*} value | |
* @param {Number} timeout | |
* @returns {vow:Promise} | |
*/ | |
timeout : function(value, timeout) { | |
return vow.resolve(value).timeout(timeout); | |
}, | |
_forEach : function(promises, onFulfilled, onRejected, onProgress, ctx, keys) { | |
var len = keys? keys.length : promises.length, | |
i = 0; | |
while(i < len) { | |
vow.when( | |
promises[keys? keys[i] : i], | |
wrapOnFulfilled(onFulfilled, i), | |
onRejected, | |
onProgress, | |
ctx); | |
++i; | |
} | |
}, | |
TimedOutError : defineCustomErrorType('TimedOut') | |
}; | |
vow.__nextTick__ = nextTick; | |
var defineAsGlobal = true; | |
if(typeof module === 'object' && typeof module.exports === 'object') { | |
module.exports = vow; | |
defineAsGlobal = false; | |
} | |
if(typeof modules === 'object' && isFunction(modules.define)) { | |
modules.define('vow', function(provide) { | |
provide(vow); | |
}); | |
defineAsGlobal = false; | |
} | |
if(typeof define === 'function') { | |
define(function(require, exports, module) { | |
module.exports = vow; | |
}); | |
defineAsGlobal = false; | |
} | |
defineAsGlobal && (global.vow = vow); | |
})(typeof window !== 'undefined'? window : global); | |
return module.exports; | |
})(); | |
ym.utils = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
var vow = require('vow'); | |
var hop = Object.prototype.hasOwnProperty; | |
exports.nextTick = vow.__nextTick__; | |
vow.__nextTick__ = undefined; | |
exports.isArray = Array.isArray ? Array.isArray : function (obj) { | |
return Object.prototype.toString.call(obj) === '[object Array]'; | |
}; | |
exports.extend = Object.assign ? Object.assign : function objectAssign (target) { | |
for (var i = 1, l = arguments.length; i < l; i++) { | |
var object = arguments[i]; | |
if (object == null) { | |
continue; | |
} | |
for (var key in object) { | |
if (hop.call(object, key)) { | |
target[key] = object[key]; | |
} | |
} | |
} | |
return target; | |
}; | |
exports.accessDeep = function (target, path) { | |
var parts = path.split('.'); | |
for (var i = 0; i < parts.length - 1; i++) { | |
var part = parts[i]; | |
target[part] = target[part] || {}; | |
target = target[part]; | |
} | |
return {parent: target, name: parts[parts.length - 1]}; | |
}; | |
exports.createPackage = function (depends, imports, expandWhenRegistered) { | |
var result = exports.registerImports({}, depends, imports); | |
if (expandWhenRegistered) { | |
result.__expand = { depends: depends, imports: imports }; | |
} | |
return result; | |
}; | |
exports.registerImports = function (target, depends, imports) { | |
for (var i = 0; i < depends.length; i++) { | |
if (imports[i].__expand) { | |
exports.registerImports(target, imports[i].__expand.depends, imports[i].__expand.imports); | |
} else { | |
var access = exports.accessDeep(target, depends[i]); | |
access.parent[access.name] = imports[i]; | |
} | |
} | |
return target; | |
}; | |
return module.exports; | |
})({ vow: ym.vow }); | |
var nsAccess = ym.env.namespace ? ym.utils.accessDeep(global, ym.env.namespace) : null; | |
if ( | |
nsAccess && | |
nsAccess.parent && | |
nsAccess.parent[nsAccess.name] && | |
nsAccess.parent[nsAccess.name].modules && | |
nsAccess.parent[nsAccess.name].ready | |
) { | |
console.error('(Yandex Maps JS API): api is already enabled on this page with same namespace.'); | |
} | |
(function () { | |
var testDiv; | |
var transitableProperties = { | |
transform: 'transform', | |
opacity: 'opacity', | |
transitionTimingFunction: 'transition-timing-function', | |
//TODO - нет никакой реакции на эти значения | |
userSelect: 'user-select', | |
height: 'height' | |
}; | |
var transitionPropertiesCache = {}; | |
var cssPropertiesCache = {}; | |
var browserPrefix = ym.env.browser.cssPrefix.toLowerCase(); | |
function checkCssProperty (name) { | |
/* eslint-disable no-return-assign */ | |
return typeof cssPropertiesCache[name] == 'undefined' ? | |
cssPropertiesCache[name] = checkDivStyle(name) : | |
cssPropertiesCache[name]; | |
} | |
function checkDivStyle (name) { | |
return checkTestDiv(name) || //names | |
checkTestDiv(browserPrefix + upperCaseFirst(name)) || //mozNames | |
checkTestDiv(ym.env.browser.cssPrefix + upperCaseFirst(name)); //MozNames | |
} | |
function checkTestDiv (name) { | |
return typeof getTestDiv().style[name] != 'undefined' ? name : null; | |
} | |
function getTestDiv () { | |
return testDiv || (testDiv = document.createElement('div')); | |
} | |
function upperCaseFirst (str) { | |
return str ? str.substr(0, 1).toUpperCase() + str.substr(1) : str; | |
} | |
function checkCssTransitionProperty (name) { | |
var cssProperty = checkCssProperty(name); | |
if (cssProperty && cssProperty != name) { | |
cssProperty = '-' + browserPrefix + '-' + name; | |
} | |
return cssProperty; | |
} | |
function checkTransitionAvailability (name) { | |
if (transitableProperties[name] && checkCssProperty('transitionProperty')) { | |
return checkCssTransitionProperty(transitableProperties[name]); | |
} | |
return null; | |
} | |
ym.supports.css = { | |
checkProperty: checkCssProperty, | |
checkTransitionProperty: function (name) { | |
/* eslint-disable no-return-assign */ | |
return typeof transitionPropertiesCache[name] == 'undefined' ? | |
transitionPropertiesCache[name] = checkTransitionAvailability(name) : | |
transitionPropertiesCache[name]; | |
}, | |
checkTransitionAvailability: checkTransitionAvailability | |
}; | |
})(); | |
; | |
ym.supports.csp = { | |
isSupported: (typeof Blob != 'undefined') && (typeof URL != 'undefined'), | |
isNonceSupported: ym.env.browser.name && ym.env.browser.version ? | |
!(ym.env.browser.name.search('Safari') != -1 && parseInt(ym.env.browser.version) < 10) : | |
null | |
}; | |
; | |
(function () { | |
var webGlContextSettings = { | |
failIfMajorPerformanceCaveat: true, // just to be sure | |
antialias: false // Firefox does not like offscreen canvas with AA | |
}; | |
var tests = {}; | |
function isWebGlCapable () { | |
// Test system support | |
if (window.WebGLRenderingContext) { | |
// test blacklists | |
/* eslint-disable quote-props */ | |
var webglBrowserBlacklist = { | |
'Samsung Internet': true, // unstable | |
'AndroidBrowser': true // unstable | |
}; | |
var isOldAndroid = ym.env.browser.engine == 'Webkit' && | |
(+ym.env.browser.engineVersion < +537); // unstable | |
if (isOldAndroid || webglBrowserBlacklist[ym.env.browser.name]) { | |
return false; | |
} | |
} else { | |
// No system support | |
return false; | |
} | |
return true; | |
} | |
function detectWebGl () { | |
if (!isWebGlCapable()) { | |
return null; | |
} | |
var contextName, context; | |
try { | |
var canvas = document.createElement('canvas'); | |
context = canvas.getContext(contextName = 'webgl', webGlContextSettings); | |
if (!context) { | |
context = canvas.getContext(contextName = 'experimental-webgl', webGlContextSettings); // IE | |
if (!context) { | |
contextName = null; | |
} | |
} | |
} catch (e) { | |
// suppress warnings at FF | |
contextName = null; | |
} | |
return contextName ? { contextName: contextName, context: context } : null; | |
} | |
// Test globalCompositeOperation to work properly | |
function testCanvas (sandbox, ctx) { | |
sandbox.width = 226; | |
sandbox.height = 256; | |
ctx.fillStyle = '#fff'; | |
ctx.fillRect(0, 0, 150, 150); | |
ctx.globalCompositeOperation = 'xor'; | |
ctx.fillStyle = '#f00'; | |
ctx.fillRect(10, 10, 100, 100); | |
ctx.fillStyle = '#0f0'; | |
ctx.fillRect(50, 50, 100, 100); | |
var data = ctx.getImageData(49, 49, 2, 2), | |
test = []; | |
for (var i = 0; i < 16; i++) { | |
test.push(data.data[i]); | |
} | |
return test.join('x') == '0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255'; | |
} | |
ym.supports.graphics = { | |
hasSvg: function () { | |
if (!('svg' in tests)) { | |
tests.svg = document.implementation && | |
document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1'); | |
} | |
return tests.svg; | |
}, | |
hasCanvas: function () { | |
if (!('canvas' in tests)) { | |
var sandbox = document.createElement('canvas'), | |
canvas = ('getContext' in sandbox) ? sandbox.getContext('2d') : null; | |
tests.canvas = canvas ? testCanvas(sandbox, canvas) : false; | |
} | |
return tests.canvas; | |
}, | |
hasWebGl: function () { | |
if (!('webgl' in tests)) { | |
tests.webgl = detectWebGl(); | |
} | |
return tests.webgl; | |
}, | |
redetect: function () { | |
tests = {}; | |
}, | |
getWebGlContextName: function () { | |
return tests.webgl && tests.webgl.contextName; | |
} | |
}; | |
})(); | |
; | |
(function () { | |
var isCompatibleBrowser; | |
ym.supports.vector = { | |
isSupported: function isSupported () { | |
if (isCompatibleBrowser === undefined) { | |
isCompatibleBrowser = detectFeatures(); | |
} | |
return isCompatibleBrowser; | |
} | |
}; | |
function detectFeatures () { | |
// We need to do all checks to collect full statistics. | |
// That's why we don't return 'false' after the first fail. | |
// MAPSAPI-13769 | |
var result = true; | |
if ( | |
ym.env.browser.osFamily == 'MacOS' && | |
/^10\.[0-8](\.|$)/.test(ym.env.browser.osVersion) | |
) { | |
// Disable vector for old MacOSes. See MAPSAPI-14050 | |
result = false; | |
countReasonsVectorNotSupported('OldMac'); | |
} | |
var fieldsToCheck = [ | |
'requestAnimationFrame', | |
'Worker', | |
'URL', | |
'Blob', | |
'XMLHttpRequest', | |
'Set', | |
'Map', | |
'WebAssembly' | |
]; | |
fieldsToCheck.forEach(function (field) { | |
if (!window[field]) { | |
result = false; | |
countReasonsVectorNotSupported(field); | |
} | |
}); | |
if (typeof Math.trunc !== 'function') { | |
result = false; | |
countReasonsVectorNotSupported('MathTrunc'); | |
} | |
var webGlData = ym.supports.graphics.hasWebGl(); | |
if (!webGlData || webGlData.contextName !== 'webgl') { | |
countReasonsVectorNotSupported('hasWebGl'); | |
// If we can't use webgl context, we can't perform other checks. | |
return false; | |
} | |
var glContext = webGlData.context; | |
if (glContext.getParameter(glContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS) == 0) { | |
result = false; | |
countReasonsVectorNotSupported('MAX_VERTEX_TEXTURE_IMAGE_UNITS'); | |
} | |
if (!glContext.getExtension('OES_vertex_array_object')) { | |
result = false; | |
countReasonsVectorNotSupported('OES_vertex_array_object'); | |
} | |
if (!glContext.getExtension('OES_standard_derivatives')) { | |
result = false; | |
countReasonsVectorNotSupported('OES_standard_derivatives'); | |
} | |
var fragmentHighPrecision = glContext.getShaderPrecisionFormat( | |
glContext.FRAGMENT_SHADER, | |
glContext.HIGH_FLOAT | |
); | |
if ( | |
!fragmentHighPrecision || | |
fragmentHighPrecision.precision == 0 | |
) { | |
result = false; | |
countReasonsVectorNotSupported('highp'); | |
} | |
if (!testPoints()) { | |
var debugInfo = getRendererDebugInfo(); | |
result = false; | |
ym.count('error', { | |
path: [ | |
'vectorEngine.drawPointsError', | |
ym.env.browser.platform, | |
ym.env.browser.name, | |
debugInfo.vendor, | |
debugInfo.renderer | |
].join('.'), | |
share: 1 | |
}); | |
} | |
return result; | |
} | |
function countReasonsVectorNotSupported (errorType) { | |
var debugInfo = getRendererDebugInfo(); | |
ym.count('error', { | |
path: [ | |
'vectorEngine.reasonsVectorNotSupported', | |
errorType, | |
ym.env.browser.platform, | |
ym.env.browser.name, | |
debugInfo.vendor, | |
debugInfo.renderer | |
].join('.'), | |
share: 0.1 | |
}); | |
} | |
// MAPSAPI-13729 | |
function testPoints () { | |
var canvas = document.createElement('canvas'); | |
canvas.width = 1; | |
canvas.height = 1; | |
var gl = canvas.getContext('webgl', { alpha: false, depth: false, antialias: false }); | |
var vShader = gl.createShader(gl.VERTEX_SHADER); | |
gl.shaderSource( | |
vShader, | |
'#version 100\n' + | |
'attribute vec2 p;\n' + | |
'void main() {\n' + | |
' gl_Position = vec4(p,0,1);\n' + | |
' gl_PointSize = 1.0;\n' + | |
'}' | |
); | |
gl.compileShader(vShader); | |
var fShader = gl.createShader(gl.FRAGMENT_SHADER); | |
gl.shaderSource( | |
fShader, | |
'#version 100\n' + | |
'void main() {\n' + | |
' gl_FragColor = vec4(1, 0, 0, 1);\n' + | |
'}' | |
); | |
gl.compileShader(fShader); | |
var program = gl.createProgram(); | |
gl.attachShader(program, vShader); | |
gl.attachShader(program, fShader); | |
gl.bindAttribLocation(program, 0, 'p'); | |
gl.linkProgram(program); | |
var vb = gl.createBuffer(); | |
gl.bindBuffer(gl.ARRAY_BUFFER, vb); | |
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0]), gl.STATIC_DRAW); | |
gl.enableVertexAttribArray(0); | |
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); | |
gl.clearColor(0, 1, 0, 1); | |
gl.clear(gl.COLOR_BUFFER_BIT); | |
gl.useProgram(program); | |
gl.drawArrays(gl.POINTS, 0, 1); | |
var data = new Uint8Array(4); | |
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, data); | |
return data[0] === 255; | |
} | |
function getRendererDebugInfo () { | |
var result = {}; | |
var webGlData = ym.supports.graphics.hasWebGl(); | |
if (!webGlData) { | |
return result; | |
} | |
var glContext = webGlData.context; | |
var debugInfo = glContext.getExtension('WEBGL_debug_renderer_info'); | |
if (debugInfo) { | |
result.vendor = glContext.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL).replace(/\W/g, '_'); | |
result.renderer = glContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL).replace(/\W/g, '_'); | |
} | |
return result; | |
} | |
})(); | |
; | |
ym.supports.printPatchNeeded = !ym.supports.css.checkProperty('printColorAdjust'); | |
ym.logger = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
var moduleName = 'Yandex Maps JS API'; | |
function getMessage (moduleName, _arg) { | |
var str = ''; | |
if (ym.env.debug) { | |
str += '(' + moduleName + '): '; | |
} | |
str += _arg; | |
return str; | |
} | |
module.exports = { | |
assert: function (condition, _arg) { | |
if (!condition) { | |
if (ym.env.debug) { | |
console.log(getMessage(moduleName, _arg)); | |
} | |
} | |
}, | |
log: function (_arg) { | |
if (ym.env.debug) { | |
console.log(getMessage(moduleName, _arg)); | |
} | |
}, | |
notice: function (_arg) { | |
if (ym.env.debug) { | |
console.info(getMessage(moduleName, _arg)); | |
} | |
}, | |
warning: function (_arg) { | |
if (ym.env.debug) { | |
console.warn(getMessage(moduleName, _arg)); | |
} | |
}, | |
error: function (_arg) { | |
console.error(getMessage(moduleName, _arg)); | |
}, | |
exception: function (moduleName, _arg) { | |
throw new Error(getMessage(moduleName, _arg)); | |
} | |
}; | |
return module.exports; | |
})(); | |
(function () { | |
var browser = ym.env.browser; | |
browser.documentMode = document.documentMode; | |
// Этот флаг, к сожалению, приходится постоянно использовать. | |
browser.isIE = (browser.name == 'MSIE' || browser.name == 'IEMobile'); | |
browser.isEdge = (browser.engine == 'Edge'); | |
browser.isChromium = browser.base && browser.base.toLocaleLowerCase() == 'chromium'; | |
browser.isSafari = browser.name == 'Safari'; | |
// Настройка маппинга. | |
var isPointerBrowser = browser.engine == 'Edge' || | |
(browser.name == 'MSIE' && browser.osVersion > 6.1) || | |
(browser.name == 'IEMobile' && browser.engineVersion >= 6); | |
if (isPointerBrowser) { | |
browser.eventMapper = 'pointer'; | |
} else { | |
browser.eventMapper = 'touchMouse'; | |
} | |
// В этой сборке Android Browser были был сломал transition - что-то с субпикселями. | |
browser.androidBrokenBuild = browser.name == 'AndroidBrowser' && browser.engineVersion == '534.30'; | |
var pixelRatio = window.devicePixelRatio || (screen.deviceXDPI && screen.deviceXDPI / 96) || 1; | |
var isSafariBased = browser.osFamily === 'iOS' || | |
browser.name === 'Safari' || | |
// Базируется на сафари на айос девайсах | |
(browser.engine === 'WebKit' && browser.base === 'Safari'); | |
if ( | |
// В IE11 сломалась canvas графика. | |
browser.name == 'MSIE' || | |
browser.name == 'IEMobile' || | |
browser.osFamily == 'Android' && browser.engine == 'Gecko' || | |
// В мобильном сафари падает графика из за ошибок с памятью | |
// Посколько определить айпад отдельно нельзя берем все сафари | |
isSafariBased || | |
pixelRatio > 1 && pixelRatio < 2 // scale 125% | |
) { | |
browser.graphicsRenderEngine = 'svg'; | |
} else { | |
browser.graphicsRenderEngine = 'canvas'; | |
} | |
// Флаг поддержки transition для свойства transform. | |
browser.transformTransition = | |
browser.osFamily == 'Android' || | |
browser.osFamily == 'iOS' || | |
browser.name == 'MSIE' || | |
// FF > 41 не синхронизирует транзишены | |
// (browser.engine && browser.engine.toLocaleLowerCase() == 'gecko') || | |
browser.isChromium; | |
/* Флаг, показывающий наличие в браузере нормально работающей поддержки CSS 3D transforms. | |
* В данный момент 3d-преобразования поддерживают webkit-ы, кроме андроидного 2.x (Bada поддерживает). | |
* FF (Gecko) научился 3d с 10-й версии (https://developer.mozilla.org/en/CSS/-moz-transform#Browser_compatibility) | |
*/ | |
browser.css3DTransform = | |
(browser.engine == 'WebKit' && !(browser.osFamily == 'Android' && parseFloat(browser.osVersion) < 3)) || | |
(browser.engine == 'Gecko' && parseInt(browser.engineVersion.split('.')[0]) >= 10); | |
browser.unsupported = (browser.name == 'OperaMini'); | |
})(); | |
; | |
var ModuleSystem = (function (deps) { | |
var module = { exports: {} }, exports = module.exports, define; | |
function require (name) { return deps[name]; } | |
var vow = require('vow'); | |
var utils = require('./ym.utils'); | |
var hop = Object.prototype.hasOwnProperty; | |
var MISSING_DYNAMIC_VALUE = {}; | |
// Empty array sentinel to reduce the number of empty arrays. | |
var EMPTY_ARRAY = Object.freeze([]); | |
var STATE = { | |
MENTIONED: 1, // Mentioned as missing in a partial bundle. | |
QUEUED: 2, // DEPRECATED: Queued to load via combine. | |
FETCHING: 3, // Currently being fetched in full bundle. | |
DECLARED: 4, // Declared (ym.modules.define was called). | |
RESOLVING: 5, // Was required explicitly or as dependency and resolving now. | |
ERROR: 6, // Something went wrong. | |
DEFINED: 7 // Module is fully defined and already provided its exports. | |
}; | |
module.exports = ModuleSystem; | |
function ModuleSystem (config) { | |
this._config = config; | |
// Sandbox for modules. | |
this._sandbox = this._config.createSandbox(this); | |
// Fast module access. Using ES6 Map doesn't speed up anything. | |
this._definitionsByName = Object.create(null); | |
this._definitionsByStorage = Object.create(null); /* storage: { key: definition } */ | |
// Give an ability to define modules before fetching any bundles. | |
this._remoteLoadingAllowed = vow.defer(); | |
this._initialized = this._remoteLoadingAllowed.promise() | |
.then(function () { return this._loadBundle(this._config.initialBudleName); }, this) | |
} | |
function Definition (state, name, storage, key, depends, declaration, context, dynamicDepends, exports) { | |
// This is a little ugly to use, but makes it easier to track definitions in DevTools. | |
// Zero profit from performance point of view. | |
this.state = state; | |
this.alias = null; | |
this.name = name; | |
this.storage = storage; | |
this.key = key; | |
this.depends = depends; | |
this.dynamicDepends = dynamicDepends; | |
this.declaration = declaration; | |
this.context = context; | |
this.exports = state === STATE.DEFINED ? exports : undefined; | |
// Created lazily when needed. | |
this.resolvingPromise = undefined; | |
this.fetchingDeferred = undefined; | |
} | |
ModuleSystem.prototype.allowRemoteLoading = function () { | |
this._remoteLoadingAllowed.resolve(); | |
}; | |
ModuleSystem.prototype.isDefined = function (name) { | |
return Boolean(this._findDefinition(name)); | |
}; | |
ModuleSystem.prototype.preload = function (module) { | |
return module; | |
}; | |
ModuleSystem.prototype.define = function (name, depends, declaration, context) { | |
var key, storage, dynamicDepends, exports; | |
if (typeof name === 'object') { | |
var def = name; | |
name = def.name; | |
storage = def.storage; | |
key = def.key; | |
depends = def.depends; | |
declaration = def.declaration; | |
context = def.context; | |
dynamicDepends = def.dynamicDepends; | |
exports = def.exports; | |
} else if (arguments.length === 2) { | |
declaration = depends; | |
depends = null; | |
} | |
var definition = new Definition(STATE.DECLARED, name, storage, key, depends, declaration, context, dynamicDepends, exports); | |
this._define(definition); | |
}; | |
// Used by util.AsyncStorage. | |
ModuleSystem.prototype.defineSync = function (def) { | |
var definition = new Definition(STATE.DEFINED, def.name, def.storage, def.key, null, null, null, null, def.module); | |
this._define(definition); | |
}; | |
ModuleSystem.prototype._define = function (definition) { | |
var existing = this._definitionsByName[definition.name]; | |
if (existing) { | |
function throwRedefinitionError() { | |
var error = new Error('ymaps.modules: redefinition of ' + definition.name); | |
// eslint-disable-next-line no-console | |
console.error(error); | |
throw error; | |
} | |
if (existing.state >= STATE.DECLARED) { | |
// Already declared earlier in previous bundle or by the user. Do nothing. | |
return; | |
} else if (existing.state !== STATE.FETCHING) { | |
throwRedefinitionError(); | |
} | |
existing.state = STATE.DECLARED; | |
existing.declaration = definition.declaration; | |
existing.context = definition.context; | |
// There is no info about missing module in bundle except name, so we need to copy more values. | |
existing.storage = definition.storage; | |
existing.key = definition.key; | |
if (definition.depends) { | |
// Dependencies may be declared via a function that resolves based on the current environment. | |
if (typeof definition.depends == 'function') { | |
definition.depends = definition.depends.call({ name: definition.name }, this._config.dependenciesContext); | |
} | |
existing.depends = definition.depends; | |
} | |
existing.dynamicDepends = definition.dynamicDepends; | |
existing.exports = definition.exports; | |
return; | |
} | |
// Dependencies may be declared via a function that resolves based on the current environment. | |
if (typeof definition.depends == 'function') { | |
definition.depends = definition.depends.call({ name: definition.name }, this._config.dependenciesContext); | |
} | |
definition.depends = definition.depends || EMPTY_ARRAY; | |
this._definitionsByName[definition.name] = definition; | |
this._saveDefinitionToStorage(definition); | |
}; | |
ModuleSystem.prototype._resolve = function (definition, data) { | |
// Return immediately if the module is fully defined, to save precious time and memory. | |
if (!definition.dynamicDepends) { | |
if (definition.state === STATE.DEFINED) { | |
return vow.resolve(definition.exports); | |
} else if (definition.state === STATE.ERROR) { | |
return vow.reject(definition.exports); | |
} | |
} | |
// Can't go straight to RESOLVING, because we may need to fetch the module. | |
if (definition.state < STATE.RESOLVING && !definition.resolvingPromise) { | |
definition.resolvingPromise = this._resolveCore(definition, data) | |
.always(function (promise) { | |
definition.resolvingPromise = undefined; | |
return promise; | |
}); | |
} | |
// Even if the module is already defined, we still need to load dynamic dependencies. | |
var dynamicDepends = getDynamicDepends(definition, [data]); | |
return vow.all([definition.resolvingPromise, this._require(dynamicDepends, data)]) | |
.then(function () { | |
return definition.state === STATE.DEFINED ? | |
vow.resolve(definition.exports) : | |
vow.reject(definition.exports); | |
}); | |
}; | |
ModuleSystem.prototype._resolveCore = function (definition, data) { | |
// Fetch module and its dependencies. | |
return this._fetchModule(definition, data) | |
.then(function () { | |
definition.state = STATE.RESOLVING; | |
// Require all dependencies. | |
return this._require(definition.depends, data); | |
}, this) | |
.then(function defineModule (depends) { | |
var explicitAsyncProvisionPromise; | |
var implicitAsyncProvisionDeferred; | |
function provide (exports, error) { | |
if (definition.state === STATE.RESOLVING) { | |
definition.state = error ? STATE.ERROR : STATE.DEFINED; | |
definition.exports = error || exports; | |
} | |
if (implicitAsyncProvisionDeferred) { | |
implicitAsyncProvisionDeferred.resolve(); | |
} | |
if (error) { | |
// eslint-disable-next-line no-console | |
console.warn('ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `' + definition.name + '`.'); | |
} | |
} | |
// Explicit async provision. | |
provide.async = function (promise) { | |
if (definition.state === STATE.RESOLVING) { | |
explicitAsyncProvisionPromise = promise | |
.then( | |
function (exports) { provide(exports); }, | |
function (error) { provide(undefined, error); }); | |
} | |
}; | |
// Some modules are strange. | |
provide.provide = provide; | |
provide.provideAsync = provide.async; | |
provide.dynamicDepends = !definition.dynamicDepends ? null : { | |
getValue: function (key, data) { | |
var module = getDynamicDependency(definition, key, data); | |
if (module === MISSING_DYNAMIC_VALUE) { | |
return vow.reject(new Error('ymaps.modules: dynamic dependency `' + key + '` is not declared.')); | |
} | |
return isModuleReference(module) ? | |
this._require([module], data) : | |
vow.resolve([module]) ; | |
}.bind(this), | |
getValueSync: function (key, data) { | |
var module = getDynamicDependency(definition, key, data); | |
if (!isModuleReference(module)) { | |
return module; | |
} | |
var dependencyDefinition = this._findDefinition(module); | |
return dependencyDefinition ? this._requireSingleSync(dependencyDefinition, data) : undefined; | |
}.bind(this) | |
}; | |
var context = definition.context || { name: definition.name, depends: definition.depends }; | |
try { | |
definition.declaration.apply(context, [provide].concat(depends)); | |
} catch (error) { | |
definition.state = STATE.ERROR; | |
definition.exports = error; | |
return; | |
} | |
// Wait for explicit asynchronous provision. | |
if (explicitAsyncProvisionPromise) { | |
return explicitAsyncProvisionPromise; | |
} | |
if (definition.state !== STATE.DEFINED && definition.state !== STATE.ERROR) { | |
// eslint-disable-next-line no-console | |
console.warn('ymaps.modules: asynchronous provide is deprecated and will be removed. Module `' + definition.name + '`.'); | |
implicitAsyncProvisionDeferred = vow.defer(); | |
return implicitAsyncProvisionDeferred.promise(); | |
} | |
}, this); | |
}; | |
ModuleSystem.prototype.require = function (names, cb, errorCb, thisArg) { | |
var extendedSyntax = typeof names === 'object' && !utils.isArray(names); | |
var returnPromise = arguments.length === 1; | |
if (extendedSyntax) { | |
cb = names.successCallback; | |
errorCb = names.errorCallback; | |
thisArg = names.context; | |
returnPromise = !cb && !errorCb; | |
} | |
names = normalizeRequiredNames(names); | |
var promise = this._require(names.modules, names.data); | |
if (returnPromise) { | |
return promise; | |
} | |
promise.spread(cb, errorCb, thisArg); | |
}; | |
// Used by util.AsyncStorage. | |
ModuleSystem.prototype.requireSync = function (names) { | |
names = normalizeRequiredNames(names); | |
if (names.modules.length !== 1) { | |
throw new Error('ymaps.modules: only one module can be required synchronously.'); | |
} | |
var definition = this._findDefinition(names.modules[0]); | |
return definition && this._requireSingleSync(definition, names.data); | |
}; | |
ModuleSystem.prototype._requireSingleSync = function (definition, data) { | |
var depends = getDynamicDepends(definition, [data]); | |
for (var i = 0, l = depends.length; i < l; i++) { | |
var dependency = this._findDefinition(depends[i]); | |
if (!dependency || !this._requireSingleSync(dependency, data)) { | |
return undefined; | |
} | |
} | |
return definition.state === STATE.DEFINED ? definition.exports : undefined; | |
}; | |
ModuleSystem.prototype._require = function (modules, data) { | |
var promises = modules.map(function (x) { return this._requireSingle(x, data); }, this); | |
return vow.all(promises); | |
}; | |
ModuleSystem.prototype._requireSingle = function (name, data) { | |
var definition = this._findDefinition(name); | |
if (definition) { | |
return this._resolve(definition, data); | |
} | |
// Check if the module can be loaded via combine. | |
// Require placed above an actual define is fine, too. Promise.then behaves like nextTick. | |
return this._initialized | |
.then(function () { | |
var definition = this._findDefinition(name); | |
return definition ? | |
this._resolve(definition, data) : | |
vow.reject(new Error('ymaps.modules: module `' + getModuleNameForLogging(name) + '` is not defined.')); | |
}, this); | |
}; | |
ModuleSystem.prototype._findDefinition = function (name) { | |
if (typeof name === 'undefined') { | |
return; | |
} | |
return typeof name === 'string' ? | |
this._definitionsByName[name] : | |
this._definitionsByStorage[name.storage] && this._definitionsByStorage[name.storage][name.key]; | |
}; | |
ModuleSystem.prototype._saveDefinitionToStorage = function (definition, explicit) { | |
if (!definition.key || !definition.storage) { | |
return; | |
} | |
explicit = explicit || { key: definition.key, storage: definition.storage }; | |
var keys = utils.isArray(explicit.key) ? explicit.key : [explicit.key]; | |
for (var i = 0, l = keys.length; i < l; i++) { | |
this._definitionsByStorage[explicit.storage] = this._definitionsByStorage[explicit.storage] || {}; | |
this._definitionsByStorage[explicit.storage][keys[i]] = definition; | |
} | |
}; | |
ModuleSystem.prototype._fetchModule = function (definition) { | |
return definition.state >= STATE.DECLARED ? vow.resolve() : this._loadFullBundle(); | |
}; | |
ModuleSystem.prototype._loadFullBundle = function () { | |
if (!this._fullBundlePromise) { | |
for (var moduleName in this._definitionsByName) { | |
if (this._definitionsByName[moduleName].state === STATE.MENTIONED) { | |
this._definitionsByName[moduleName].state = STATE.FETCHING; | |
} | |
} | |
this._fullBundlePromise = this._loadBundle('full'); | |
} | |
return this._fullBundlePromise; | |
}; | |
ModuleSystem.prototype._loadBundle = function (name) { | |
return this._config.fetchBundle(name) | |
.then(function (bundleContent) { | |
bundleContent.missingModules.forEach(function (name) { | |
// No need to count module dependencies, in static bundle case. We load all anyway. | |
var definition = new Definition(STATE.MENTIONED, name, undefined, undefined, [], null, null, undefined); | |
this._definitionsByName[name] = definition; | |
}, this); | |
var sandbox = this._sandbox; | |
// Split all modules into batches and execute them in separate macrotasks. | |
var modules = bundleContent.modules; | |
var batchSize = 400; | |
function executeNextBatches() { | |
return vow.delay().then(function () { | |
var batch = modules.splice(0, batchSize); | |
batch.forEach(function(f) {f(sandbox);}); | |
if (modules.length > 0) { | |
return executeNextBatches(); | |
} | |
}); | |
} | |
return executeNextBatches(); | |
}, this) | |
.catch(function (err) { | |
console.error('ymaps: Failed to bundle "' + name + '".' + (err ? err.stack || err.message || '': '')); | |
throw err; | |
}); | |
}; | |
ModuleSystem.prototype._loadModulesMap = function () { | |
return this._config.fetchMap() | |
.spread(function (data, onFinished) { | |
this._processLoadedMap(data); | |
onFinished(); | |
}, this); | |
}; | |
function getDynamicDepends (definition, dataList) { | |
if (!definition.dynamicDepends) { | |
return EMPTY_ARRAY; | |
} | |
var depends = []; | |
for (var fn in definition.dynamicDepends) { | |
if (!hop.call(definition.dynamicDepends, fn)) { | |
continue; | |
} | |
for (var i = 0, l = dataList.length; i < l; i++) { | |
var data = dataList[i]; | |
if (data === undefined) { | |
continue; | |
} | |
var dep = definition.dynamicDepends[fn](data); | |
if (isModuleReference(dep)) { | |
depends.push(dep); | |
} | |
} | |
} | |
return depends; | |
} | |
function getDynamicDependency (definition, key, data) { | |
return hop.call(definition.dynamicDepends, key) ? definition.dynamicDepends[key].call(null, data) : MISSING_DYNAMIC_VALUE; | |
} | |
function isModuleReference (module) { | |
return typeof module === 'string' || isStorageEntry(module); | |
} | |
function getModuleNameForLogging (name) { | |
return name && typeof name === 'object' ? name.key + '@' + name.storage : String(name); | |
} | |
function isStorageEntry (module) { | |
return module != null && typeof module === 'object' && typeof module.key === 'string' && typeof module.storage === 'string'; | |
} | |
/** | |
* Converts allowed formats listed below to the first one. | |
* 1. { modules: ['name', { key: 'x', storage: 'y' }], data: { foo: 'bar' } } | |
* 2. { modules: 'name', data: { foo: 'bar' } } | |
* 3. { key: 'x', storage: 'y' } | |
* 4. 'name' | |
*/ | |
function normalizeRequiredNames (names) { | |
var isArray = utils.isArray(names); | |
if (typeof names === 'object' && !isArray && hop.call(names, 'modules')) { | |
return { | |
modules: utils.isArray(names.modules) ? names.modules : [names.modules], | |
data: names.data | |
}; | |
} | |
return isArray ? { modules: names } : { modules: [names] }; | |
} | |
return module.exports; | |
})({ vow: ym.vow, './ym.utils': ym.utils }); | |
var IMAGES_URL = ym.env.server.url + '/' + ym.env.server.path.replace(/\/$/, '') + '/images/'; | |
ym.modules = new ModuleSystem({ | |
dependenciesContext: ym, | |
initialBudleName: ym.env.preload.bundle, | |
fetchBundle: function (name) { | |
// Store namespace in window with some unique name as an easy way to support any requested namespace. | |
var namespace = ('__ymaps_' + ym.env.namespace + '_' + Date.now()).replace(/\W/g, '_'); | |
global[namespace] = ym.ns; | |
var script = document.createElement('script'); | |
script.src = ym.env.bundles.BASE + ym.env.bundles[name]; | |
script.setAttribute('data-ymaps-api-ns', namespace); | |
script.setAttribute('data-ymaps-api-version', '2.1.78'); | |
script.async = true; | |
var deferred = ym.vow.defer(); | |
script.onerror = deferred.reject.bind(deferred); | |
ym.ns.__provideBundle = deferred.resolve.bind(deferred); | |
document.head.appendChild(script); | |
return deferred.promise().always(function (promise) { | |
delete global[namespace]; | |
return promise; | |
}); | |
}, | |
createSandbox: function (moduleSystemInstance) { | |
var modules = Object.create(moduleSystemInstance); | |
modules.importImages = function (imgParams) { | |
return { get: function (imageName) { return IMAGES_URL + imgParams[imageName].src; } }; | |
}; | |
return ym.utils.extend({}, ym, { modules: modules }); | |
} | |
}); | |
/** | |
* @deprecated To be removed in 2.2. | |
*/ | |
ym.ns.load = function (moduleList, callback, errorCallback, context) { | |
if (typeof moduleList == 'function') { | |
if (callback) { | |
return ym.ns.ready(['package.full'], /* callback = */moduleList, /* context = */callback); | |
} else { | |
return ym.ns.ready(['package.full'], /* callback = */moduleList); | |
} | |
} | |
if (typeof moduleList == 'string') { | |
moduleList = [moduleList]; | |
} | |
return ym.ns.ready.apply(this, arguments); | |
}; | |
; | |
(function () { | |
ym.ns.modules = { | |
// Public API. | |
require: function () { return ym.modules.require.apply(ym.modules, arguments); }, | |
isDefined: function () { return ym.modules.isDefined.apply(ym.modules, arguments); }, | |
requireSync: function () { return ym.modules.requireSync.apply(ym.modules, arguments); }, | |
define: function (name, depends, resolveCallback, context) { | |
ym.modules.define.apply(ym.modules, arguments); | |
return ym.ns.modules; | |
}, | |
// Private API. | |
defineSync: deprecated('defineSync'), | |
getDefinition: deprecated('getDefinition'), | |
getState: deprecated('getState'), | |
setOptions: deprecated('setOptions'), | |
flush: deprecated('flush'), | |
nextTick: deprecated('nextTick'), | |
watchResolving: deprecated('watchResolving'), | |
__modules: ym.modules | |
}; | |
/** | |
* Wraps ym.modules.fnName with a deprecation warning. | |
* @ignore | |
* @param {String} fnName | |
*/ | |
function deprecated (fnName) { | |
return function () { | |
console.warn('{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.' | |
.replace(/\{NS\}/g, ym.env.namespace) | |
.replace(/\{FN\}/g, fnName)); | |
var result = ym.modules[fnName].apply(ym.modules, arguments); | |
return result === ym.modules ? ym.ns.modules : result; | |
}; | |
} | |
})(); | |
; | |
(function (global) { | |
var vow = ym.vow; | |
var requestedEnvPreload = [].concat(['package.system'], ym.env.preload.load.split(',').filter(Boolean)); | |
var preloadMeasure = ym.performance.startMeasure('ymaps.preload'); | |
var envPreload = ym.modules.require(requestedEnvPreload) | |
.then( | |
function (values) { | |
ym.utils.registerImports(ym.ns, requestedEnvPreload, values); | |
preloadMeasure.finish(); | |
callUserCallback(ym.env.preload.onLoad, ym.ns); | |
}, | |
function (error) { | |
callUserCallback(ym.env.preload.onError, error); | |
return vow.reject(error); | |
} | |
); | |
var domReady = document.readyState === 'complete' || document.readyState === 'interactive' ? vow.resolve() : | |
new vow.Promise(function (resolve) { | |
document.addEventListener('DOMContentLoaded', resolve, false); | |
document.addEventListener('load', resolve, false); | |
}); | |
ym.ns.ready = ready; | |
var isFirstReady = true; | |
function ready () { | |
if (isFirstReady) { | |
ym.performance.saveMeasure('ymaps.readyDelay', ym.performance.now() - ym.performance.initTimings.responseEnd); | |
isFirstReady = false; | |
} | |
var readyMeasure = ym.performance.startMeasure('ymaps.ready'); | |
var params = {}; | |
if (arguments.length) { | |
if (arguments.length == 1 && typeof arguments[0] == 'object' && !arguments[0].length) { | |
// Call with hash of params. | |
params = arguments[0]; | |
} else if (typeof arguments[0] != 'function') { | |
// Call with modules list as first parameter. | |
params.require = typeof arguments[0] == 'string' ? [arguments[0]] : arguments[0]; | |
params.successCallback = arguments[1]; | |
params.errorCallback = arguments[2] && typeof arguments[2] == 'function' ? arguments[2] : null; | |
params.context = arguments[2] && typeof arguments[2] == 'object' ? arguments[2] : arguments[3]; | |
} else { | |
// Call with regular signature: `successCallback[, errorCallback], context`. | |
params.successCallback = arguments[0]; | |
params.errorCallback = arguments[1] && typeof arguments[1] == 'function' ? arguments[1] : null; | |
params.context = arguments[1] && typeof arguments[1] == 'object' ? arguments[1] : arguments[2]; | |
} | |
} | |
var explicit = params.require || []; | |
var promise = vow.all([ym.modules.require(explicit), envPreload, domReady]).spread(function (values) { | |
ym.utils.registerImports(ym.ns, explicit, values); | |
readyMeasure.finish(); | |
return ym.ns; | |
}); | |
// Call user callback in setTimeout to trigger default error handling mechanism (window.onerror). | |
promise.then( | |
params.successCallback && function (ym) { setTimeout(params.successCallback.bind(params.context), 0, ym); }, | |
params.errorCallback && function (error) { setTimeout(params.errorCallback.bind(params.context), 0, error); } | |
); | |
return promise; | |
} | |
function callUserCallback (callbackName, value) { | |
if (!callbackName) { | |
return; | |
} | |
var callbackData = getMethodByPath(global, callbackName); | |
if (callbackData) { | |
// Call user callback in setTimeout to trigger default error handling mechanism (window.onerror). | |
setTimeout(function () { | |
callbackData.method.call(callbackData.context, value); | |
}); | |
} | |
} | |
function getMethodByPath (parentNs, path) { | |
var subObj = parentNs; | |
path = path.split('.'); | |
var i = 0, l = path.length - 1; | |
for (; i < l; i++) { | |
subObj = subObj[path[i]]; | |
if (!subObj) { | |
return undefined; | |
} | |
} | |
return { | |
method: subObj[path[l]], | |
context: subObj | |
}; | |
} | |
})(this); | |
; | |
if (ym.env.server.params.csp && !ym.supports.csp.isSupported) { | |
ym.logger.warning('CSP is not suported in this browser'); | |
} | |
// Preload vector layer. | |
ym.modules.define('vectorEngine.loadEngine', [ | |
'vow', | |
// Modules that the engine requires to function. | |
// Check src/jsapi_2_1_modules/imports.ts for their usage. | |
'Hotspot', | |
'Monitor', | |
'collection.Item', | |
'event.Manager', | |
'hotspot.layer.Hint', | |
'hotspot.layer.optionMapper', | |
'interactivityModel.EventController', | |
'interactivityModel.layer', | |
'option.Manager', | |
'poi.BalloonManager', | |
'util.shapeFactory' | |
], function (provide, vow) { | |
if (ym.env.namespace !== 'ymaps') { | |
throw new Error('Vector supports only `ymaps` namespace.'); | |
} | |
if (ym.env.vectorVersion == null) { | |
throw new Error('No vector version.'); | |
} | |
function loadEngine () { | |
// The vector engine is served as a separate library. | |
var deferred = vow.defer(); | |
var script = document.createElement('script'); | |
script.onload = deferred.resolve.bind(deferred); | |
script.onerror = deferred.reject.bind(deferred); | |
script.src = ym.env.hosts.vectorIndex.replace('{{version}}', ym.env.vectorVersion); | |
if (ym.env.vectorEngineFileName) { | |
script.src = script.src.replace('vector.min.js', ym.env.vectorEngineFileName); | |
} | |
document.head.insertAdjacentElement('afterbegin', script); | |
return deferred.promise().catch(function () { | |
return vow.reject(new Error('Failed to load vector engine')); | |
}); | |
} | |
var loadingProcess = null; | |
provide(function () { | |
loadingProcess = loadingProcess || loadEngine(); | |
return loadingProcess; | |
}); | |
}); | |
; | |
ym.modules.define('vectorEngine.preload', [], function (provide) { | |
if (ym.supports.vector.isSupported()) { | |
ym.modules.require(['vectorEngine.loadEngine']) | |
.spread(function (loadEngine) { loadEngine(); }); | |
} | |
provide({}); | |
}); | |
; | |
ym.modules.allowRemoteLoading(); | |
// Register namespace in window. | |
if (nsAccess) { | |
nsAccess.parent[nsAccess.name] = ym.ns; | |
} | |
ym.performance.init({ | |
url: ym.env.hosts.api.statCounter + '/counter', | |
data: '/path=' + ym.env.version.replace(/\W/g, '_') + '.' + ym.env.browser.platform, | |
enable: ym.env.counters == 'all' || Math.random() < PERFORMANCE_SHARE && !ym.env.server.params.debug, | |
initUrl: document.currentScript && document.currentScript.src, | |
useSendBeacon: !ym.env.server.params.csp | |
}); | |
if (!ym.env.hasValidApiKey) { | |
ym.env.apikey = undefined; | |
if (typeof ym.env.hasValidApiKey !== 'undefined') { | |
console.warn('(Yandex Maps JS API): Invalid API key'); | |
} | |
} | |
initEvalMeasure.finish(); | |
} | |
)({"vectorVersion":"5.15.2","vectorVersionTimestamp":1621004842681,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/debug","params":{"mode":"debug","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"debug","debug":true,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.212","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.13-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.13-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sta":{"version":"2021.05.14.01.50-1_21.05.13-0-8796"},"trf":{"version":"1621004820","scaled":true},"stv":{"version":"2021.05.14.01.50-1_21.05.13-0-8796"},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"4d453ef5a509a2d87d61fc77a835b802","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/debug/panoramas-1bf39db9ea83933137400ffc972fd647947d02eb.js","full":"/debug/full-ade8138f057c00514f7420271eb4d1a232f0e995.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function ymapsInit(e){var n=this,t={ns:{},supports:{},env:e},r=.01;t.performance=function(e){function n(){E=E||setTimeout(t,_)}function t(){clearTimeout(E),E=null;var e=r();if(e){var t=s+"/vars="+e+"/*";if(!a||!navigator.sendBeacon(o,t)){var i=new Image,u=(new Date).getTime()+Math.round(100*Math.random());i.src=o+"/rnd="+u+t}n()}}function r(){var e=[];return i(e,v),i(e,p),e.join(",")}function i(e,n){for(var t in n)if(n.hasOwnProperty(t)&&n[t].length&&(e.push(t+"="+n[t].shift()),e.length>=g))return}var o,s,a,u,c={exports:{}},l=(c.exports,window.performance||Object.create(null)),d=l.now?l.now.bind(l):function(){return Date.now()},f=l.getEntriesByType?function(e){return l.getEntriesByType("resource").filter(function(n){return n.name===e})[0]}:function(){},p={},v={},h={initjs:"i",mapjs:"m",combine_s:"cs",combine_m:"cm",combine_l:"cl"},m={eval:"e",duration:"d",cached:"c",encodedSize:"esz",decodedSize:"dsz",responseDuration:"res",requestDuration:"req"},y={statistics:{combine:{total:0,size:0,modules:0}},initTimings:{},now:d,getResourceTimings:function(e){return f(e)||{}},init:function(e){o=e.url,s="/pid=443/cid=73188/dtype=stred"+e.data,a=Boolean(e.useSendBeacon&&navigator.sendBeacon),u=e.enable,y.initTimings=y.getResourceTimings(e.initUrl),y.saveResourceTimings("initjs",y.initTimings,{size:!1,cached:!1})},saveMeasure:function(e,t){if(u){var r=/^@/.test(e);if(r){var i=e.replace(/^@/,"").split(".");e=(h[i[0]]||i[0])+"."+(m[i[1]]||i[1])}if(t=Math.round(t),!isNaN(t)){var o=r?p:v;o[e]=o[e]||[],o[e].push(t),n()}}},startMeasure:function(e,n){n="undefined"==typeof n?d():n;var t=!1;return{finish:function(r){t||(r="undefined"==typeof r?d():r,y.saveMeasure(e,r-n),t=!0)}}},saveResourceTimings:function(e,n,t){var r="object"==typeof n?n:f(n);if(r&&(t=t||{},e=e.replace(/^@?/,"@"),this.saveMeasure(e+".duration",r.duration),r.responseStart)){var i=0===r.transferSize?1:0;this.saveMeasure(e+".responseDuration",r.responseEnd-r.responseStart),this.saveMeasure(e+".requestDuration",r.responseStart-r.requestStart),t.cached!==!1&&this.saveMeasure(e+".cached",i),t.size===!1||i||(this.saveMeasure(e+".encodedSize",r.encodedBodySize/1024),this.saveMeasure(e+".decodedSize",r.decodedBodySize/1024))}}},g=40,_=5e3,E=null;return window.addEventListener("beforeunload",function(){y.saveMeasure("combine.total",y.statistics.combine.total),y.saveMeasure("combine.modules",y.statistics.combine.modules),y.saveMeasure("combine.size",y.statistics.combine.size/1024),t()}),c.exports=y,c.exports}();var i=t.performance.startMeasure("@initjs.eval");t.count=function(e){function n(){r.push(arguments)}var t={exports:{}},r=(t.exports,[]),i=null,o=function(){(i||n).apply(null,arguments)};return o.provideImplementation=function(e){if(i)throw new Error("ym.count: implementation was already provided.");i=e(r)},t.exports=o,t.exports}(),t.vow=t.ns.vow=function(e){var t,r={exports:{}};r.exports;return function(e){var n,i=function(){var n=[],t=function(e){return n.push(e),1===n.length},r=function(){var e=n,t=0,r=n.length;for(n=[];t<r;)e[t++]()};if("function"==typeof setImmediate)return function(e){t(e)&&setImmediate(r)};if("object"==typeof process&&process.nextTick)return function(e){t(e)&&process.nextTick(r)};var i=e.MutationObserver||e.WebKitMutationObserver;if(i){var o=1,s=document.createTextNode("");return new i(r).observe(s,{characterData:!0}),function(e){t(e)&&(s.data=o*=-1)}}if(e.postMessage){var a=!0;if(e.attachEvent){var u=function(){a=!1};e.attachEvent("onmessage",u),e.postMessage("__checkAsync","*"),e.detachEvent("onmessage",u)}if(a){var c="__promise"+Math.random()+"_"+new Date,l=function(e){e.data===c&&(e.stopPropagation&&e.stopPropagation(),r())};return e.addEventListener?e.addEventListener("message",l,!0):e.attachEvent("onmessage",l),function(n){t(n)&&e.postMessage(c,"*")}}}var d=e.document;if("onreadystatechange"in d.createElement("script")){var f=function(){var e=d.createElement("script");e.onreadystatechange=function(){e.parentNode.removeChild(e),e=e.onreadystatechange=null,r()},(d.documentElement||d.body).appendChild(e)};return function(e){t(e)&&f()}}return function(e){t(e)&&setTimeout(r,0)}}(),o=function(e){i(function(){throw e})},s=function(e){return"function"==typeof e},a=function(e){return null!==e&&"object"==typeof e},u=Object.prototype.toString,c=Array.isArray||function(e){return"[object Array]"===u.call(e)},l=function(e){for(var n=[],t=0,r=e.length;t<r;)n.push(t++);return n},d=Object.keys||function(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(t);return n},f=function(e){var n=function(n){this.name=e,this.message=n};return n.prototype=new Error,n},p=function(e,n){return function(t){e.call(this,t,n)}},v=function(){this._promise=new m};v.prototype={promise:function(){return this._promise},resolve:function(e){this._promise.isResolved()||this._promise._resolve(e)},reject:function(e){this._promise.isResolved()||(_.isPromise(e)?(e=e.then(function(e){var n=_.defer();return n.reject(e),n.promise()}),this._promise._resolve(e)):this._promise._reject(e))},notify:function(e){this._promise.isResolved()||this._promise._notify(e)}};var h={PENDING:0,RESOLVED:1,FULFILLED:2,REJECTED:3},m=function(e){if(this._value=n,this._status=h.PENDING,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[],e){var t=this,r=e.length;e(function(e){t.isResolved()||t._resolve(e)},r>1?function(e){t.isResolved()||t._reject(e)}:n,r>2?function(e){t.isResolved()||t._notify(e)}:n)}};m.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==h.PENDING},isFulfilled:function(){return this._status===h.FULFILLED},isRejected:function(){return this._status===h.REJECTED},then:function(e,n,t,r){var i=new v;return this._addCallbacks(i,e,n,t,r),i.promise()},"catch":function(e,t){return this.then(n,e,t)},fail:function(e,t){return this.then(n,e,t)},always:function(e,n){var t=this,r=function(){return e.call(this,t)};return this.then(r,r,n)},progress:function(e,t){return this.then(n,n,e,t)},spread:function(e,n,t){return this.then(function(n){return e.apply(this,n)},n,t)},done:function(e,n,t,r){this.then(e,n,t,r).fail(o)},delay:function(e){var n,t=this.then(function(t){var r=new v;return n=setTimeout(function(){r.resolve(t)},e),r.promise()});return t.always(function(){clearTimeout(n)}),t},timeout:function(e){var n=new v,t=setTimeout(function(){n.reject(new _.TimedOutError("timed out"))},e);return this.then(function(e){n.resolve(e)},function(e){n.reject(e)}),n.promise().always(function(){clearTimeout(t)}),n.promise()},_vow:!0,_resolve:function(e){if(!(this._status>h.RESOLVED)){if(e===this)return void this._reject(TypeError("Can't resolve promise with itself"));if(this._status=h.RESOLVED,e&&e._vow)return void(e.isFulfilled()?this._fulfill(e.valueOf()):e.isRejected()?this._reject(e.valueOf()):e.then(this._fulfill,this._reject,this._notify,this));if(a(e)||s(e)){var n;try{n=e.then}catch(t){return void this._reject(t)}if(s(n)){var r=this,i=!1;try{n.call(e,function(e){i||(i=!0,r._resolve(e))},function(e){i||(i=!0,r._reject(e))},function(e){r._notify(e)})}catch(t){i||this._reject(t)}return}}this._fulfill(e)}},_fulfill:function(e){this._status>h.RESOLVED||(this._status=h.FULFILLED,this._value=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_reject:function(e){this._status>h.RESOLVED||(this._status=h.REJECTED,this._value=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=n)},_notify:function(e){this._callCallbacks(this._progressCallbacks,e)},_addCallbacks:function(e,t,r,i,o){r&&!s(r)?(o=r,r=n):i&&!s(i)&&(o=i,i=n);var a;this.isRejected()||(a={defer:e,fn:s(t)?t:n,ctx:o},this.isFulfilled()?this._callCallbacks([a],this._value):this._fulfilledCallbacks.push(a)),this.isFulfilled()||(a={defer:e,fn:r,ctx:o},this.isRejected()?this._callCallbacks([a],this._value):this._rejectedCallbacks.push(a)),this._status<=h.RESOLVED&&this._progressCallbacks.push({defer:e,fn:i,ctx:o})},_callCallbacks:function(e,n){var t=e.length;if(t){var r=this.isResolved(),o=this.isFulfilled(),s=this.isRejected();i(function(){for(var i,a,u,c=0;c<t;)if(i=e[c++],a=i.defer,u=i.fn){var l,d=i.ctx;try{l=d?u.call(d,n):u(n)}catch(f){a.reject(f);continue}r?a.resolve(l):a.notify(l)}else o?a.resolve(n):s?a.reject(n):a.notify(n)})}}};var y={cast:function(e){return _.cast(e)},all:function(e){return _.all(e)},race:function(e){return _.anyResolved(e)},resolve:function(e){return _.resolve(e)},reject:function(e){return _.reject(e)}};for(var g in y)y.hasOwnProperty(g)&&(m[g]=y[g]);var _={Deferred:v,Promise:m,defer:function(){return new v},when:function(e,n,t,r,i){return _.cast(e).then(n,t,r,i)},fail:function(e,t,r){return _.when(e,n,t,r)},always:function(e,n,t){return _.when(e).always(n,t)},progress:function(e,n,t){return _.when(e).progress(n,t)},spread:function(e,n,t,r){return _.when(e).spread(n,t,r)},done:function(e,n,t,r,i){_.when(e).done(n,t,r,i)},isPromise:function(e){return a(e)&&s(e.then)},cast:function(e){return e&&e._vow?e:_.resolve(e)},valueOf:function(e){return e&&s(e.valueOf)?e.valueOf():e},isFulfilled:function(e){return!e||!s(e.isFulfilled)||e.isFulfilled()},isRejected:function(e){return!(!e||!s(e.isRejected))&&e.isRejected()},isResolved:function(e){return!e||!s(e.isResolved)||e.isResolved()},resolve:function(e){var n=_.defer();return n.resolve(e),n.promise()},fulfill:function(e){var n=_.defer(),t=n.promise();return n.resolve(e),t.isFulfilled()?t:t.then(null,function(e){return e})},reject:function(e){var n=_.defer();return n.reject(e),n.promise()},invoke:function(n,t){var r,i=Math.max(arguments.length-1,0);if(i){r=Array(i);for(var o=0;o<i;)r[o++]=arguments[o]}try{return _.resolve(r?n.apply(e,r):n.call(e))}catch(s){return _.reject(s)}},all:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=i;return _._forEach(e,function(e,t){o[r[t]]=e,--s||n.resolve(o)},n.reject,n.notify,n,r),n.promise()},allResolved:function(e){var n=new v,t=c(e),r=t?l(e):d(e),i=r.length,o=t?[]:{};if(!i)return n.resolve(o),n.promise();var s=function(){--i||n.resolve(e)};return _._forEach(e,s,s,n.notify,n,r),n.promise()},allPatiently:function(e){return _.allResolved(e).then(function(){var n,t,r,i,o=c(e),s=o?l(e):d(e),a=s.length,u=0;if(!a)return o?[]:{};for(;u<a;)r=s[u++],i=e[r],_.isRejected(i)?(n||(n=o?[]:{}),o?n.push(i.valueOf()):n[r]=i.valueOf()):n||((t||(t=o?[]:{}))[r]=_.valueOf(i));if(n)throw n;return t})},any:function(e){var n=new v,t=e.length;if(!t)return n.reject(Error()),n.promise();var r,i=0;return _._forEach(e,n.resolve,function(e){i||(r=e),++i===t&&n.reject(r)},n.notify,n),n.promise()},anyResolved:function(e){var n=new v,t=e.length;return t?(_._forEach(e,n.resolve,n.reject,n.notify,n),n.promise()):(n.reject(Error()),n.promise())},delay:function(e,n){return _.resolve(e).delay(n)},timeout:function(e,n){return _.resolve(e).timeout(n)},_forEach:function(e,n,t,r,i,o){for(var s=o?o.length:e.length,a=0;a<s;)_.when(e[o?o[a]:a],p(n,a),t,r,i),++a},TimedOutError:f("TimedOut")};_.__nextTick__=i;var E=!0;"object"==typeof r&&"object"==typeof r.exports&&(r.exports=_,E=!1),"object"==typeof modules&&s(modules.define)&&(modules.define("vow",function(e){e(_)}),E=!1),"function"==typeof t&&(t(function(e,n,t){t.exports=_}),E=!1),E&&(e.vow=_)}("undefined"!=typeof window?window:n),r.exports}(),t.utils=function(e){function n(n){return e[n]}var t={exports:{}},r=t.exports,i=n("vow"),o=Object.prototype.hasOwnProperty;return r.nextTick=i.__nextTick__,i.__nextTick__=void 0,r.isArray=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},r.extend=Object.assign?Object.assign:function(e){for(var n=1,t=arguments.length;n<t;n++){var r=arguments[n];if(null!=r)for(var i in r)o.call(r,i)&&(e[i]=r[i])}return e},r.accessDeep=function(e,n){for(var t=n.split("."),r=0;r<t.length-1;r++){var i=t[r];e[i]=e[i]||{},e=e[i]}return{parent:e,name:t[t.length-1]}},r.createPackage=function(e,n,t){var i=r.registerImports({},e,n);return t&&(i.__expand={depends:e,imports:n}),i},r.registerImports=function(e,n,t){for(var i=0;i<n.length;i++)if(t[i].__expand)r.registerImports(e,t[i].__expand.depends,t[i].__expand.imports);else{var o=r.accessDeep(e,n[i]);o.parent[o.name]=t[i]}return e},t.exports}({vow:t.vow});var o=t.env.namespace?t.utils.accessDeep(n,t.env.namespace):null;o&&o.parent&&o.parent[o.name]&&o.parent[o.name].modules&&o.parent[o.name].ready&&console.error("(Yandex Maps JS API): api is already enabled on this page with same namespace."),function(){function e(e){return"undefined"==typeof d[e]?d[e]=n(e):d[e]}function n(e){return r(e)||r(f+o(e))||r(t.env.browser.cssPrefix+o(e))}function r(e){return"undefined"!=typeof i().style[e]?e:null}function i(){return u||(u=document.createElement("div"))}function o(e){return e?e.substr(0,1).toUpperCase()+e.substr(1):e}function s(n){var t=e(n);return t&&t!=n&&(t="-"+f+"-"+n),t}function a(n){return c[n]&&e("transitionProperty")?s(c[n]):null}var u,c={transform:"transform",opacity:"opacity",transitionTimingFunction:"transition-timing-function",userSelect:"user-select",height:"height"},l={},d={},f=t.env.browser.cssPrefix.toLowerCase();t.supports.css={checkProperty:e,checkTransitionProperty:function(e){return"undefined"==typeof l[e]?l[e]=a(e):l[e]},checkTransitionAvailability:a}}(),t.supports.csp={isSupported:"undefined"!=typeof Blob&&"undefined"!=typeof URL,isNonceSupported:t.env.browser.name&&t.env.browser.version?!(t.env.browser.name.search("Safari")!=-1&&parseInt(t.env.browser.version)<10):null},function(){function e(){if(!window.WebGLRenderingContext)return!1;var e={"Samsung Internet":!0,AndroidBrowser:!0},n="Webkit"==t.env.browser.engine&&+t.env.browser.engineVersion<537;return!n&&!e[t.env.browser.name]}function n(){if(!e())return null;var n,t;try{var r=document.createElement("canvas");t=r.getContext(n="webgl",i),t||(t=r.getContext(n="experimental-webgl",i),t||(n=null))}catch(o){n=null}return n?{contextName:n,context:t}:null}function r(e,n){e.width=226,e.height=256,n.fillStyle="#fff",n.fillRect(0,0,150,150),n.globalCompositeOperation="xor",n.fillStyle="#f00",n.fillRect(10,10,100,100),n.fillStyle="#0f0",n.fillRect(50,50,100,100);for(var t=n.getImageData(49,49,2,2),r=[],i=0;i<16;i++)r.push(t.data[i]);return"0x0x0x0x0x0x0x0x0x0x0x0x0x255x0x255"==r.join("x")}var i={failIfMajorPerformanceCaveat:!0,antialias:!1},o={};t.supports.graphics={hasSvg:function(){return"svg"in o||(o.svg=document.implementation&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")),o.svg},hasCanvas:function(){if(!("canvas"in o)){var e=document.createElement("canvas"),n="getContext"in e?e.getContext("2d"):null;o.canvas=!!n&&r(e,n)}return o.canvas},hasWebGl:function(){return"webgl"in o||(o.webgl=n()),o.webgl},redetect:function(){o={}},getWebGlContextName:function(){return o.webgl&&o.webgl.contextName}}}(),function(){function e(){var e=!0;"MacOS"==t.env.browser.osFamily&&/^10\.[0-8](\.|$)/.test(t.env.browser.osVersion)&&(e=!1,n("OldMac"));var o=["requestAnimationFrame","Worker","URL","Blob","XMLHttpRequest","Set","Map","WebAssembly"];o.forEach(function(t){window[t]||(e=!1,n(t))}),"function"!=typeof Math.trunc&&(e=!1,n("MathTrunc"));var s=t.supports.graphics.hasWebGl();if(!s||"webgl"!==s.contextName)return n("hasWebGl"),!1;var a=s.context;0==a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS)&&(e=!1,n("MAX_VERTEX_TEXTURE_IMAGE_UNITS")),a.getExtension("OES_vertex_array_object")||(e=!1,n("OES_vertex_array_object")),a.getExtension("OES_standard_derivatives")||(e=!1,n("OES_standard_derivatives"));var u=a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT);if(u&&0!=u.precision||(e=!1,n("highp")),!r()){var c=i();e=!1,t.count("error",{path:["vectorEngine.drawPointsError",t.env.browser.platform,t.env.browser.name,c.vendor,c.renderer].join("."),share:1})}return e}function n(e){var n=i();t.count("error",{path:["vectorEngine.reasonsVectorNotSupported",e,t.env.browser.platform,t.env.browser.name,n.vendor,n.renderer].join("."),share:.1})}function r(){var e=document.createElement("canvas");e.width=1,e.height=1;var n=e.getContext("webgl",{alpha:!1,depth:!1,antialias:!1}),t=n.createShader(n.VERTEX_SHADER);n.shaderSource(t,"#version 100\nattribute vec2 p;\nvoid main() {\n gl_Position = vec4(p,0,1);\n gl_PointSize = 1.0;\n}"),n.compileShader(t);var r=n.createShader(n.FRAGMENT_SHADER);n.shaderSource(r,"#version 100\nvoid main() {\n gl_FragColor = vec4(1, 0, 0, 1);\n}"),n.compileShader(r);var i=n.createProgram();n.attachShader(i,t),n.attachShader(i,r),n.bindAttribLocation(i,0,"p"),n.linkProgram(i);var o=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,o),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,0]),n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,0,0),n.clearColor(0,1,0,1),n.clear(n.COLOR_BUFFER_BIT),n.useProgram(i),n.drawArrays(n.POINTS,0,1);var s=new Uint8Array(4);return n.readPixels(0,0,1,1,n.RGBA,n.UNSIGNED_BYTE,s),255===s[0]}function i(){var e={},n=t.supports.graphics.hasWebGl();if(!n)return e;var r=n.context,i=r.getExtension("WEBGL_debug_renderer_info");return i&&(e.vendor=r.getParameter(i.UNMASKED_VENDOR_WEBGL).replace(/\W/g,"_"),e.renderer=r.getParameter(i.UNMASKED_RENDERER_WEBGL).replace(/\W/g,"_")),e}var o;t.supports.vector={isSupported:function(){return void 0===o&&(o=e()),o}}}(),t.supports.printPatchNeeded=!t.supports.css.checkProperty("printColorAdjust"),t.logger=function(e){function n(e,n){var r="";return t.env.debug&&(r+="("+e+"): "),r+=n}var r={exports:{}},i=(r.exports,"Yandex Maps JS API");return r.exports={assert:function(e,r){e||t.env.debug&&console.log(n(i,r))},log:function(e){t.env.debug&&console.log(n(i,e))},notice:function(e){t.env.debug&&console.info(n(i,e))},warning:function(e){t.env.debug&&console.warn(n(i,e))},error:function(e){console.error(n(i,e))},exception:function(e,t){throw new Error(n(e,t))}},r.exports}(),function(){var e=t.env.browser;e.documentMode=document.documentMode,e.isIE="MSIE"==e.name||"IEMobile"==e.name,e.isEdge="Edge"==e.engine,e.isChromium=e.base&&"chromium"==e.base.toLocaleLowerCase(),e.isSafari="Safari"==e.name;var n="Edge"==e.engine||"MSIE"==e.name&&e.osVersion>6.1||"IEMobile"==e.name&&e.engineVersion>=6;n?e.eventMapper="pointer":e.eventMapper="touchMouse",e.androidBrokenBuild="AndroidBrowser"==e.name&&"534.30"==e.engineVersion;var r=window.devicePixelRatio||screen.deviceXDPI&&screen.deviceXDPI/96||1,i="iOS"===e.osFamily||"Safari"===e.name||"WebKit"===e.engine&&"Safari"===e.base;"MSIE"==e.name||"IEMobile"==e.name||"Android"==e.osFamily&&"Gecko"==e.engine||i||r>1&&r<2?e.graphicsRenderEngine="svg":e.graphicsRenderEngine="canvas",e.transformTransition="Android"==e.osFamily||"iOS"==e.osFamily||"MSIE"==e.name||e.isChromium,e.css3DTransform="WebKit"==e.engine&&!("Android"==e.osFamily&&parseFloat(e.osVersion)<3)||"Gecko"==e.engine&&parseInt(e.engineVersion.split(".")[0])>=10,e.unsupported="OperaMini"==e.name}();var s=function(e){function n(n){return e[n]}function t(e){this._config=e,this._sandbox=this._config.createSandbox(this),this._definitionsByName=Object.create(null),this._definitionsByStorage=Object.create(null),this._remoteLoadingAllowed=d.defer(),this._initialized=this._remoteLoadingAllowed.promise().then(function(){return this._loadBundle(this._config.initialBudleName)},this)}function r(e,n,t,r,i,o,s,a,u){this.state=e,this.alias=null,this.name=n,this.storage=t,this.key=r,this.depends=i,this.dynamicDepends=a,this.declaration=o,this.context=s,this.exports=e===m.DEFINED?u:void 0,this.resolvingPromise=void 0,this.fetchingDeferred=void 0}function i(e,n){if(!e.dynamicDepends)return h;var t=[];for(var r in e.dynamicDepends)if(p.call(e.dynamicDepends,r))for(var i=0,o=n.length;i<o;i++){var a=n[i];if(void 0!==a){var u=e.dynamicDepends[r](a);s(u)&&t.push(u)}}return t}function o(e,n,t){return p.call(e.dynamicDepends,n)?e.dynamicDepends[n].call(null,t):v}function s(e){return"string"==typeof e||u(e)}function a(e){return e&&"object"==typeof e?e.key+"@"+e.storage:String(e)}function u(e){return null!=e&&"object"==typeof e&&"string"==typeof e.key&&"string"==typeof e.storage}function c(e){var n=f.isArray(e);return"object"==typeof e&&!n&&p.call(e,"modules")?{modules:f.isArray(e.modules)?e.modules:[e.modules],data:e.data}:n?{modules:e}:{modules:[e]}}var l={exports:{}},d=(l.exports,n("vow")),f=n("./ym.utils"),p=Object.prototype.hasOwnProperty,v={},h=Object.freeze([]),m={MENTIONED:1,QUEUED:2,FETCHING:3,DECLARED:4,RESOLVING:5,ERROR:6,DEFINED:7};return l.exports=t,t.prototype.allowRemoteLoading=function(){this._remoteLoadingAllowed.resolve()},t.prototype.isDefined=function(e){return Boolean(this._findDefinition(e))},t.prototype.preload=function(e){return e},t.prototype.define=function(e,n,t,i){var o,s,a,u;if("object"==typeof e){var c=e;e=c.name,s=c.storage,o=c.key,n=c.depends,t=c.declaration,i=c.context,a=c.dynamicDepends,u=c.exports}else 2===arguments.length&&(t=n,n=null);var l=new r(m.DECLARED,e,s,o,n,t,i,a,u);this._define(l)},t.prototype.defineSync=function(e){var n=new r(m.DEFINED,e.name,e.storage,e.key,null,null,null,null,e.module);this._define(n)},t.prototype._define=function(e){function n(){var n=new Error("ymaps.modules: redefinition of "+e.name);throw console.error(n),n}var t=this._definitionsByName[e.name];if(t){if(t.state>=m.DECLARED)return;return t.state!==m.FETCHING&&n(),t.state=m.DECLARED,t.declaration=e.declaration,t.context=e.context,t.storage=e.storage,t.key=e.key,e.depends&&("function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),t.depends=e.depends),t.dynamicDepends=e.dynamicDepends,void(t.exports=e.exports)}"function"==typeof e.depends&&(e.depends=e.depends.call({name:e.name},this._config.dependenciesContext)),e.depends=e.depends||h,this._definitionsByName[e.name]=e,this._saveDefinitionToStorage(e)},t.prototype._resolve=function(e,n){if(!e.dynamicDepends){if(e.state===m.DEFINED)return d.resolve(e.exports);if(e.state===m.ERROR)return d.reject(e.exports)}e.state<m.RESOLVING&&!e.resolvingPromise&&(e.resolvingPromise=this._resolveCore(e,n).always(function(n){return e.resolvingPromise=void 0,n}));var t=i(e,[n]);return d.all([e.resolvingPromise,this._require(t,n)]).then(function(){return e.state===m.DEFINED?d.resolve(e.exports):d.reject(e.exports)})},t.prototype._resolveCore=function(e,n){return this._fetchModule(e,n).then(function(){return e.state=m.RESOLVING,this._require(e.depends,n)},this).then(function(n){function t(n,t){e.state===m.RESOLVING&&(e.state=t?m.ERROR:m.DEFINED,e.exports=t||n),i&&i.resolve(),t&&console.warn("ymaps.modules: provide(undefined, error) is deprecated and will be removed, throw instead. Module `"+e.name+"`.")}var r,i;t.async=function(n){e.state===m.RESOLVING&&(r=n.then(function(e){t(e)},function(e){t(void 0,e)}))},t.provide=t,t.provideAsync=t.async,t.dynamicDepends=e.dynamicDepends?{getValue:function(n,t){var r=o(e,n,t);return r===v?d.reject(new Error("ymaps.modules: dynamic dependency `"+n+"` is not declared.")):s(r)?this._require([r],t):d.resolve([r])}.bind(this),getValueSync:function(n,t){var r=o(e,n,t);if(!s(r))return r;var i=this._findDefinition(r);return i?this._requireSingleSync(i,t):void 0}.bind(this)}:null;var a=e.context||{name:e.name,depends:e.depends};try{e.declaration.apply(a,[t].concat(n))}catch(u){return e.state=m.ERROR,void(e.exports=u)}return r?r:e.state!==m.DEFINED&&e.state!==m.ERROR?(console.warn("ymaps.modules: asynchronous provide is deprecated and will be removed. Module `"+e.name+"`."),i=d.defer(),i.promise()):void 0},this)},t.prototype.require=function(e,n,t,r){var i="object"==typeof e&&!f.isArray(e),o=1===arguments.length;i&&(n=e.successCallback,t=e.errorCallback,r=e.context,o=!n&&!t),e=c(e);var s=this._require(e.modules,e.data);return o?s:void s.spread(n,t,r)},t.prototype.requireSync=function(e){if(e=c(e),1!==e.modules.length)throw new Error("ymaps.modules: only one module can be required synchronously.");var n=this._findDefinition(e.modules[0]);return n&&this._requireSingleSync(n,e.data)},t.prototype._requireSingleSync=function(e,n){for(var t=i(e,[n]),r=0,o=t.length;r<o;r++){var s=this._findDefinition(t[r]);if(!s||!this._requireSingleSync(s,n))return}return e.state===m.DEFINED?e.exports:void 0},t.prototype._require=function(e,n){var t=e.map(function(e){return this._requireSingle(e,n)},this);return d.all(t)},t.prototype._requireSingle=function(e,n){var t=this._findDefinition(e);return t?this._resolve(t,n):this._initialized.then(function(){var t=this._findDefinition(e);return t?this._resolve(t,n):d.reject(new Error("ymaps.modules: module `"+a(e)+"` is not defined."))},this)},t.prototype._findDefinition=function(e){if("undefined"!=typeof e)return"string"==typeof e?this._definitionsByName[e]:this._definitionsByStorage[e.storage]&&this._definitionsByStorage[e.storage][e.key]},t.prototype._saveDefinitionToStorage=function(e,n){if(e.key&&e.storage){n=n||{key:e.key,storage:e.storage};for(var t=f.isArray(n.key)?n.key:[n.key],r=0,i=t.length;r<i;r++)this._definitionsByStorage[n.storage]=this._definitionsByStorage[n.storage]||{},this._definitionsByStorage[n.storage][t[r]]=e}},t.prototype._fetchModule=function(e){return e.state>=m.DECLARED?d.resolve():this._loadFullBundle()},t.prototype._loadFullBundle=function(){if(!this._fullBundlePromise){for(var e in this._definitionsByName)this._definitionsByName[e].state===m.MENTIONED&&(this._definitionsByName[e].state=m.FETCHING);this._fullBundlePromise=this._loadBundle("full")}return this._fullBundlePromise},t.prototype._loadBundle=function(e){return this._config.fetchBundle(e).then(function(e){function n(){return d.delay().then(function(){var e=i.splice(0,o);if(e.forEach(function(e){e(t)}),i.length>0)return n()})}e.missingModules.forEach(function(e){var n=new r(m.MENTIONED,e,(void 0),(void 0),[],null,null,(void 0));this._definitionsByName[e]=n},this);var t=this._sandbox,i=e.modules,o=400;return n()},this)["catch"](function(n){throw console.error('ymaps: Failed to bundle "'+e+'".'+(n?n.stack||n.message||"":"")),n})},t.prototype._loadModulesMap=function(){return this._config.fetchMap().spread(function(e,n){this._processLoadedMap(e),n()},this)},l.exports}({vow:t.vow,"./ym.utils":t.utils}),a=t.env.server.url+"/"+t.env.server.path.replace(/\/$/,"")+"/images/";t.modules=new s({dependenciesContext:t,initialBudleName:t.env.preload.bundle,fetchBundle:function(e){var r=("__ymaps_"+t.env.namespace+"_"+Date.now()).replace(/\W/g,"_");n[r]=t.ns;var i=document.createElement("script");i.src=t.env.bundles.BASE+t.env.bundles[e],i.setAttribute("data-ymaps-api-ns",r),i.setAttribute("data-ymaps-api-version","2.1.78"),i.async=!0;var o=t.vow.defer();return i.onerror=o.reject.bind(o),t.ns.__provideBundle=o.resolve.bind(o),document.head.appendChild(i),o.promise().always(function(e){return delete n[r],e})},createSandbox:function(e){var n=Object.create(e);return n.importImages=function(e){return{get:function(n){return a+e[n].src}}},t.utils.extend({},t,{modules:n})}}),t.ns.load=function(e,n,r,i){return"function"==typeof e?n?t.ns.ready(["package.full"],e,n):t.ns.ready(["package.full"],e):("string"==typeof e&&(e=[e]),t.ns.ready.apply(this,arguments))},function(){function e(e){return function(){console.warn("{NS}.modules.{FN} is not a public API and will be removed from {NS}.modules.".replace(/\{NS\}/g,t.env.namespace).replace(/\{FN\}/g,e));var n=t.modules[e].apply(t.modules,arguments);return n===t.modules?t.ns.modules:n}}t.ns.modules={require:function(){return t.modules.require.apply(t.modules,arguments)},isDefined:function(){return t.modules.isDefined.apply(t.modules,arguments)},requireSync:function(){return t.modules.requireSync.apply(t.modules,arguments)},define:function(e,n,r,i){return t.modules.define.apply(t.modules,arguments),t.ns.modules},defineSync:e("defineSync"),getDefinition:e("getDefinition"),getState:e("getState"),setOptions:e("setOptions"),flush:e("flush"),nextTick:e("nextTick"),watchResolving:e("watchResolving"),__modules:t.modules}}(),function(e){function n(){l&&(t.performance.saveMeasure("ymaps.readyDelay",t.performance.now()-t.performance.initTimings.responseEnd),l=!1);var e=t.performance.startMeasure("ymaps.ready"),n={};arguments.length&&(1!=arguments.length||"object"!=typeof arguments[0]||arguments[0].length?"function"!=typeof arguments[0]?(n.require="string"==typeof arguments[0]?[arguments[0]]:arguments[0],n.successCallback=arguments[1],n.errorCallback=arguments[2]&&"function"==typeof arguments[2]?arguments[2]:null,n.context=arguments[2]&&"object"==typeof arguments[2]?arguments[2]:arguments[3]):(n.successCallback=arguments[0],n.errorCallback=arguments[1]&&"function"==typeof arguments[1]?arguments[1]:null,n.context=arguments[1]&&"object"==typeof arguments[1]?arguments[1]:arguments[2]):n=arguments[0]);var r=n.require||[],i=o.all([t.modules.require(r),u,c]).spread(function(n){return t.utils.registerImports(t.ns,r,n),e.finish(),t.ns});return i.then(n.successCallback&&function(e){setTimeout(n.successCallback.bind(n.context),0,e)},n.errorCallback&&function(e){setTimeout(n.errorCallback.bind(n.context),0,e)}),i}function r(n,t){if(n){var r=i(e,n);r&&setTimeout(function(){r.method.call(r.context,t)})}}function i(e,n){var t=e;n=n.split(".");for(var r=0,i=n.length-1;r<i;r++)if(t=t[n[r]],!t)return;return{method:t[n[i]],context:t}}var o=t.vow,s=[].concat(["package.system"],t.env.preload.load.split(",").filter(Boolean)),a=t.performance.startMeasure("ymaps.preload"),u=t.modules.require(s).then(function(e){t.utils.registerImports(t.ns,s,e),a.finish(),r(t.env.preload.onLoad,t.ns)},function(e){return r(t.env.preload.onError,e),o.reject(e)}),c="complete"===document.readyState||"interactive"===document.readyState?o.resolve():new o.Promise(function(e){document.addEventListener("DOMContentLoaded",e,!1),document.addEventListener("load",e,!1)});t.ns.ready=n;var l=!0}(this),t.env.server.params.csp&&!t.supports.csp.isSupported&&t.logger.warning("CSP is not suported in this browser"),t.modules.define("vectorEngine.loadEngine",["vow","Hotspot","Monitor","collection.Item","event.Manager","hotspot.layer.Hint","hotspot.layer.optionMapper","interactivityModel.EventController","interactivityModel.layer","option.Manager","poi.BalloonManager","util.shapeFactory"],function(e,n){function r(){var e=n.defer(),r=document.createElement("script");return r.onload=e.resolve.bind(e),r.onerror=e.reject.bind(e),r.src=t.env.hosts.vectorIndex.replace("{{version}}",t.env.vectorVersion),t.env.vectorEngineFileName&&(r.src=r.src.replace("vector.min.js",t.env.vectorEngineFileName)),document.head.insertAdjacentElement("afterbegin",r),e.promise()["catch"](function(){return n.reject(new Error("Failed to load vector engine"))})}if("ymaps"!==t.env.namespace)throw new Error("Vector supports only `ymaps` namespace.");if(null==t.env.vectorVersion)throw new Error("No vector version.");var i=null;e(function(){return i=i||r()})}),t.modules.define("vectorEngine.preload",[],function(e){t.supports.vector.isSupported()&&t.modules.require(["vectorEngine.loadEngine"]).spread(function(e){e()}),e({})}),t.modules.allowRemoteLoading(),o&&(o.parent[o.name]=t.ns),t.performance.init({url:t.env.hosts.api.statCounter+"/counter",data:"/path="+t.env.version.replace(/\W/g,"_")+"."+t.env.browser.platform,enable:"all"==t.env.counters||Math.random()<r&&!t.env.server.params.debug,initUrl:document.currentScript&&document.currentScript.src,useSendBeacon:!t.env.server.params.csp}),t.env.hasValidApiKey||(t.env.apikey=void 0,"undefined"!=typeof t.env.hasValidApiKey&&console.warn("(Yandex Maps JS API): Invalid API key")),i.finish()})({"vectorVersion":"5.15.2","vectorVersionTimestamp":1620814269072,"cacheVersion":null,"type":"production","flags":[],"server":{"url":"https://api-maps.yandex.ru/2.1.78","path":"build/release","params":{"mode":"release","ns":"ymaps","csp":null}},"preload":{"load":"package.full","bundle":"full"},"mode":"release","debug":false,"namespace":"ymaps","enterprise":false,"hasApiKeyParam":false,"browser":{"name":"Chrome","version":"90.0.4430.93","base":"Chromium","engine":"WebKit","engineVersion":"537.36","osName":"Windows 10","osFamily":"Windows","osVersion":"10.0","isMobile":false,"isTablet":false,"multiTouch":false,"platform":"Desktop","cssPrefix":"Webkit"},"lang":"ru_RU","languageCode":"ru","countryCode":"RU","hosts":{"api":{"main":"https://api-maps.yandex.ru/","ua":"https://yandex.ru/legal/maps_termsofuse/?lang={{lang}}","maps":"https://yandex.ru/maps/","statCounter":"https://yandex.ru/clck/","services":{"coverage":"https://api-maps.yandex.ru/services/coverage/","geocode":"https://geocode-maps.yandex.ru/","geoxml":"https://api-maps.yandex.ru/services/geoxml/","inception":"https://api-maps.yandex.ru/services/inception/","panoramaLocate":"https://api-maps.yandex.ru/services/panoramas/","search":"https://api-maps.yandex.ru/services/search/","suggest":"https://suggest-maps.yandex.ru/","regions":"https://api-maps.yandex.ru/services/regions/","route":"https://api-maps.yandex.ru/services/route/"}},"layers":{"map":"https://core-renderer-tiles.maps.yandex.net/tiles?l=map&%c&%l","mapj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=mapj&%c&%l&experimental_disable_toponym_hotspots=true","sat":"https://core-sat.maps.yandex.net/tiles?l=sat&%c&%l","skl":"https://core-renderer-tiles.maps.yandex.net/tiles?l=skl&%c&%l","sklj":"https://core-renderer-tiles.maps.yandex.net/tiles?l=sklj&%c&%l","stv":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=stv&%c&v=%v&%l&format=png","sta":"https://0%d.core-stv-renderer.maps.yandex.net/2.x/tiles?l=sta&%c&v=%v&%l&format=png","staHotspot":"https://core-stv-renderer.maps.yandex.net/2.x/tiles?l=stj&%c&v=%v&format=js","staHotspotKey":"%c&l=stj&tm=%v","carparks":"https://core-carparks-renderer-lots.maps.yandex.net/"},"metro_RU":"https://yandex.ru/metro/","metro_UA":"https://yandex.ua/metro/","metro_BY":"https://yandex.by/metro/","metro_US":"https://yandex.com/metro/","traffic":"https://core-jams-rdr-cache.maps.yandex.net/","trafficInfo":"https://core-jams-info.maps.yandex.net/","trafficArchive":"https://core-jams-rdr-hist.maps.yandex.net/","vectorIndex":"https://yastatic.net/s3/mapsapi-v3/vector/{{version}}/out/vector.min.js","vectorTiles":"https://core-renderer-tiles.maps.yandex.net/vmap2/tiles?lang={{lang}}&x={{x}}&y={{y}}&z={{z}}&zmin={{zmin}}&zmax={{zmax}}&v={{version}}","vectorImages":"https://core-renderer-tiles.maps.yandex.net/vmap2/icons?id={{id}}&scale={{scale}}","vectorMeshes":"https://core-renderer-tiles.maps.yandex.net/vmap2/meshes?id={{id}}","vectorGlyphs":"https://core-renderer-tiles.maps.yandex.net/vmap2/glyphs?lang={{lang}}&font_id={{fontId}}&range={{range}}","indoorTiles":"https://core-renderer-tiles.maps.yandex.net/","panoramasTiles":"https://pano.maps.yandex.net/%s/%z.%x.%y","taxiRouteInfo":"https://taxi-routeinfo.taxi.yandex.net/taxi_info?clid=yamaps&apikey=f6d7c076e16e4d53a928961595e76215&rll={rll}"},"layers":{"map":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"sat":{"version":"3.786.0"},"skl":{"version":"21.05.12-0-b210423152000","scaled":true,"hotspotZoomRange":[1,23]},"stv":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"sta":{"version":"2021.05.11.20.21-1_21.04.27-0-8754"},"trf":{"version":"1620814200","scaled":true},"carparks":{"version":"","scaled":true,"hotspotZoomRange":[0,23]}},"geolocation":{"longitude":31.482771,"latitude":49.02753,"isHighAccuracy":false,"span":{"longitude":18.090408,"latitude":7.214737}},"token":"a005daa235b407b431a9b150bb3ea073","distribution":{},"version":"2.1.78","majorVersion":"2.1","cssPrefix":"ymaps-2-1-78-","tag":"2.1.78-11","coordinatesOrder":"latlong","bundles":{"panoramas":"/release/panoramas-8d02ed1377a16bfcc73b4950c04e42d8bed31c02.js","full":"/release/full-ffb813a29f30feadb63b5654242d042b7b6a91aa.js","BASE":"https://yastatic.net/s3/front-maps-static/maps-front-jsapi-v2-1/2.1.78-11/build"}}, null) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment