Code coverage report for ./src/ocLazyLoad.loaders.core.js

Statements: 80% (88 / 110)      Branches: 66.29% (59 / 89)      Functions: 94.74% (18 / 19)      Lines: 80% (88 / 110)      Ignored: none     

All files » ./src\ » ocLazyLoad.loaders.core.js
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 24             23 15   15             15   15   15 15   15 1 1   15 15     15   1 1     15 13   13                   15 3 12 4 8 8                 15     15 15       15 3 3 3 1 1   2     3     15 4 4 4 1 1   3     4     15 8 8 8 1 1   7     8     15         15 15 15                     23 20   20             20   5 10       5 4   1     5       15 13 13 13       2   2 1       1       15               15                       15 15     15       15 12 11   1     3     15       23        
"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(res) {
                        deferred.resolve(res);
                    }, 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'}
                    if (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 (res) {
                        deferred.resolve(res);
                    }, 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsQ0FBQyxVQUFTLE9BQU8sRUFBRTtBQUNmLGdCQUFZLENBQUM7O0FBRWIsV0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBUyxRQUFRLEVBQUU7QUFDcEQsZ0JBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFVBQVMsU0FBUyxFQUFFLEVBQUUsRUFBRTs7Ozs7OztBQU90RCxxQkFBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQWU7b0JBQWIsTUFBTSxnQ0FBRyxFQUFFOztBQUM1RCxvQkFBSSxRQUFRLEdBQUcsRUFBRTtvQkFDYixjQUFjLEdBQUcsRUFBRTtvQkFDbkIsT0FBTyxHQUFHLEVBQUU7b0JBQ1osUUFBUSxHQUFHLEVBQUU7b0JBQ2IsWUFBWSxHQUFHLElBQUk7b0JBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7O0FBRTVDLHlCQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUU1Qix1QkFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBRS9CLG9CQUFJLFFBQVEsR0FBRyxrQkFBUyxJQUFJLEVBQUU7QUFDMUIsd0JBQUksU0FBUyxHQUFHLElBQUk7d0JBQUUsQ0FBQyxDQUFDO0FBQ3hCLHdCQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdkIsaUNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RCLDRCQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDcEI7QUFDRCxnQ0FBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsd0JBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZ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QU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUNyRDs7QUFFRCx5QkFBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsT0FBTyxHQUFHO0FBQy9ELDZCQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBUyxHQUFHLEVBQUU7QUFDbkQsZ0NBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3pCLEVBQUUsVUFBUyxHQUFHLEVBQUU7QUFDYixnQ0FBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDeEIsQ0FBQyxDQUFDO2lCQUNOLEVBQUUsU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFO0FBQ25CLDRCQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QixDQUFDLENBQUM7O0FBRUgsdUJBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUMzQixDQUFDOzs7QUFHRixtQkFBTyxTQUFTLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ04sQ0FBQyxDQUFDO0NBRU4sQ0FBQSxDQUFFLE9BQU8sQ0FBQyxDQUFDIiwiZmlsZSI6IkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb3JlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKGFuZ3VsYXIpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnb2MubGF6eUxvYWQnKS5jb25maWcoZnVuY3Rpb24oJHByb3ZpZGUpIHtcbiAgICAgICAgJHByb3ZpZGUuZGVjb3JhdG9yKCckb2NMYXp5TG9hZCcsIGZ1bmN0aW9uKCRkZWxlZ2F0ZSwgJHEpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgbG9hZHMgbmV3IGZpbGVzXG4gICAgICAgICAgICAgKiBAcGFyYW0gY29uZmlnXG4gICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJGRlbGVnYXRlLmZpbGVzTG9hZGVyID0gZnVuY3Rpb24gZmlsZXNMb2FkZXIoY29uZmlnLCBwYXJhbXMgPSB7fSkge1xuICAgICAgICAgICAgICAgIHZhciBjc3NGaWxlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNGaWxlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBqc0ZpbGVzID0gW10sXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlUHJvbWlzZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzQ2FjaGUgPSAkZGVsZWdhdGUuX2dldEZpbGVzQ2FjaGUoKTtcblxuICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS50b2dnbGVXYXRjaCh0cnVlKTsgLy8gc3RhcnQgd2F0Y2hpbmcgYW5ndWxhci5tb2R1bGUgY2FsbHNcblxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHBhcmFtcywgY29uZmlnKTtcblxuICAgICAgICAgICAgICAgIHZhciBwdXNoRmlsZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfdHlwZSA9IG51bGwsIG07XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNPYmplY3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IHBhdGgudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FjaGVQcm9taXNlID0gZmlsZXNDYWNoZS5nZXQocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY2FjaGVQcm9taXNlKSB8fCBwYXJhbXMuY2FjaGUgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBjaGVjayBmb3IgcmVxdWlyZWpzIHN5bnRheCBqdXN0IGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtID0gL14oY3NzfGxlc3N8aHRtbHxodG18anMpPyg/PSEpLy5leGVjKHBhdGgpKSAhPT0gbnVsbCkgeyAvLyBEZXRlY3QgZmlsZSB0eXBlIHVzaW5nIHByZWNlZGluZyB0eXBlIGRlY2xhcmF0aW9uIChhbGEgcmVxdWlyZUpTKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKG1bMV0ubGVuZ3RoICsgMSwgcGF0aC5sZW5ndGgpOyAgLy8gU3RyaXAgdGhlIHR5cGUgZnJvbSB0aGUgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighZmlsZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG0gPSAvWy5dKGNzc3xsZXNzfGh0bWx8aHRtfGpzKT8oKFxcP3wjKS4qKT8kLy5leGVjKHBhdGgpKSAhPT0gbnVsbCkgeyAgLy8gRGV0ZWN0IGZpbGUgdHlwZSB2aWEgZmlsZSBleHRlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV90eXBlID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoISRkZWxlZ2F0ZS5qc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnb2NMYXp5TG9hZExvYWRlcicpICYmICRkZWxlZ2F0ZS5qc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnbG9hZCcpKSB7IC8vIHJlcXVpcmVqc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3R5cGUgPSAnanMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcignRmlsZSB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAnICsgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChmaWxlX3R5cGUgPT09ICdjc3MnIHx8IGZpbGVfdHlwZSA9PT0gJ2xlc3MnKSAmJiBjc3NGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0ZpbGVzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKGZpbGVfdHlwZSA9PT0gJ2h0bWwnIHx8IGZpbGVfdHlwZSA9PT0gJ2h0bScpICYmIHRlbXBsYXRlc0ZpbGVzLmluZGV4T2YocGF0aCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRmlsZXMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZigoZmlsZV90eXBlID09PSAnanMnKSB8fCBqc0ZpbGVzLmluZGV4T2YocGF0aCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNGaWxlcy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuXyRsb2cuZXJyb3IoJ0ZpbGUgdHlwZSBpcyBub3QgdmFsaWQuICcgKyBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2FjaGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhcmFtcy5maWxlcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocGFyYW1zLmZpbGVzLCBwYXRoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjc3NGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjc3NEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5jc3NMb2FkZXIoY3NzRmlsZXMsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUuY3NzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuXyRsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NEZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNzc0RlZmVycmVkLnByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHRlbXBsYXRlc0ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlc0RlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRlbXBsYXRlc0xvYWRlcih0ZW1wbGF0ZXNGaWxlcywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzRGVmaW5lZChlcnIpICYmICRkZWxlZ2F0ZS50ZW1wbGF0ZXNMb2FkZXIuaGFzT3duUHJvcGVydHkoJ29jTGF6eUxvYWRMb2FkZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlc0RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGVtcGxhdGVzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoanNGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqc0RlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLmpzTG9hZGVyKGpzRmlsZXMsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUuanNMb2FkZXIuaGFzT3duUHJvcGVydHkoJ29jTGF6eUxvYWRMb2FkZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGpzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllICYmIHBhcmFtcy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gc3VjY2VzcygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKHByb21pc2VzKS5maW5hbGx5KGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRvZ2dsZVdhdGNoKGZhbHNlKTsgLy8gc3RvcCB3YXRjaGluZyBhbmd1bGFyLm1vZHVsZSBjYWxsc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkIGEgbW9kdWxlIG9yIGEgbGlzdCBvZiBtb2R1bGVzIGludG8gQW5ndWxhclxuICAgICAgICAgICAgICogQHBhcmFtIG1vZHVsZSBNaXhlZCB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGEgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGFuIGFycmF5IG9mIGVpdGhlclxuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtcyBPYmplY3Qgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICogQHJldHVybnMgcHJvbWlzZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAkZGVsZWdhdGUubG9hZCA9IGZ1bmN0aW9uKG1vZHVsZSwgcGFyYW1zID0ge30pIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkTGlzdCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXG4gICAgICAgICAgICAgICAgICAgIGVyclRleHQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBtb2R1bGUgaXMgYW4gYXJyYXksIGJyZWFrIGl0IGRvd25cbiAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN1Ym1pdCBlYWNoIGVudHJ5IGFzIGEgc2luZ2xlIG1vZHVsZVxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobW9kdWxlLCBmdW5jdGlvbihtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZExpc3QucHVzaChzZWxmLmxvYWQobSwgcGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugb25jZSBldmVyeXRoaW5nIGhhcyBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgJHEuYWxsKGRlZmVycmVkTGlzdCkudGhlbihmdW5jdGlvbiBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgb3IgU2V0IGEgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCB3YXMgcGFzc2VkIGluXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogW21vZHVsZV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoYW5ndWxhci5pc09iamVjdChtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2Uge3R5cGU6ICdqcycsIHBhdGg6IGxhenlMb2FkVXJsICsgJ3Rlc3RNb2R1bGUuZmFrZWpzJ31cbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQobW9kdWxlLnBhdGgpICYmIGFuZ3VsYXIuaXNEZWZpbmVkKG1vZHVsZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBbbW9kdWxlXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuc2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBzZWxmLl9nZXRNb2R1bGVOYW1lKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGVyclRleHQgPSAnTW9kdWxlIFwiJyArIChtb2R1bGVOYW1lIHx8ICd1bmtub3duJykgKyAnXCIgaXMgbm90IGNvbmZpZ3VyZWQsIGNhbm5vdCBsb2FkLic7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnJUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihlcnJUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoY29uZmlnLnRlbXBsYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1VuZGVmaW5lZChjb25maWcuZmlsZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzU3RyaW5nKGNvbmZpZy50ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmlsZXMucHVzaChjb25maWcudGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGFuZ3VsYXIuaXNBcnJheShjb25maWcudGVtcGxhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbGVzLmNvbmNhdChjb25maWcudGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsUGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgYW5ndWxhci5leHRlbmQobG9jYWxQYXJhbXMsIHBhcmFtcywgY29uZmlnKTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIHNvbWVvbmUgdXNlZCBhbiBleHRlcm5hbCBsb2FkZXIgYW5kIGNhbGxlZCB0aGUgbG9hZCBmdW5jdGlvbiB3aXRoIGp1c3QgdGhlIG1vZHVsZSBuYW1lXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1VuZGVmaW5lZChjb25maWcuZmlsZXMpICYmIGFuZ3VsYXIuaXNEZWZpbmVkKGNvbmZpZy5uYW1lKSAmJiAkZGVsZWdhdGUubW9kdWxlRXhpc3RzKGNvbmZpZy5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRlbGVnYXRlLmluamVjdChjb25maWcubmFtZSwgbG9jYWxQYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5maWxlc0xvYWRlcihjb25maWcsIGxvY2FsUGFyYW1zKS50aGVuKGZ1bmN0aW9uIHN1Y2Nlc3MoKSB7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5pbmplY3QobnVsbCwgbG9jYWxQYXJhbXMpLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIGVycm9yKGVycikge1xuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBwYXRjaGVkIHNlcnZpY2VcbiAgICAgICAgICAgIHJldHVybiAkZGVsZWdhdGU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KShhbmd1bGFyKTtcbiJdfQ==