Exiting early from build is cleaner. LGRP_APP should be private to the module.

Some libraries can depend on other libs, and trying to handle that via the needsextract flag was getting bad - it was overloading the purpose and meaning, and having a flag in the first place is bad enough, adding more wasn't a good idea to me.
However the exit command has the /B flag which allow it to work like exit in UNIX shells: just exit the script, not the whole world.  This is what I wanted in the first place!

There's no need for any other module to see that constant.
Split off version statement.

This way the version line comes AFTER the greeting.
Add scope statements to contract terms.

It's nice to have more information than a line number sometimes.

Note that the scope statement is before the assert: if it's put after, like often used in the Exception Safety docs, it'll never be executed as the assert drops first.
Make error reporting clearer about what actually was wrong.

Scope calls stack up, useful in certain circumstances, but in this case only caused confusion.  Better to narrow the scope a mite so that one error report goes to one block of asserts.
Downloaded tiles were corrupted due to wrong command usage.

Using write() with get() is semi-ok for text files, but for binary data, lots of mess happens.

Added a unit test to catch that class of error, and which will also catch format errors and changes, and corrected the problem.