Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes
rospack::Rosstackage Class Reference

The base class for package/stack ("stackage") crawlers. Users of the library should use the functionality provided here through one of the derived classes, Rosstack or Rospack. More...

#include <rospack.h>

Inheritance diagram for rospack::Rosstackage:
Inheritance graph
[legend]

List of all members.

Public Member Functions

void _rosdeps (Stackage *stackage, std::set< std::string > &rosdeps, const char *tag_name)
bool contains (const std::string &name, std::string &stack, std::string &path)
 Find the stack that contains a package.
bool contents (const std::string &name, std::set< std::string > &packages)
 Compute the packages that are contained in a stack.
bool cpp_exports (const std::string &name, const std::string &type, const std::string &attrib, bool deps_only, std::vector< std::pair< std::string, bool > > &flags)
 Compute cpp exports declared in a package and its dependencies. Used by rosbuild.
void crawl (std::vector< std::string > search_path, bool force)
 Crawl the filesystem, accumulating a database of stackages. May read results from a cache file instead of crawling. This method should be called before any making any queries (find, list, etc.).
bool deps (const std::string &name, bool direct, std::vector< std::string > &deps)
 Compute dependencies of a stackage (i.e., stackages that this stackages depends on).
bool depsIndent (const std::string &name, bool direct, std::vector< std::string > &deps)
 Generate indented list of a stackage's dependencies, including duplicates. Intended for visual debugging of dependency structures.
bool depsManifests (const std::string &name, bool direct, std::vector< std::string > &manifests)
 List the manifests of a stackage's dependencies. Used by rosbuild.
bool depsMsgSrv (const std::string &name, bool direct, std::vector< std::string > &gens)
 List the marker files in a packages's dependencies that indicate that those packages contain auto-generated message and/or service code. Used by rosbuild.
bool depsOn (const std::string &name, bool direct, std::vector< std::string > &deps)
 Compute reverse dependencies of a stackage (i.e., stackages that depend on this stackage). Forces crawl.
bool depsWhy (const std::string &from, const std::string &to, std::string &output)
 Compute all dependency chains from one stackage to another. Intended for visual debugging of dependency structures.
bool exports (const std::string &name, const std::string &lang, const std::string &attrib, bool deps_only, std::vector< std::string > &flags)
 Compute exports declared in a package and its dependencies. Used by rosbuild.
bool exports_dry_package (Stackage *stackage, const std::string &lang, const std::string &attrib, std::vector< std::string > &flags)
 Compute exports declared in a dry package.
bool find (const std::string &name, std::string &path)
 Look for a stackage.
const std::string & getName ()
 Get the name of the tool that's in use (e.g., "rospack" or "rosstack")
bool getSearchPathFromEnv (std::vector< std::string > &sp)
 Helper method to construct a directory search path by looking at relevant environment variables. The value of ROS_ROOT goes first, followed by each element of a colon-separated ROS_PACKAGE_PATH.
bool inStackage (std::string &name)
 Is the current working directory a stackage?
void list (std::set< std::pair< std::string, std::string > > &list)
 List names and paths of all stackages.
void listDuplicates (std::vector< std::string > &dups)
 Identify duplicate stackages. Forces crawl.
void listDuplicatesWithPaths (std::map< std::string, std::vector< std::string > > &dups)
 Identify duplicate stackages and provide their paths. Forces crawl.
void logError (const std::string &msg, bool append_errno=false)
 Log a error (usually goes to stderr).
void logWarn (const std::string &msg, bool append_errno=false)
 Log a warning (usually goes to stderr).
bool plugins (const std::string &name, const std::string &attrib, const std::string &top, std::vector< std::string > &flags)
 Compute exported plugins declared in packages that depend on a package. Forces crawl. Used by rosbuild and roslib.
bool profile (const std::vector< std::string > &search_path, bool zombie_only, int length, std::vector< std::string > &dirs)
 Report on time taken to crawl for stackages. Intended for use in debugging misconfigured stackage trees. Forces crawl.
bool reorder_paths (const std::string &paths, std::string &reordered)
 Reorder the paths according to the workspace chaining.
bool rosdeps (const std::string &name, bool direct, std::set< std::string > &rosdeps)
 Compute rosdep entries that are declared in manifest of a package and its dependencies. Used by rosmake.
