(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/common/downloadmanager.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '36187xGjVFOz6dZMgh6XWg8', 'downloadmanager'); // Scripts/common/downloadmanager.js "use strict"; window.DownloadManager = cc.Class({ ctor: function ctor() { this._spinesCache = []; }, checkAnimaCache: function checkAnimaCache() { return; cc.sys.localStorage.removeItem("sszg_anima_cache_1"); var cache_info = cc.sys.localStorage.getItem("sszg_anima_cache_1"); if (cache_info) { cache_info = JSON.parse(cache_info); if (cache_info.status != "finish") { var finish_num = parseInt(cache_info.status); if (typeof finish_num == "number" && finish_num > 0 && finish_num < CacheAnimas.length) { for (var anima_i = finish_num + 1; anima_i < CacheAnimas.length - 1; anima_i++) { this.downloadSpine(CacheAnimas[anima_i], anima_i); } } } } else { for (var anima_i in CacheAnimas) { this.downloadSpine(CacheAnimas[anima_i], anima_i); } } }, downloadSpine: function downloadSpine(spine_id, index) { var spine_info = { spine_id: spine_id, index: index }; this._spinesCache.push(spine_info); if (this._spinesCache.length > 0 && !this._downTimer) { this._downTimer = gcore.Timer.set(this.preDownLoad.bind(this), 500, -1); } }, preDownLoad: function preDownLoad() { var load_status = cc.loader.getDownLoadStatus(); if (!load_status) { // 主队列没有下载任务 var spine_info = this._spinesCache.shift(); if (spine_info.index) { var status = spine_info.index; if (spine_info.index >= CacheAnimas.length - 1) { status = "finish"; } cc.sys.localStorage.setItem("sszg_anima_cache_1", JSON.stringify({ status: status })); } this.doDownloadSpine(spine_info.spine_id); if (this._spinesCache.length <= 0 && this._downTimer) { gcore.Timer.del(this._downTimer); this._downTimer = null; } } }, doDownloadSpine: function doDownloadSpine(spine_id) { if (!spine_id) return; var spine_path = "spine/" + spine_id + "/"; // spien文件 var spine_uuids = cc.loader.getDirUuids(spine_path, sp.SkeletonData); cc.log(spine_uuids); // for (var spine_i in spine_uuids) { // var spine_url = cc.loader.getUrlWithUuid(spine_uuids[spine_i]); // this.downloadText(spine_url); // } // // 图片和纹理 // var img_uuids = cc.loader.getDirUuids(spine_path, cc.Texture2D); // for (var img_i in img_uuids) { // var texture_url = cc.loader.getUrlWithUuid(img_uuids[img_i]); // var img_url = texture_url.replace(".json", ".png"); // this.downloadText(texture_url); // this.downloadImage(img_url); // } }, downloadText: function downloadText(url, callback) { var xhr = cc.loader.getXMLHttpRequest(), // var xhr = new ActiveXObject("MSXML2.XMLHTTP"); errInfo = 'Load text file failed: ' + url; xhr.open('GET', url, true); if (xhr.overrideMimeType) xhr.overrideMimeType('text\/plain; charset=utf-8'); xhr.onload = function () { if (xhr.readyState === 4) { if (xhr.status === 200 || xhr.status === 0) { callback && callback(null, xhr.responseText); } else { callback && callback({ status: xhr.status, errorMessage: errInfo + '(wrong status)' }); } } else { callback && callback({ status: xhr.status, errorMessage: errInfo + '(wrong readyState)' }); } }; xhr.onerror = function () { callback && callback({ status: xhr.status, errorMessage: errInfo + '(error)' }); }; xhr.ontimeout = function () { callback && callback({ status: xhr.status, errorMessage: errInfo + '(time out)' }); }; xhr.send(null); }, downloadImage: function downloadImage(url, callback, isCrossOrigin) { if (!url) return; if (isCrossOrigin === undefined) isCrossOrigin = true; var img = new Image(); if (isCrossOrigin && window.location.protocol !== 'file:') { img.crossOrigin = 'anonymous'; } else { img.crossOrigin = null; } if (img.complete && img.naturalWidth > 0 && img.src === url) { return img; } else { var loadCallback = function loadCallback() { img.removeEventListener('load', loadCallback); img.removeEventListener('error', errorCallback); }; var errorCallback = function errorCallback() { img.removeEventListener('load', loadCallback); img.removeEventListener('error', errorCallback); }; img.addEventListener('load', loadCallback); img.addEventListener('error', errorCallback); img.src = url; } } }); DownloadManager.getInstance = function () { if (!DownloadManager.instance) { DownloadManager.instance = new DownloadManager(); } return DownloadManager.instance; }; module.exports = DownloadManager; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxkb3dubG9hZG1hbmFnZXIuanMiXSwibmFtZXMiOlsid2luZG93IiwiRG93bmxvYWRNYW5hZ2VyIiwiY2MiLCJDbGFzcyIsImN0b3IiLCJfc3BpbmVzQ2FjaGUiLCJjaGVja0FuaW1hQ2FjaGUiLCJzeXMiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiY2FjaGVfaW5mbyIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJzdGF0dXMiLCJmaW5pc2hfbnVtIiwicGFyc2VJbnQiLCJDYWNoZUFuaW1hcyIsImxlbmd0aCIsImFuaW1hX2kiLCJkb3dubG9hZFNwaW5lIiwic3BpbmVfaWQiLCJpbmRleCIsInNwaW5lX2luZm8iLCJwdXNoIiwiX2Rvd25UaW1lciIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJwcmVEb3duTG9hZCIsImJpbmQiLCJsb2FkX3N0YXR1cyIsImxvYWRlciIsImdldERvd25Mb2FkU3RhdHVzIiwic2hpZnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZG9Eb3dubG9hZFNwaW5lIiwiZGVsIiwic3BpbmVfcGF0aCIsInNwaW5lX3V1aWRzIiwiZ2V0RGlyVXVpZHMiLCJzcCIsIlNrZWxldG9uRGF0YSIsImxvZyIsImRvd25sb2FkVGV4dCIsInVybCIsImNhbGxiYWNrIiwieGhyIiwiZ2V0WE1MSHR0cFJlcXVlc3QiLCJlcnJJbmZvIiwib3BlbiIsIm92ZXJyaWRlTWltZVR5cGUiLCJvbmxvYWQiLCJyZWFkeVN0YXRlIiwicmVzcG9uc2VUZXh0IiwiZXJyb3JNZXNzYWdlIiwib25lcnJvciIsIm9udGltZW91dCIsInNlbmQiLCJkb3dubG9hZEltYWdlIiwiaXNDcm9zc09yaWdpbiIsInVuZGVmaW5lZCIsImltZyIsIkltYWdlIiwibG9jYXRpb24iLCJwcm90b2NvbCIsImNyb3NzT3JpZ2luIiwiY29tcGxldGUiLCJuYXR1cmFsV2lkdGgiLCJzcmMiLCJsb2FkQ2FsbGJhY2siLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZXJyb3JDYWxsYmFjayIsImFkZEV2ZW50TGlzdGVuZXIiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxlQUFQLEdBQXlCQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUNqQ0MsRUFBQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ1YsU0FBS0MsWUFBTCxHQUFvQixFQUFwQjtBQUNOLEdBSGdDO0FBSzlCQyxFQUFBQSxlQUFlLEVBQUUsMkJBQVc7QUFDeEI7QUFDQUosSUFBQUEsRUFBRSxDQUFDSyxHQUFILENBQU9DLFlBQVAsQ0FBb0JDLFVBQXBCLENBQStCLG9CQUEvQjtBQUNBLFFBQUlDLFVBQVUsR0FBR1IsRUFBRSxDQUFDSyxHQUFILENBQU9DLFlBQVAsQ0FBb0JHLE9BQXBCLENBQTRCLG9CQUE1QixDQUFqQjs7QUFDQSxRQUFJRCxVQUFKLEVBQWdCO0FBQ1pBLE1BQUFBLFVBQVUsR0FBR0UsSUFBSSxDQUFDQyxLQUFMLENBQVdILFVBQVgsQ0FBYjs7QUFDQSxVQUFJQSxVQUFVLENBQUNJLE1BQVgsSUFBcUIsUUFBekIsRUFBbUM7QUFDL0IsWUFBSUMsVUFBVSxHQUFHQyxRQUFRLENBQUNOLFVBQVUsQ0FBQ0ksTUFBWixDQUF6Qjs7QUFDQSxZQUFJLE9BQU9DLFVBQVAsSUFBcUIsUUFBckIsSUFBaUNBLFVBQVUsR0FBRyxDQUE5QyxJQUFtREEsVUFBVSxHQUFHRSxXQUFXLENBQUNDLE1BQWhGLEVBQXdGO0FBQ3BGLGVBQUssSUFBSUMsT0FBTyxHQUFHSixVQUFVLEdBQUcsQ0FBaEMsRUFBbUNJLE9BQU8sR0FBR0YsV0FBVyxDQUFDQyxNQUFaLEdBQXFCLENBQWxFLEVBQXFFQyxPQUFPLEVBQTVFLEVBQWlGO0FBQzdFLGlCQUFLQyxhQUFMLENBQW1CSCxXQUFXLENBQUNFLE9BQUQsQ0FBOUIsRUFBeUNBLE9BQXpDO0FBQ0g7QUFDSjtBQUNKO0FBQ0osS0FWRCxNQVVP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QXdCLE9BQXhCLEVBQWlDQyxhQUFqQztBQUNILE9BSEQ7O0FBSUFWLE1BQUFBLEdBQUcsQ0FBQ1csZ0JBQUosQ0FBcUIsTUFBckIsRUFBNkJILFlBQTdCO0FBQ0FSLE1BQUFBLEdBQUcsQ0FBQ1csZ0JBQUosQ0FBcUIsT0FBckIsRUFBOEJELGFBQTlCO0FBQ0FWLE1BQUFBLEdBQUcsQ0FBQ08sR0FBSixHQUFVeEIsR0FBVjtBQUNIO0FBQ0o7QUF2STZCLENBQVQsQ0FBekI7O0FBNElBN0MsZUFBZSxDQUFDMEUsV0FBaEIsR0FBOEIsWUFBWTtBQUN0QyxNQUFJLENBQUMxRSxlQUFlLENBQUMyRSxRQUFyQixFQUErQjtBQUMzQjNFLElBQUFBLGVBQWUsQ0FBQzJFLFFBQWhCLEdBQTJCLElBQUkzRSxlQUFKLEVBQTNCO0FBQ0g7O0FBQ0QsU0FBT0EsZUFBZSxDQUFDMkUsUUFBdkI7QUFDSCxDQUxEOztBQU9BQyxNQUFNLENBQUNDLE9BQVAsR0FBaUI3RSxlQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsid2luZG93LkRvd25sb2FkTWFuYWdlciA9IGNjLkNsYXNzKHtcclxuXHRjdG9yOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLl9zcGluZXNDYWNoZSA9IFtdO1xyXG5cdH0sXHJcblxyXG4gICAgY2hlY2tBbmltYUNhY2hlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJzc3pnX2FuaW1hX2NhY2hlXzFcIik7XHJcbiAgICAgICAgdmFyIGNhY2hlX2luZm8gPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzc3pnX2FuaW1hX2NhY2hlXzFcIik7XHJcbiAgICAgICAgaWYgKGNhY2hlX2luZm8pIHsgXHJcbiAgICAgICAgICAgIGNhY2hlX2luZm8gPSBKU09OLnBhcnNlKGNhY2hlX2luZm8pO1xyXG4gICAgICAgICAgICBpZiAoY2FjaGVfaW5mby5zdGF0dXMgIT0gXCJmaW5pc2hcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaF9udW0gPSBwYXJzZUludChjYWNoZV9pbmZvLnN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbmlzaF9udW0gPT0gXCJudW1iZXJcIiAmJiBmaW5pc2hfbnVtID4gMCAmJiBmaW5pc2hfbnVtIDwgQ2FjaGVBbmltYXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYW5pbWFfaSA9IGZpbmlzaF9udW0gKyAxOyBhbmltYV9pIDwgQ2FjaGVBbmltYXMubGVuZ3RoIC0gMTsgYW5pbWFfaSArKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkU3BpbmUoQ2FjaGVBbmltYXNbYW5pbWFfaV0sIGFuaW1hX2kpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGFuaW1hX2kgaW4gQ2FjaGVBbmltYXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRTcGluZShDYWNoZUFuaW1hc1thbmltYV9pXSwgYW5pbWFfaSk7XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGRvd25sb2FkU3BpbmU6IGZ1bmN0aW9uKHNwaW5lX2lkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBzcGluZV9pbmZvID0ge3NwaW5lX2lkOiBzcGluZV9pZCwgaW5kZXg6IGluZGV4fTtcclxuICAgICAgICB0aGlzLl9zcGluZXNDYWNoZS5wdXNoKHNwaW5lX2luZm8pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3BpbmVzQ2FjaGUubGVuZ3RoID4gMCAmJiAhdGhpcy5fZG93blRpbWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rvd25UaW1lciA9IGdjb3JlLlRpbWVyLnNldCh0aGlzLnByZURvd25Mb2FkLmJpbmQodGhpcyksIDUwMCwgLTEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcHJlRG93bkxvYWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBsb2FkX3N0YXR1cyA9IGNjLmxvYWRlci5nZXREb3duTG9hZFN0YXR1cygpO1xyXG4gICAgICAgIGlmICghbG9hZF9zdGF0dXMpIHsgICAgICAgIC8vIOS4u+mYn+WIl+ayoeacieS4i+i9veS7u+WKoVxyXG4gICAgICAgICAgICB2YXIgc3BpbmVfaW5mbyA9IHRoaXMuX3NwaW5lc0NhY2hlLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3BpbmVfaW5mby5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHNwaW5lX2luZm8uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3BpbmVfaW5mby5pbmRleCA+PSBDYWNoZUFuaW1hcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gXCJmaW5pc2hcIlxyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInNzemdfYW5pbWFfY2FjaGVfMVwiLCBKU09OLnN0cmluZ2lmeSh7c3RhdHVzOiBzdGF0dXN9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kb0Rvd25sb2FkU3BpbmUoc3BpbmVfaW5mby5zcGluZV9pZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3BpbmVzQ2FjaGUubGVuZ3RoIDw9IDAgJiYgdGhpcy5fZG93blRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5fZG93blRpbWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25UaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGRvRG93bmxvYWRTcGluZTogZnVuY3Rpb24oc3BpbmVfaWQpIHtcclxuICAgICAgICBpZiAoIXNwaW5lX2lkKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgdmFyIHNwaW5lX3BhdGggPSBcInNwaW5lL1wiICsgc3BpbmVfaWQgKyBcIi9cIjtcclxuICAgICAgICAvLyBzcGllbuaWh+S7tlxyXG4gICAgICAgIHZhciBzcGluZV91dWlkcyA9IGNjLmxvYWRlci5nZXREaXJVdWlkcyhzcGluZV9wYXRoLCBzcC5Ta2VsZXRvbkRhdGEpO1xyXG5cclxuICAgICAgICBjYy5sb2coc3BpbmVfdXVpZHMpO1xyXG5cclxuICAgICAgICAvLyBmb3IgKHZhciBzcGluZV9pIGluIHNwaW5lX3V1aWRzKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBzcGluZV91cmwgPSBjYy5sb2FkZXIuZ2V0VXJsV2l0aFV1aWQoc3BpbmVfdXVpZHNbc3BpbmVfaV0pO1xyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5kb3dubG9hZFRleHQoc3BpbmVfdXJsKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIC8vIOWbvueJh+WSjOe6ueeQhlxyXG4gICAgICAgIC8vIHZhciBpbWdfdXVpZHMgPSBjYy5sb2FkZXIuZ2V0RGlyVXVpZHMoc3BpbmVfcGF0aCwgY2MuVGV4dHVyZTJEKTtcclxuICAgICAgICAvLyBmb3IgKHZhciBpbWdfaSBpbiBpbWdfdXVpZHMpIHtcclxuICAgICAgICAvLyAgICAgdmFyIHRleHR1cmVfdXJsID0gY2MubG9hZGVyLmdldFVybFdpdGhVdWlkKGltZ191dWlkc1tpbWdfaV0pO1xyXG4gICAgICAgIC8vICAgICB2YXIgaW1nX3VybCA9IHRleHR1cmVfdXJsLnJlcGxhY2UoXCIuanNvblwiLCBcIi5wbmdcIik7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuZG93bmxvYWRUZXh0KHRleHR1cmVfdXJsKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5kb3dubG9hZEltYWdlKGltZ191cmwpOyBcclxuICAgICAgICAvLyB9XHJcbiAgICB9LFxyXG5cclxuICAgIGRvd25sb2FkVGV4dDogZnVuY3Rpb24gKHVybCwgY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgeGhyID0gY2MubG9hZGVyLmdldFhNTEh0dHBSZXF1ZXN0KCksXHJcbiAgICAgICAgLy8gdmFyIHhociA9IG5ldyBBY3RpdmVYT2JqZWN0KFwiTVNYTUwyLlhNTEhUVFBcIik7XHJcbiAgICAgICAgZXJySW5mbyA9ICdMb2FkIHRleHQgZmlsZSBmYWlsZWQ6ICcgKyB1cmw7XHJcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHhoci5vdmVycmlkZU1pbWVUeXBlKSB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dFxcL3BsYWluOyBjaGFyc2V0PXV0Zi04Jyk7XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwIHx8IHhoci5zdGF0dXMgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhudWxsLCB4aHIucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHtzdGF0dXM6eGhyLnN0YXR1cywgZXJyb3JNZXNzYWdlOmVyckluZm8gKyAnKHdyb25nIHN0YXR1cyknfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayh7c3RhdHVzOnhoci5zdGF0dXMsIGVycm9yTWVzc2FnZTplcnJJbmZvICsgJyh3cm9uZyByZWFkeVN0YXRlKSd9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayh7c3RhdHVzOnhoci5zdGF0dXMsIGVycm9yTWVzc2FnZTplcnJJbmZvICsgJyhlcnJvciknfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soe3N0YXR1czp4aHIuc3RhdHVzLCBlcnJvck1lc3NhZ2U6ZXJySW5mbyArICcodGltZSBvdXQpJ30pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgeGhyLnNlbmQobnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRvd25sb2FkSW1hZ2U6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2ssIGlzQ3Jvc3NPcmlnaW4pIHsgICAgIFxyXG4gICAgICAgIGlmICghdXJsKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzQ3Jvc3NPcmlnaW4gPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgaXNDcm9zc09yaWdpbiA9IHRydWU7XHJcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIGlmIChpc0Nyb3NzT3JpZ2luICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6Jykge1xyXG4gICAgICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW1nLmNvbXBsZXRlICYmIGltZy5uYXR1cmFsV2lkdGggPiAwICYmIGltZy5zcmMgPT09IHVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaW1nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiBsb2FkQ2FsbGJhY2soKSB7XHJcbiAgICAgICAgICAgICAgICBpbWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGxvYWRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICBpbWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvckNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIGVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiBlcnJvckNhbGxiYWNrKCkge1xyXG4gICAgICAgICAgICAgICAgaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGltZy5zcmMgPSB1cmw7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcblxyXG59KVxyXG5cclxuRG93bmxvYWRNYW5hZ2VyLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCFEb3dubG9hZE1hbmFnZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICBEb3dubG9hZE1hbmFnZXIuaW5zdGFuY2UgPSBuZXcgRG93bmxvYWRNYW5hZ2VyKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRG93bmxvYWRNYW5hZ2VyLmluc3RhbmNlO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERvd25sb2FkTWFuYWdlcjsiXX0=