1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | 1 1 18 18 10 10 10 10 10 10 10 1 1 10 10 10 1 1 10 8 8 10 3 7 4 3 3 10 10 10 10 3 3 3 1 1 2 3 10 4 4 4 1 1 3 4 10 3 3 3 1 1 2 3 10 10 10 10 18 13 13 13 3 7 3 3 3 10 9 9 9 1 1 1 10 10 10 10 10 10 7 7 3 10 18 | "use strict"; (function (angular) { "use strict"; angular.module("oc.lazyLoad").config(function ($provide) { $provide.decorator("$ocLazyLoad", function ($delegate, $q) { /** * The function that loads new files * @param config * @param params * @returns {*} */ $delegate.filesLoader = function filesLoader(config) { var params = arguments[1] === undefined ? {} : arguments[1]; var cssFiles = [], templatesFiles = [], jsFiles = [], promises = [], cachePromise = null, filesCache = $delegate.getFilesCache(); $delegate.toggleWatch(true); // start watching angular.module calls angular.extend(params, config); var pushFile = function pushFile(path) { var file_type = null, m; if (angular.isObject(path)) { file_type = path.type; path = path.path; } cachePromise = filesCache.get(path); Eif (angular.isUndefined(cachePromise) || params.cache === false) { // always check for requirejs syntax just in case if ((m = /^(css|less|html|htm|js)?(?=!)/.exec(path)) !== null) { // Detect file type using preceding type declaration (ala requireJS) file_type = m[1]; path = path.substr(m[1].length + 1, path.length); // Strip the type from the path } if (!file_type) { Eif ((m = /[.](css|less|html|htm|js)?(\?.*)?$/.exec(path)) !== null) { // Detect file type via file extension file_type = m[1]; } else if (!$delegate.jsLoader.hasOwnProperty("ocLazyLoadLoader") && $delegate.jsLoader.hasOwnProperty("load")) { // requirejs file_type = "js"; } else { $delegate.$log.error("File type could not be determined. " + path); return; } } if ((file_type === "css" || file_type === "less") && cssFiles.indexOf(path) === -1) { cssFiles.push(path); } else if ((file_type === "html" || file_type === "htm") && templatesFiles.indexOf(path) === -1) { templatesFiles.push(path); } else Eif (file_type === "js" || jsFiles.indexOf(path) === -1) { jsFiles.push(path); } else { $delegate.$log.error("File type is not valid. " + path); } } else if (cachePromise) { promises.push(cachePromise); } }; Iif (params.serie) { pushFile(params.files.shift()); } else { angular.forEach(params.files, function (path) { pushFile(path); }); } if (cssFiles.length > 0) { var cssDeferred = $q.defer(); $delegate.cssLoader(cssFiles, function (err) { if (angular.isDefined(err) && $delegate.cssLoader.hasOwnProperty("ocLazyLoadLoader")) { $delegate.$log.error(err); cssDeferred.reject(err); } else { cssDeferred.resolve(); } }, params); promises.push(cssDeferred.promise); } if (templatesFiles.length > 0) { var templatesDeferred = $q.defer(); $delegate.templatesLoader(templatesFiles, function (err) { if (angular.isDefined(err) && $delegate.templatesLoader.hasOwnProperty("ocLazyLoadLoader")) { $delegate.$log.error(err); templatesDeferred.reject(err); } else { templatesDeferred.resolve(); } }, params); promises.push(templatesDeferred.promise); } if (jsFiles.length > 0) { var jsDeferred = $q.defer(); $delegate.jsLoader(jsFiles, function (err) { if (angular.isDefined(err) && $delegate.jsLoader.hasOwnProperty("ocLazyLoadLoader")) { $delegate.$log.error(err); jsDeferred.reject(err); } else { jsDeferred.resolve(); } }, params); promises.push(jsDeferred.promise); } Iif (params.serie && params.files.length > 0) { return $q.all(promises).then(function success() { return $delegate.filesLoader(config, params); }); } else { return $q.all(promises)["finally"](function (res) { $delegate.toggleWatch(false); // stop watching angular.module calls return res; }); } }; /** * Load a module or a list of modules into Angular * @param module Mixed the name of a predefined module config object, or a module config object, or an array of either * @param params Object optional parameters * @returns promise */ $delegate.load = function (module) { var params = arguments[1] === undefined ? {} : arguments[1]; var self = this, config = null, deferredList = [], deferred = $q.defer(), errText; // If module is an array, break it down if (angular.isArray(module)) { // Resubmit each entry as a single module angular.forEach(module, function (m) { deferredList.push(self.load(m, params)); }); // Resolve the promise once everything has loaded $q.all(deferredList).then(function success() { deferred.resolve(module); }, function error(err) { deferred.reject(err); }); return deferred.promise; } // Get or Set a configuration depending on what was passed in if (angular.isString(module)) { config = self.getModuleConfig(module); Eif (!config) { config = { files: [module] }; } } else Eif (angular.isObject(module)) { // case {type: 'js', path: lazyLoadUrl + 'testModule.fakejs'} Eif (angular.isDefined(module.path) && angular.isDefined(module.type)) { config = { files: [module] }; } else { config = self.setModuleConfig(module); } } Iif (config === null) { var moduleName = self.getModuleName(module); errText = "Module \"" + (moduleName || "unknown") + "\" is not configured, cannot load."; $delegate.$log.error(errText); deferred.reject(new Error(errText)); return deferred.promise; } else { // deprecated Iif (angular.isDefined(config.template)) { if (angular.isUndefined(config.files)) { config.files = []; } if (angular.isString(config.template)) { config.files.push(config.template); } else if (angular.isArray(config.template)) { config.files.concat(config.template); } } } var localParams = {}; angular.extend(localParams, params, config); // if someone used an external loader and called the load function with just the module name Iif (angular.isUndefined(config.files) && angular.isDefined(config.name) && $delegate.moduleExists(config.name)) { return $delegate.inject(config.name, localParams); } $delegate.filesLoader(config, localParams).then(function success() { $delegate.inject(null, localParams).then(function () { deferred.resolve(); }, function (err) { deferred.reject(err); }); }, function error(err) { deferred.reject(err); }); return deferred.promise; }; // return the patched service return $delegate; }); }); })(angular); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL2xvYWRlcnMvb2NMYXp5TG9hZC5sb2FkZXJzLmNvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxDQUFDLFVBQVMsT0FBTyxFQUFFO0FBQ2YsZ0JBQVksQ0FBQzs7QUFFYixXQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFTLFFBQVEsRUFBRTtBQUNwRCxnQkFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsVUFBUyxTQUFTLEVBQUUsRUFBRSxFQUFFOzs7Ozs7O0FBT3RELHFCQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBZTtvQkFBYixNQUFNLGdDQUFHLEVBQUU7O0FBQzVELG9CQUFJLFFBQVEsR0FBRyxFQUFFO29CQUNiLGNBQWMsR0FBRyxFQUFFO29CQUNuQixPQUFPLEdBQUcsRUFBRTtvQkFDWixRQUFRLEdBQUcsRUFBRTtvQkFDYixZQUFZLEdBQUcsSUFBSTtvQkFDbkIsVUFBVSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7QUFFM0MseUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRTVCLHVCQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzs7QUFFL0Isb0JBQUksUUFBUSxHQUFHLGtCQUFTLElBQUksRUFBRTtBQUMxQix3QkFBSSxTQUFTLEdBQUcsSUFBSTt3QkFBRSxDQUFDLENBQUM7QUFDeEIsd0JBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN2QixpQ0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDdEIsNEJBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNwQjtBQUNELGdDQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyx3QkFBRyxPQUFPLENBQUMsV0FB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LFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDckQ7O0FBRUQseUJBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLE9BQU8sR0FBRztBQUMvRCw2QkFBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVc7QUFDaEQsZ0NBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDdEIsRUFBRSxVQUFTLEdBQUcsRUFBRTtBQUNiLGdDQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN4QixDQUFDLENBQUM7aUJBQ04sRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUU7QUFDbkIsNEJBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3hCLENBQUMsQ0FBQzs7QUFFSCx1QkFBTyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQzNCLENBQUM7OztBQUdGLG1CQUFPLFNBQVMsQ0FBQztTQUNwQixDQUFDLENBQUM7S0FDTixDQUFDLENBQUM7Q0FFTixDQUFBLENBQUUsT0FBTyxDQUFDLENBQUMiLCJmaWxlIjoiQzovd2FtcC93d3cvb2NMYXp5TG9hZC9zcmMvbG9hZGVycy9vY0xhenlMb2FkLmxvYWRlcnMuY29yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbihhbmd1bGFyKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ29jLmxhenlMb2FkJykuY29uZmlnKGZ1bmN0aW9uKCRwcm92aWRlKSB7XG4gICAgICAgICRwcm92aWRlLmRlY29yYXRvcignJG9jTGF6eUxvYWQnLCBmdW5jdGlvbigkZGVsZWdhdGUsICRxKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGxvYWRzIG5ldyBmaWxlc1xuICAgICAgICAgICAgICogQHBhcmFtIGNvbmZpZ1xuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICRkZWxlZ2F0ZS5maWxlc0xvYWRlciA9IGZ1bmN0aW9uIGZpbGVzTG9hZGVyKGNvbmZpZywgcGFyYW1zID0ge30pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3NzRmlsZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRmlsZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAganNGaWxlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZVByb21pc2UgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBmaWxlc0NhY2hlID0gJGRlbGVnYXRlLmdldEZpbGVzQ2FjaGUoKTtcblxuICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS50b2dnbGVXYXRjaCh0cnVlKTsgLy8gc3RhcnQgd2F0Y2hpbmcgYW5ndWxhci5tb2R1bGUgY2FsbHNcblxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHBhcmFtcywgY29uZmlnKTtcblxuICAgICAgICAgICAgICAgIHZhciBwdXNoRmlsZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfdHlwZSA9IG51bGwsIG07XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNPYmplY3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IHBhdGgudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FjaGVQcm9taXNlID0gZmlsZXNDYWNoZS5nZXQocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY2FjaGVQcm9taXNlKSB8fCBwYXJhbXMuY2FjaGUgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBjaGVjayBmb3IgcmVxdWlyZWpzIHN5bnRheCBqdXN0IGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtID0gL14oY3NzfGxlc3N8aHRtbHxodG18anMpPyg/PSEpLy5leGVjKHBhdGgpKSAhPT0gbnVsbCkgeyAvLyBEZXRlY3QgZmlsZSB0eXBlIHVzaW5nIHByZWNlZGluZyB0eXBlIGRlY2xhcmF0aW9uIChhbGEgcmVxdWlyZUpTKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKG1bMV0ubGVuZ3RoICsgMSwgcGF0aC5sZW5ndGgpOyAgLy8gU3RyaXAgdGhlIHR5cGUgZnJvbSB0aGUgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighZmlsZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG0gPSAvWy5dKGNzc3xsZXNzfGh0bWx8aHRtfGpzKT8oXFw/LiopPyQvLmV4ZWMocGF0aCkpICE9PSBudWxsKSB7ICAvLyBEZXRlY3QgZmlsZSB0eXBlIHZpYSBmaWxlIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3R5cGUgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZighJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykgJiYgJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdsb2FkJykpIHsgLy8gcmVxdWlyZWpzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9ICdqcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoJ0ZpbGUgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gJyArIHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigoZmlsZV90eXBlID09PSAnY3NzJyB8fCBmaWxlX3R5cGUgPT09ICdsZXNzJykgJiYgY3NzRmlsZXMuaW5kZXhPZihwYXRoKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NGaWxlcy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKChmaWxlX3R5cGUgPT09ICdodG1sJyB8fCBmaWxlX3R5cGUgPT09ICdodG0nKSAmJiB0ZW1wbGF0ZXNGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlc0ZpbGVzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKGZpbGVfdHlwZSA9PT0gJ2pzJykgfHwganNGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRmlsZXMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoJ0ZpbGUgdHlwZSBpcyBub3QgdmFsaWQuICcgKyBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2FjaGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhcmFtcy5maWxlcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocGFyYW1zLmZpbGVzLCBwYXRoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjc3NGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjc3NEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5jc3NMb2FkZXIoY3NzRmlsZXMsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUuY3NzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY3NzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYodGVtcGxhdGVzRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGVzRGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUudGVtcGxhdGVzTG9hZGVyKHRlbXBsYXRlc0ZpbGVzLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGVycikgJiYgJGRlbGVnYXRlLnRlbXBsYXRlc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnb2NMYXp5TG9hZExvYWRlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNEZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRlbXBsYXRlc0RlZmVycmVkLnByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGpzRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIganNEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5qc0xvYWRlcihqc0ZpbGVzLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGVycikgJiYgJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGpzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllICYmIHBhcmFtcy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gc3VjY2VzcygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKHByb21pc2VzKS5maW5hbGx5KGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRvZ2dsZVdhdGNoKGZhbHNlKTsgLy8gc3RvcCB3YXRjaGluZyBhbmd1bGFyLm1vZHVsZSBjYWxsc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkIGEgbW9kdWxlIG9yIGEgbGlzdCBvZiBtb2R1bGVzIGludG8gQW5ndWxhclxuICAgICAgICAgICAgICogQHBhcmFtIG1vZHVsZSBNaXhlZCB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGEgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGFuIGFycmF5IG9mIGVpdGhlclxuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtcyBPYmplY3Qgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICogQHJldHVybnMgcHJvbWlzZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAkZGVsZWdhdGUubG9hZCA9IGZ1bmN0aW9uKG1vZHVsZSwgcGFyYW1zID0ge30pIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkTGlzdCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXG4gICAgICAgICAgICAgICAgICAgIGVyclRleHQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBtb2R1bGUgaXMgYW4gYXJyYXksIGJyZWFrIGl0IGRvd25cbiAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN1Ym1pdCBlYWNoIGVudHJ5IGFzIGEgc2luZ2xlIG1vZHVsZVxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobW9kdWxlLCBmdW5jdGlvbihtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZExpc3QucHVzaChzZWxmLmxvYWQobSwgcGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugb25jZSBldmVyeXRoaW5nIGhhcyBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgJHEuYWxsKGRlZmVycmVkTGlzdCkudGhlbihmdW5jdGlvbiBzdWNjZXNzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgb3IgU2V0IGEgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCB3YXMgcGFzc2VkIGluXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogW21vZHVsZV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoYW5ndWxhci5pc09iamVjdChtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2Uge3R5cGU6ICdqcycsIHBhdGg6IGxhenlMb2FkVXJsICsgJ3Rlc3RNb2R1bGUuZmFrZWpzJ31cbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQobW9kdWxlLnBhdGgpICYmIGFuZ3VsYXIuaXNEZWZpbmVkKG1vZHVsZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBbbW9kdWxlXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuc2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBzZWxmLmdldE1vZHVsZU5hbWUobW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyVGV4dCA9ICdNb2R1bGUgXCInICsgKG1vZHVsZU5hbWUgfHwgJ3Vua25vd24nKSArICdcIiBpcyBub3QgY29uZmlndXJlZCwgY2Fubm90IGxvYWQuJztcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoZXJyVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoZXJyVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXByZWNhdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGNvbmZpZy50ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY29uZmlnLmZpbGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhjb25maWcudGVtcGxhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbGVzLnB1c2goY29uZmlnLnRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihhbmd1bGFyLmlzQXJyYXkoY29uZmlnLnRlbXBsYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlcy5jb25jYXQoY29uZmlnLnRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBsb2NhbFBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGxvY2FsUGFyYW1zLCBwYXJhbXMsIGNvbmZpZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBzb21lb25lIHVzZWQgYW4gZXh0ZXJuYWwgbG9hZGVyIGFuZCBjYWxsZWQgdGhlIGxvYWQgZnVuY3Rpb24gd2l0aCBqdXN0IHRoZSBtb2R1bGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY29uZmlnLmZpbGVzKSAmJiBhbmd1bGFyLmlzRGVmaW5lZChjb25maWcubmFtZSkgJiYgJGRlbGVnYXRlLm1vZHVsZUV4aXN0cyhjb25maWcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRkZWxlZ2F0ZS5pbmplY3QoY29uZmlnLm5hbWUsIGxvY2FsUGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBsb2NhbFBhcmFtcykudGhlbihmdW5jdGlvbiBzdWNjZXNzKCkge1xuICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuaW5qZWN0KG51bGwsIGxvY2FsUGFyYW1zKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcGF0Y2hlZCBzZXJ2aWNlXG4gICAgICAgICAgICByZXR1cm4gJGRlbGVnYXRlO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxufSkoYW5ndWxhcik7XG4iXX0= |