void setQuiet (bool quiet)
 Control warning and error console output.
virtual const char * usage ()
 Usage string, to be overridden by derived classes.
bool vcs (const std::string &name, bool direct, std::vector< std::string > &vcs)
 Compute vcs entries that are declared in manifest of a package and its dependencies. Was used by Hudson build scripts; might not be needed.
virtual ~Rosstackage ()
 Destructor.

Protected Member Functions

 Rosstackage (const std::string &manifest_name, const std::string &cache_name, const std::string &name, const std::string &tag)
 Constructor, only used by derived classes.

Private Member Functions

void addStackage (const std::string &path)
void computeDeps (Stackage *stackage, bool ignore_errors=false, bool ignore_missing=false)
void computeDepsInternal (Stackage *stackage, bool ignore_errors, const std::string &depend_tag, bool ignore_missing=false)
void crawlDetail (const std::string &path, bool force, int depth, bool collect_profile_data, std::vector< DirectoryCrawlRecord * > &profile_data, std::tr1::unordered_set< std::string > &profile_hash)
bool depsDetail (const std::string &name, bool direct, std::vector< Stackage * > &deps)
bool depsOnDetail (const std::string &name, bool direct, std::vector< Stackage * > &deps, bool ignore_missing=false)
void depsWhyDetail (Stackage *from, Stackage *to, std::list< std::list< Stackage * > > &acc_list)
bool expandExportString (Stackage *stackage, const std::string &instring, std::string &outstring)
StackagefindWithRecrawl (const std::string &name)
void gatherDeps (Stackage *stackage, bool direct, traversal_order_t order, std::vector< Stackage * > &deps, bool no_recursion_on_wet=false)
void gatherDepsFull (Stackage *stackage, bool direct, traversal_order_t order, int depth, std::tr1::unordered_set< Stackage * > &deps_hash, std::vector< Stackage * > &deps, bool get_indented_deps, std::vector< std::string > &indented_deps, bool no_recursion_on_wet=false)
std::string getCachePath ()
void initPython ()
bool isStackage (const std::string &path)
bool isSysPackage (const std::string &pkgname)
void loadManifest (Stackage *stackage)
void log (const std::string &level, const std::string &msg, bool append_errno)
bool readCache ()
FILE * validateCache ()
void writeCache ()

Private Attributes

std::string cache_name_
bool crawled_
std::tr1::unordered_map
< std::string, std::vector
< std::string > > 
dups_
std::string manifest_name_
std::string name_
bool quiet_
std::vector< std::string > search_paths_
std::tr1::unordered_map
< std::string, Stackage * > 
stackages_
std::string tag_

Detailed Description

The base class for package/stack ("stackage") crawlers. Users of the library should use the functionality provided here through one of the derived classes, Rosstack or Rospack.

Definition at line 141 of file rospack.h.


Constructor & Destructor Documentation

rospack::Rosstackage::Rosstackage ( const std::string &  manifest_name,
const std::string &  cache_name,
const std::string &  name,
const std::string &  tag 
) [protected]

Constructor, only used by derived classes.

Parameters:
manifest_nameWhat the manifest is called (e.g., "manifest.xml or stack.xml")
cache_nameWhat the cache is called (e.g., "rospack_cache" or "rosstack_cache")
nameName of the tool we're building (e.g., "rospack" or "rosstack")
tagName of the attribute we look for in a "depend" tag in a manifest (e.g., "package" or "stack")

Definition at line 229 of file rospack.cpp.

Destructor.

Definition at line 2246 of file rospack.cpp.


Member Function Documentation

void rospack::Rosstackage::_rosdeps ( Stackage stackage,
std::set< std::string > &  rosdeps,
const char *  tag_name 
)

Definition at line 746 of file rospack.cpp.

void rospack::Rosstackage::addStackage ( const std::string &  path) [private]

Definition at line 1394 of file rospack.cpp.

void rospack::Rosstackage::computeDeps ( Stackage stackage,
bool  ignore_errors = false,
bool  ignore_missing = false 
) [private]

Definition at line 1575 of file rospack.cpp.

