whole_func_string: function scanDir(rootDir, dir, resource, doNotCopy, callback) {
              // Get the list of files
              fs.readdir(dir, function(err, files) {
                if (err) {
                  callback(err);
                  return;
                }
  
                // and process each one
                async.forEach(files,
                  function(file, callback) {
                    var absFile = path.join(dir, file);
                    fs.stat(absFile, function(err, stat) {
                      if (err) {
                        callback(err);
                        return;
                      }
  
                      // Directory? recurse
                      if (stat.isDirectory()) {
                        scanDir(rootDir, absFile, resource, doNotCopy, callback);
                      } else {
                        var relFile = absFile.substring(rootDir.length + 1).replace(/\\/g, "/");
                        var fileInfo = resources[relFile];
                        delete unconfirmed[relFile];
                        if (!fileInfo) {
                          fileInfo = resources[relFile] = {}; 
                        }
                        fileInfo.doNotCopy = doNotCopy;
                        fileInfo.resource = resource;
                        t.__librariesByResourceUri[relFile] = library;
                        var relDir = dir.substring(rootDir.length + 1).replace(/\\/g, "/");
                        t.__librariesByResourceFolderUri[relDir] = library;
                        var tmp = "";
                        relDir.split("/").forEach(seg => {
                          if (tmp.length) {
                            tmp += "/"; 
                          }
                          tmp += seg;
                          t.__librariesByResourceFolderUri[tmp] = library; 
                        });
  
                        var handlers = t.__handlers.filter(handler => handler.matches(absFile));
                        if (!handlers.length) {
                          callback();
                          return;
                        }
  
                        if (handlers.some(handler => handler.needsCompile(absFile, fileInfo, stat))) {
                          fileInfo.mtime = stat.mtime;
                          tasks.push({
                            fileInfo: fileInfo,
                            absFile: absFile,
                            library: library,
                            handlers: handlers
                          });
                        }
                        callback();
                      }
                    });
                  },
                  callback);
              });
            }
func_code_string: function scanDir(rootDir, dir, resource, doNotCopy, callback) {
              // Get the list of files
              fs.readdir(dir, function(err, files) {
                if (err) {
                  callback(err);
                  return;
                }
  
                // and process each one
                async.forEach(files,
                  function(file, callback) {
                    var absFile = path.join(dir, file);
                    fs.stat(absFile, function(err, stat) {
                      if (err) {
                        callback(err);
                        return;
                      }
  
                      // Directory? recurse
                      if (stat.isDirectory()) {
                        scanDir(rootDir, absFile, resource, doNotCopy, callback);
                      } else {
                        var relFile = absFile.substring(rootDir.length + 1).replace(/\\/g, "/");
                        var fileInfo = resources[relFile];
                        delete unconfirmed[relFile];
                        if (!fileInfo) {
                          fileInfo = resources[relFile] = {}; 
                        }
                        fileInfo.doNotCopy = doNotCopy;
                        fileInfo.resource = resource;
                        t.__librariesByResourceUri[relFile] = library;
                        var relDir = dir.substring(rootDir.length + 1).replace(/\\/g, "/");
                        t.__librariesByResourceFolderUri[relDir] = library;
                        var tmp = "";
                        relDir.split("/").forEach(seg => {
                          if (tmp.length) {
                            tmp += "/"; 
                          }
                          tmp += seg;
                          t.__librariesByResourceFolderUri[tmp] = library; 
                        });
  
                        var handlers = t.__handlers.filter(handler => handler.matches(absFile));
                        if (!handlers.length) {
                          callback();
                          return;
                        }
  
                        if (handlers.some(handler => handler.needsCompile(absFile, fileInfo, stat))) {
                          fileInfo.mtime = stat.mtime;
                          tasks.push({
                            fileInfo: fileInfo,
                            absFile: absFile,
                            library: library,
                            handlers: handlers
                          });
                        }
                        callback();
                      }
                    });
                  },
                  callback);
              });
            }
func_documentation_string: Scans a folder, recursively, looking for resource files