This is the repository of the Dart programming language and its associated
tools, libraries, and samples.

For license information, please see LICENSE.

You can find more about Dart online at dartlang.org or code.google.com/p/dart.

Here's a brief guide to what's in here:

compiler/      Dart static analyzer.
editor/        Eclipse-based standalone Dart IDE.
lib/           Libraries that ship with the Dart runtime (core, html, etc.).
pkg/           Packages that are not shipped with the core runtime.
runtime/       Dart VM and code for running it as a standalone app.
samples/       Sample Dart programs. 
tests/         Automated tests.
third_party/   External dependencies.
tools/         Build scripts, text editor support files, etc.
utils/         Utilities for Dart applications.