void rospack::Rosstackage::computeDepsInternal ( Stackage stackage,
bool  ignore_errors,
const std::string &  depend_tag,
bool  ignore_missing = false 
) [private]

Definition at line 1609 of file rospack.cpp.

bool rospack::Rosstackage::contains ( const std::string &  name,
std::string &  stack,
std::string &  path 
)

Find the stack that contains a package.

Parameters:
nameThe package to work on.
stackIf the containing stack is found, its name is written here.
pathIf the containing stack is found, its absolute path is written here.
Returns:
True if the containing stack could be found, false otherwise.

Definition at line 486 of file rospack.cpp.

bool rospack::Rosstackage::contents ( const std::string &  name,
std::set< std::string > &  packages 
)

Compute the packages that are contained in a stack.

Parameters:
nameThe stack to work on.
packagesThe stack's constituent packages are written here.
Returns:
True if the contents could be computed, false otherwise.

Definition at line 460 of file rospack.cpp.

bool rospack::Rosstackage::cpp_exports ( const std::string &  name,
const std::string &  type,
const std::string &  attrib,
bool  deps_only,
std::vector< std::pair< std::string, bool > > &  flags 
)

Compute cpp exports declared in a package and its dependencies. Used by rosbuild.

Parameters:
nameThe package to work on.
typeThe option to pass to pkg-config for wet packages.
attribThe value of the 'attrib' attribute to search for.
deps_onlyIf true, then only return information from the pacakge's dependencies; if false, then also include the package's own export information.
flagsThe pairs of export flags and is-wet are written here.
Returns:
True if the flags were computed, false otherwise.

Definition at line 821 of file rospack.cpp.

void rospack::Rosstackage::crawl ( std::vector< std::string >  search_path,
bool  force 
)

Crawl the filesystem, accumulating a database of stackages. May read results from a cache file instead of crawling. This method should be called before any making any queries (find, list, etc.).

Parameters:
search_pathList of directories to crawl, in precenence order. Directories should be absolute paths. It's passed by value to allow callers (e.g., find()) to safely pass in search_paths_.
forceIf true, then crawl even if the cache looks valid

Definition at line 344 of file rospack.cpp.

void rospack::Rosstackage::crawlDetail ( const std::string &  path,
bool  force,
int  depth,
bool  collect_profile_data,
std::vector< DirectoryCrawlRecord * > &  profile_data,
std::tr1::unordered_set< std::string > &  profile_hash 
) [private]

Definition at line 1444 of file rospack.cpp.

bool rospack::Rosstackage::deps ( const std::string &  name,
bool  direct,
std::vector< std::string > &  deps 
)

Compute dependencies of a stackage (i.e., stackages that this stackages depends on).

Parameters:
nameThe stackage to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
depsIf dependencies are computed, then they're written here.
Returns:
True if dependencies were computed, false otherwise.

Definition at line 566 of file rospack.cpp.

bool rospack::Rosstackage::depsDetail ( const std::string &  name,
bool  direct,
std::vector< Stackage * > &  deps 
) [private]

Definition at line 1235 of file rospack.cpp.

bool rospack::Rosstackage::depsIndent ( const std::string &  name,
bool  direct,
std::vector< std::string > &  deps 
)

Generate indented list of a stackage's dependencies, including duplicates. Intended for visual debugging of dependency structures.

Parameters:
nameThe stackage to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
depsList of the stackage's dependencies, with leading spaces to indicate depth, is written here. Print this list to console, with newlines separating each element. Example output:
roscpp_traits
  cpp_common
cpp_common
rostime
  cpp_common
Returns:
True if the indented dependencies were computed, false otherwise.

Definition at line 605 of file rospack.cpp.

bool rospack::Rosstackage::depsManifests ( const std::string &  name,
bool  direct,
std::vector< std::string > &  manifests 
)

List the manifests of a stackage's dependencies. Used by rosbuild.

Parameters:
nameThe stackage to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
manifestsThe list of absolute paths to manifests of stackages that the given stackage depends on is written here.
Returns:
True if the manifest list was computed, false otherwise.

Definition at line 674 of file rospack.cpp.

bool rospack::Rosstackage::depsMsgSrv ( const std::string &  name,
bool  direct,
std::vector< std::string > &  gens 
)

List the marker files in a packages's dependencies that indicate that those packages contain auto-generated message and/or service code. Used by rosbuild.

Parameters:
nameThe package to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
gensThe list of absolute paths to marker files (e.g., "/opt/ros/electric/stacks/ros_comm/messages/std_msgs/msg_gen/generated") is written here.
Returns:
True if the list of files was generated, false otherwise.

Definition at line 1163 of file rospack.cpp.

bool rospack::Rosstackage::depsOn ( const std::string &  name,
bool  direct,
std::vector< std::string > &  deps 
)

Compute reverse dependencies of a stackage (i.e., stackages that depend on this stackage). Forces crawl.

Parameters:
nameThe stackage to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
depsIf dependencies are computed, then they're written here.
Returns:
True if dependencies were computed, false otherwise.

Definition at line 591 of file rospack.cpp.

bool rospack::Rosstackage::depsOnDetail ( const std::string &  name,
bool  direct,
std::vector< Stackage * > &  deps,
bool  ignore_missing = false 
) [private]

Definition at line 1297 of file rospack.cpp.

bool rospack::Rosstackage::depsWhy ( const std::string &  from,
const std::string &  to,
std::string &  output 
)

Compute all dependency chains from one stackage to another. Intended for visual debugging of dependency structures.

Parameters:
fromThe stackage that depends on.
toThe stackage that is depended on.
outputA list of dependency chains. Print this list to console, with newlines separating each element. Example output:
Dependency chains from roscpp to roslib:
* roscpp -> roslib
* roscpp -> std_msgs -> roslib
* roscpp -> rosgraph_msgs -> std_msgs -> roslib
Returns:
True if the dependency chains were computed, false otherwise.

Definition at line 632 of file rospack.cpp.

void rospack::Rosstackage::depsWhyDetail ( Stackage from,
Stackage to,
std::list< std::list< Stackage * > > &  acc_list 
) [private]

Definition at line 1265 of file rospack.cpp.

bool rospack::Rosstackage::expandExportString ( Stackage stackage,
const std::string &  instring,
std::string &  outstring 
) [private]

Definition at line 2157 of file rospack.cpp.

bool rospack::Rosstackage::exports ( const std::string &  name,
const std::string &  lang,
const std::string &  attrib,
bool  deps_only,
std::vector< std::string > &  flags 
)

Compute exports declared in a package and its dependencies. Used by rosbuild.

Parameters:
nameThe package to work on.
langThe value of the 'lang' attribute to search for.
attribThe value of the 'attrib' attribute to search for.
deps_onlyIf true, then only return information from the pacakge's dependencies; if false, then also include the package's own export information.
flagsThe accumulated flags are written here.
Returns:
True if the flags were computed, false otherwise.

Definition at line 996 of file rospack.cpp.

bool rospack::Rosstackage::exports_dry_package ( Stackage stackage,
const std::string &  lang,
const std::string &  attrib,
std::vector< std::string > &  flags 
)

Compute exports declared in a dry package.

Parameters:
nameThe package to work on.
langThe value of the 'lang' attribute to search for.
attribThe value of the 'attrib' attribute to search for.
flagsThe accumulated flags are written here.
Returns:
True if the flags were computed, false otherwise.

Definition at line 1029 of file rospack.cpp.

bool rospack::Rosstackage::find ( const std::string &  name,
std::string &  path 
)

Look for a stackage.

Parameters:
nameThe stackage to look for.
pathIf found, the absolute path to the stackage is written here.
Returns:
True if the stackage is found, false otherwise.

Definition at line 447 of file rospack.cpp.

Stackage * rospack::Rosstackage::findWithRecrawl ( const std::string &  name) [private]

Definition at line 1218 of file rospack.cpp.

void rospack::Rosstackage::gatherDeps ( Stackage stackage,
bool  direct,
traversal_order_t  order,
std::vector< Stackage * > &  deps,
bool  no_recursion_on_wet = false 
) [private]

Definition at line 1793 of file rospack.cpp.

void rospack::Rosstackage::gatherDepsFull ( Stackage stackage,
bool  direct,
traversal_order_t  order,
int  depth,
std::tr1::unordered_set< Stackage * > &  deps_hash,
std::vector< Stackage * > &  deps,
bool  get_indented_deps,
std::vector< std::string > &  indented_deps,
bool  no_recursion_on_wet = false 
) [private]

Definition at line 1891 of file rospack.cpp.

std::string rospack::Rosstackage::getCachePath ( ) [private]

Definition at line 1912 of file rospack.cpp.

const std::string& rospack::Rosstackage::getName ( ) [inline]

Get the name of the tool that's in use (e.g., "rospack" or "rosstack")

Returns:
The name of the tool.

Definition at line 250 of file rospack.h.

bool rospack::Rosstackage::getSearchPathFromEnv ( std::vector< std::string > &  sp)

Helper method to construct a directory search path by looking at relevant environment variables. The value of ROS_ROOT goes first, followed by each element of a colon-separated ROS_PACKAGE_PATH.

Parameters:
spThe computed search path is written here.
Returns:
True if a search path was computed, false otherwise (e.g., ROS_ROOT not set).

defined(WIN32)

Definition at line 255 of file rospack.cpp.

Definition at line 1673 of file rospack.cpp.

bool rospack::Rosstackage::inStackage ( std::string &  name)

Is the current working directory a stackage?

Parameters:
nameIf in a stackage, then the stackage's name is written here.
Returns:
True if the current working directory contains a manifest file

Definition at line 411 of file rospack.cpp.

bool rospack::Rosstackage::isStackage ( const std::string &  path) [private]

Definition at line 306 of file rospack.cpp.

bool rospack::Rosstackage::isSysPackage ( const std::string &  pkgname) [private]

Definition at line 1684 of file rospack.cpp.

void rospack::Rosstackage::list ( std::set< std::pair< std::string, std::string > > &  list)

List names and paths of all stackages.

Parameters:
listPairs of (name,path) are written here.

Definition at line 518 of file rospack.cpp.

void rospack::Rosstackage::listDuplicates ( std::vector< std::string > &  dups)

Identify duplicate stackages. Forces crawl.

Parameters:
dupsNames of stackages that are found more than once while crawling are written here.

Definition at line 532 of file rospack.cpp.

void rospack::Rosstackage::listDuplicatesWithPaths ( std::map< std::string, std::vector< std::string > > &  dups)

Identify duplicate stackages and provide their paths. Forces crawl.

Parameters:
dupsNames of stackages that are found more than once while crawling are mapped to the found paths of these packages.

Definition at line 546 of file rospack.cpp.

void rospack::Rosstackage::loadManifest ( Stackage stackage) [private]

Definition at line 1560 of file rospack.cpp.

void rospack::Rosstackage::log ( const std::string &  level,
const std::string &  msg,
bool  append_errno 
) [private]

Definition at line 1203 of file rospack.cpp.

void rospack::Rosstackage::logError ( const std::string &  msg,
bool  append_errno = false 
)

Log a error (usually goes to stderr).

Parameters:
msgThe error.
append_errnoIf true, then append a colon, a space, and the return from 'sterror(errno)'.

Definition at line 248 of file rospack.cpp.

void rospack::Rosstackage::logWarn ( const std::string &  msg,
bool  append_errno = false 
)

Log a warning (usually goes to stderr).

Parameters:
msgThe warning.
append_errnoIf true, then append a colon, a space, and the return from 'sterror(errno)'.

Definition at line 242 of file rospack.cpp.

bool rospack::Rosstackage::plugins ( const std::string &  name,
const std::string &  attrib,
const std::string &  top,
std::vector< std::string > &  flags 
)

Compute exported plugins declared in packages that depend on a package. Forces crawl. Used by rosbuild and roslib.

Parameters:
nameThe package to work on.
attribThe value of the 'attrib' attribute to search for.
topIf non-empty, then limit the reverse dependency search to packages that 'top' depends on. Otherwise, examine all packages that depend on 'name'.
flagsThe accumulated flags are written here.
Returns:
True if the flags were computed, false otherwise.

Definition at line 1097 of file rospack.cpp.

bool rospack::Rosstackage::profile ( const std::vector< std::string > &  search_path,
bool  zombie_only,
int  length,
std::vector< std::string > &  dirs 
)

Report on time taken to crawl for stackages. Intended for use in debugging misconfigured stackage trees. Forces crawl.

Parameters:
search_pathDirectories to search; passed to crawl().
zombie_onlyIf false, then produce formatted output, with timing information. Example output:
Full tree crawl took 0.014954 seconds.
Directories marked with (*) contain no manifest.  You may
want to delete these directories.
To get just of list of directories without manifests,
re-run the profile with --zombie-only
-------------------------------------------------------------
0.013423   /opt/ros/electric/stacks
0.002989   /opt/ros/electric/stacks/ros_comm
If true, then produce a list of absolute paths that contain no stackages ("zombies"); these directories can likely be safely deleted. Example output:
/opt/ros/electric/stacks/pr2_controllers/trajectory_msgs
/opt/ros/electric/stacks/pr2_controllers/trajectory_msgs/msg
lengthLimit on how many directories to include in report (ordered in decreasing order of time taken to crawl).
dirsProfile output. Print this list to console, with newlines separating each element.

Definition at line 1334 of file rospack.cpp.

bool rospack::Rosstackage::readCache ( ) [private]

Definition at line 1960 of file rospack.cpp.

bool rospack::Rosstackage::reorder_paths ( const std::string &  paths,
std::string &  reordered 
)

Reorder the paths according to the workspace chaining.

Parameters:
pathsThe paths.
reorderedThe reordered paths are written here.
Returns:
True if the pathswere reordered, false otherwise.

Definition at line 932 of file rospack.cpp.

bool rospack::Rosstackage::rosdeps ( const std::string &  name,
bool  direct,
std::set< std::string > &  rosdeps 
)

Compute rosdep entries that are declared in manifest of a package and its dependencies. Used by rosmake.

Parameters:
nameThe package to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
rosdepsList of rosdep entries found in the package and its dependencies is written here.
Returns:
True if the rosdep list is computed, false otherwise.

Definition at line 699 of file rospack.cpp.

void rospack::Rosstackage::setQuiet ( bool  quiet)

Control warning and error console output.

Parameters:
quietIf true, then don't output any warnings or errors to console. If false, then output warnings and errors to stderr (default behavior).

Definition at line 300 of file rospack.cpp.

virtual const char* rospack::Rosstackage::usage ( ) [inline, virtual]

Usage string, to be overridden by derived classes.

Returns:
Command-line usage statement.

Reimplemented in rospack::Rosstack, and rospack::Rospack.

Definition at line 219 of file rospack.h.

Definition at line 2080 of file rospack.cpp.

bool rospack::Rosstackage::vcs ( const std::string &  name,
bool  direct,
std::vector< std::string > &  vcs 
)

Compute vcs entries that are declared in manifest of a package and its dependencies. Was used by Hudson build scripts; might not be needed.

Parameters:
nameThe package to work on.
directIf true, then compute only direct dependencies. If false, then compute full (including indirect) dependencies.
vcsList of vcs entries found in the package and its dependencies is written here.
Returns:
True if the vcs list is computed, false otherwise.

Definition at line 773 of file rospack.cpp.

Definition at line 1987 of file rospack.cpp.


Member Data Documentation

std::string rospack::Rosstackage::cache_name_ [private]

Definition at line 145 of file rospack.h.

Definition at line 146 of file rospack.h.

std::tr1::unordered_map<std::string, std::vector<std::string> > rospack::Rosstackage::dups_ [private]

Definition at line 151 of file rospack.h.

std::string rospack::Rosstackage::manifest_name_ [private]

Definition at line 144 of file rospack.h.

std::string rospack::Rosstackage::name_ [private]

Definition at line 147 of file rospack.h.

Definition at line 149 of file rospack.h.

std::vector<std::string> rospack::Rosstackage::search_paths_ [private]

Definition at line 150 of file rospack.h.

std::tr1::unordered_map<std::string, Stackage*> rospack::Rosstackage::stackages_ [private]

Definition at line 152 of file rospack.h.

std::string rospack::Rosstackage::tag_ [private]

Definition at line 148 of file rospack.h.


The documentation for this class was generated from the following files:


rospack
Author(s): Brian Gerkey, Morgan Quigley, Dirk Thomas
autogenerated on Fri Aug 28 2015 12:41:42